第69章 STM32H7的系统bootloader之串口IAP固件升级
本章节为大家讲解使用系统bootloader做程序升级的方法,即使不依赖外部boot引脚也可以方便升级。
IAP的全称是In Application Programming,即在线应用编程。
69.1 初学者重要提示
69.2 跳转到系统bootloader的程序设计
69.3 STM32CubeProg的安装说明
69.3 STM32CubeProg的程序下载说明
69.4 串口方式系统bootloader驱动移植和使用
69.6 实验例程设计框架
69.7 实验例程说明(MDK)
69.8 实验例程说明(IAR)
69.9 总结
69.1 初学者重要提示
学习本章节前,务必优先学习第67章。
特别注意STM32H7的系统BootLoader地址并不是0x1FFF 0000。
本章节的串口IAP下载软件使用STM32CubeProg,此软件实现了之前的DfuSe,STLINK小软件和Flashloader三合一,并且支持外部EEPROM,NOR Flash,SPI Flash,NAND Flash等烧写,也支持OTA编程。
使用系统bootloader做串口IAP升级时,MicroUSB接口不要接线到电脑端,因为这会导致系统bootloader工作在USB DFU模式,无法再使用串口IAP。
69.2 跳转到系统bootLoader的程序设计
程序设计如下,基本是按照第67章3.2小节的方法进行设计
1. /*2. ******************************************************************************************************
3. * 函 数 名: JumpToBootloader
4. * 功能说明: 跳转到系统BootLoader
5. * 形 参: 无
6. * 返 回 值: 无
7. ******************************************************************************************************
8.*/
9. static void JumpToBootloader(void)10. {11. uint32_t i=0;12. void (*SysMemBootJump)(void); /*声明一个函数指针*/
13. __IO uint32_t BootAddr = 0x1FF09800; /*STM32H7的系统BootLoader地址*/
14.15. /*关闭全局中断*/
16. DISABLE_INT();17.18. /*关闭滴答定时器,复位到默认值*/
19. SysTick->CTRL = 0;20. SysTick->LOAD = 0;21. SysTick->VAL = 0;22.23. /*设置所有时钟到默认状态,使用HSI时钟*/
24. HAL_RCC_DeInit();25.26. /*关闭所有中断,清除所有中断挂起标志*/
27. for (i = 0; i < 8; i++)28. {29. NVIC->ICER[i]=0xFFFFFFFF;30. NVIC->ICPR[i]=0xFFFFFFFF;31. }32.33. /*使能全局中断*/
34. ENABLE_INT();35.36. /*跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址*/
37. SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));38.39. /*设置主堆栈指针*/
40. __set_MSP(*(uint32_t *)BootAddr);41.42. /*在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针*/
43. __set_CONTROL(0);44.45. /*跳转到系统BootLoader*/
46. SysMemBootJump();47.48. /*跳转成功的话,不会执行到这里,用户可以在这里添加代码*/
49. while (1)50. {51.52. }53. }
这里把程序设计中的几个关键地方做个说明:
第12行,声明一个函数指针。
第13行,这个要特别注意,H7的系统Bootloader地址在0x1FF09800。
第19到21行,设置滴答定时器到复位值。
第24行,此函数比较省事,可以方便的设置H7所有时钟到复位值,内部时钟使用HSI。
第27到31行,清除所有中断挂起标志并关闭中断,这里是直接通过一个for循环设置了NVIC所有配置位,共8组。
第37行,将系统bootLoader的中断复位服务程序的入口地址赋给第12行声明的函数,用户执行这个函数时,就会直接跳转过去。
第40行,设置主堆栈指针位置,即系统bootloader的首地址存储的就是栈地址。
第43行,这个设置在RTOS应用程序中比较重要,因为基于Cortex-M内核的RTOS任务堆栈基本都是使用线程堆栈指针PSP。但系统bootLoader使用的是主堆栈指针MSP,所以务必要设置下,同时让M内核工作于特权级。此寄存器的作用:
第46行,跳转到系统bootLoader。
69.3 STM32CubeProg的安装说明
STM32CubeProg的安装比较简单,如果大家的电脑中缺少JAVA环境,会提示安装,按照提示操作即可。
这里特别注意USB DFU驱动的安装,如果大家的电脑上安装了DfuSe软件,那边板子工作在系统bootLoader模式时,电脑端的设备管理器识别出来的标识是这样的:
如果用STM32CubeProg的话,务必要将此驱动删掉,鼠标右击此标识,选择卸载,弹出如下对话框:
卸载完毕后,重启电脑,然后运行STM32CubeProg安装目录里面的STM32Bootloader.bat即可,最后插上设备就可以正常识别了。识别后的标识:
69.4 STM32CubeProg的程序下载说明
这里把两种下载方式都做个说明,一种是设置外部boot引脚进行下载,另一种是设置程序跳转到系统botloader进行下载。<