STM32单片机芯片与内部109 USB DFU 固件升级
介绍了STM32通过硬件BOOT、应用程序进入bootLoader模式,通过STM32CubeProg进行程序下载,且只需hex文件即可。
·
目录
(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

下载完成后板子重新上电就可以看到程序已经成功下载了。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)