gpt4 book ai didi

bootloader - 在STM32 F072上如何跳转到软件中的bootloader(DFU模式)?

转载 作者:行者123 更新时间:2023-12-01 14:59:40 26 4
gpt4 key购买 nike

STM32 App Note 2606 对此进行了讨论,但没有简单的代码示例。

最佳答案

此答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行测试。该答案仅使用“STM32 标准外设库”。

请注意,验证您是否成功进入引导加载程序模式(DFU 模式)的最佳/最简单方法是在 PA_9 行(USART1_TX)上连接一个 USB-2-UART 转换器(从 Sparkfun 获得一个:http://sfe.io/p9873 15 美元) ) 和 PA_10 (USART1_RX)(不要忘记也接地)。我无法使用 Nucleo USART2 默认连接 (/dev/ttyACM0),因此无法使用外部 USB-2-USART 连接。然后创建一个简单的 C 程序在 USART 连接上写入 0x7F。如果你处于 DFU 模式,它会回复一个字节:0x79。我使用 Ubuntu,所以我的测试程序在 Linux 上编译和运行。

此外,测试引导加载程序模式(也称为 DFU 模式)的最简单方法是将 BOOT0 线跳接到 +3.3V。它们在 Nucleo 上紧挨着。

添加到 main.c main() 例程:

// Our STM32 F072 has:
// 16k SRAM in address 0x2000 0000 - 0x2000 3FFF
*((unsigned long *)0x20003FF0) = 0xDEADBEEF;

// Reset the processor
NVIC_SystemReset();

在Libraries/sysconfig/system_stm32f0xx.c的SystemInit()函数的开头添加一些代码:

// Define our function pointer
void (*SysMemBootJump)(void);

void SystemInit (void)
{
// Check if we should go into bootloader mode.
//
// Set the main stack pointer __set_MSP() to its default value. The default
// value of the main stack pointer is found by looking at the default value
// in the System Memory start address. Do this in IAR View -> Memory. I
// tried this and it showed address: 0x200014A8 which I then tried here.
// The IAR compiler complained that it was out of range. After some
// research, I found the following from "The STM32 Cortex-M0 Programming
// Manual":
// Main Stack Pointer (MSP)(reset value). On reset, the processor
// loads the MSP with the value from address 0x00000000.
//
// So I then looked at the default value at address 0x0 and it was 0x20002250
//
// Note that 0x1fffC800 is "System Memory" start address for STM32 F0xx
//
if ( *((unsigned long *)0x20003FF0) == 0xDEADBEEF ) {
*((unsigned long *)0x20003FF0) = 0xCAFEFEED; // Reset our trigger
__set_MSP(0x20002250);
// 0x1fffC800 is "System Memory" start address for STM32 F0xx
SysMemBootJump = (void (*)(void)) (*((uint32_t *) 0x1fffC804)); // Point the PC to the System Memory reset vector (+4)
SysMemBootJump();
while (1);
}

... // The rest of the vanilla SystemInit() function

创建一个简单的实用程序来查看您是否处于引导加载程序模式(也称为 DFU 模式)。这在 Linux 上编译和运行。确保你的串口正确。它可能是/dev/ttyUSB0,如下所示。

//
// A bare-bones utility: Test if the STM32 is in DFU mode
// (aka bootloader mode, aka firmware update mode).
//
// If it is in DFU mode, you can send it 0x7F over a UART port and it
// will send 0x79 back.
//
// For details, see the STM32 DFU USART spec.
//

#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h> // errno

#define DEFAULT_SERDEVICE "/dev/ttyUSB0"
//#define DEFAULT_SERDEVICE "/dev/ttyACM0"

int main(int argc, char **argv)
{
int fd, cooked_baud = B9600;
char *sername = DEFAULT_SERDEVICE;
struct termios oldsertio, newsertio;
unsigned char mydata[2] = {0};

mydata[0] = 0x7F;
mydata[1] = 0;

/* Not a controlling tty: CTRL-C shouldn't kill us. */
fd = open(sername, O_RDWR | O_NOCTTY);
if ( fd < 0 )
{
perror(sername);
exit(-1);
}

tcgetattr(fd, &oldsertio); /* save current modem settings */

/*
* 8 data, EVEN PARITY, 1 stop bit. Ignore modem control lines. Enable
* receive. Set appropriate baud rate. NO HARDWARE FLOW CONTROL!
*/
newsertio.c_cflag = cooked_baud | CS8 | CLOCAL | CREAD | PARENB;

/* Raw input. Ignore errors and breaks. */
newsertio.c_iflag = IGNBRK | IGNPAR;

/* Raw output. */
newsertio.c_oflag = OPOST;

/* No echo and no signals. */
newsertio.c_lflag = 0;

/* blocking read until 1 char arrives */
newsertio.c_cc[VMIN]=1;
newsertio.c_cc[VTIME]=0;

/* now clean the modem line and activate the settings for modem */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newsertio);

// Here is where the magic happens
write(fd,&mydata[0],1);
int red = read(fd,&mydata[1],1);
if (red < 0) {
fprintf(stderr, "Error: read() failed, errno [%d], strerrer [%s]\n",
errno, strerror(errno));
}

tcsetattr(fd,TCSANOW,&oldsertio);
close(fd);

printf("Read [%d] bytes: [0x%x]\n", red, mydata[1]);

return 0;
}

关于bootloader - 在STM32 F072上如何跳转到软件中的bootloader(DFU模式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28288453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com