目录

一、跳转到系统 bootLoader

二、使用STM32CubeProg 的程序下载

1、设置 boot 引脚跳转到系统 bootLoader

(1)、插入USB线

(2)、按下BOOT按键

(3)、进入bootLoader

2、应用程序进入bootLoader

3、STM32CubeProg 下载程序设置

(1)、选择 USB 方式,点击 Connect 按钮

(2)、添加要下载的 hex 文件,勾选需要设置的选项,点击启动编程


DFU 的全称是 Device Firmware Upgrade,即设备固件升级。

一、跳转到系统 bootLoader

        前文所述,进入bootLoader之前,需要关闭各类定时器、使用HSI时钟,关闭中断,重映射,跳转等操作。

static void JumpToBootloader(void)
{
	uint32_t i=0;
	void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
	__IO uint32_t BootAddr = 0x1FFF0000; /* STM32F4的系统BootLoader地址 */

	/* 关闭全局中断 */
	DISABLE_INT(); 

	/* 关闭滴答定时器,复位到默认值 */
	SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

	/* 设置所有时钟到默认状态,使用HSI时钟 */
	HAL_RCC_DeInit();

	/* 关闭所有中断,清除所有中断挂起标志 */
	for (i = 0; i < 8; i++)
	{
		NVIC->ICER[i]=0xFFFFFFFF;
		NVIC->ICPR[i]=0xFFFFFFFF;
	}	

	/* 使能全局中断 */
	ENABLE_INT();

	/* 设置重映射到系统Flash */
	__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
	
	/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
	SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

	/* 设置主堆栈指针 */
	__set_MSP(*(uint32_t *)BootAddr);
	
	/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
	__set_CONTROL(0);

	/* 跳转到系统BootLoader */
	SysMemBootJump(); 

	/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
	while (1)
	{

	}
}

二、使用STM32CubeProg 的程序下载

1、设置 boot 引脚跳转到系统 bootLoader

(1)、插入USB线

(2)、按下BOOT按键

(3)、进入bootLoader

        板子上电3秒后松手。

2、应用程序进入bootLoader

        想办法执行JumpToBootloader函数即可,例如当某按键按下则进入。

3、STM32CubeProg 下载程序设置

(1)、选择 USB 方式,点击 Connect 按钮

(2)、添加要下载的 hex 文件,勾选需要设置的选项,点击启动编程

  • Start address 选项不填的话, 默认会下载到内部 Flash 的首地址, 保险起见,大家也可以填上首地址 0x0800 0000, 或者其它要下载的地址。
  • Run after programming 选项勾选或者不勾选均可, 因为测试发现 STM32CubeProg 不支持USB DFU 编程后运行。这样特别说一点,如果勾上此选项后,下载完毕程序后,会自动断开连接, 并弹出一些列窗口,最终弹出下面这个窗口:

        弹出这个窗口并不是表示下载失败了,而是下载完成后退出了系统 bootloader

        下载完成后板子重新上电就可以看到程序已经成功下载了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐