点击左上角的
“关注”
,定期更新 STM32 最新资讯,总有你想要的信息!
STM32 IAP 在线升级原理全解析
1. 什么是 IAP?
IAP(In-Application Programming)是用户自己的程序在运行过程中对 User Flash 部分的区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信接口对产品中的固件程序进行更新升级。
2. 当无 IAP 功能时 STM32 程序的启动过程
STM32F4 基于 Cortex-M4 内核。对于基于 Cortex-M3/M4 内核的芯片,复位后固定从 0x00000000 地址处取主堆栈指针(MSP)的值,从 0x00000004 处,取出 PC 的初始值(这个值是复位向量),然后从这个值对应的地址处取出复位中断入口向量,跳转执行复位中断服务程序,当运行完复位中断服务程序后再跳转到 main 函数执行应用程序。
// 中断向量表:
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler // 复位中断入口向量
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
......
// 复位中断服务函数:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main // 执行 main() 函数
BX R0
ENDP
那为什么图 1 显示的栈顶指针是指向 0x08000000 地址呢?
原来 STM32 在 0x00000000 开始的一段地址空间是虚拟的,用户可以通过设置 BOOT[0:1] 引脚状态使其在启动时动态的将另外一段地址空间映射到这部分的地址上去。我们通过配置 BOOT 引脚选择主 flash 的自举模式,将 0x08000000 地址处的存储空间重映射到了 0x00000000 地址处,所以 0x08000000 地址和 0x00000000 地址处开始的存储空间是同一块物理空间,其内容也就是一样的了。
3. 当有 IAP 功能时 STM32 程序的启动过程
当 STM32 要实现 IAP 在线升级功能时,需要把 flash 分成 bootload 程序区和应用程序区。我们将 bootload 程序存放在 flash 的起始地址,这样 STM32 上电后就会先执行 bootload 程序。然后我们只需要在 bootload 程序中将程序跳转到应用程序的栈顶地址,则 STM32 就会开始执行应用程序的代码。
4. 在 bootload 层申请的动态内存不释放会影响到应用层吗?
答案是不会。
当从 bootload 程序跳转到应用程序的起始地址后,应用程序会重新分配和初始化 RAM,所以 bootload 程序在进入应用程序前不需要担心申请的动态内存没有释放会对进入应用程序后产生什么影响的。
5. 在 bootload 层开启的外设会影响应用层吗?
答案是会!
在 bootload 程序开启的外设进入应用程序后是不会自动重置外设的。比如说在 bootload 程序开启了 UART1 外设,在跳转到应用程序后,UART1 依旧是 bootload 程序时的配置。所以在 bootload 程序想进入应用程序前,要先关闭外设中断和重置外设,以免在应用程序中无法正常的开启外设。
6. IAP 在线升级原理
IAP 在线升级的原理很简单,先通过通信接口(串口)连接上位机与 STM32 设备,然后上位机通过传输协议(Ymodem)把升级固件(应用程序 bin 文件)发送给 STM32 设备,STM32 设备收到升级固件后将其烧录进应用程序区的 flash 地址。在烧录完所有升级固件后,再将程序跳转到应用程序的 flash 起始地址,开始执行应用程序的代码。
大家的支持就是我分享技术的动力,希望大家需转载时能附上原作者的博客:https://blog.csdn.net/u012993936,谢谢。
你可能还想看:
> STM32 IAP 在线升级项目实例剖析
> 免费的Zigbee抓包神器!比Ubiqua还好用!
文章都看完了,随手点个赞吧~
↓↓↓ ↓↓↓