STM32 IAP 在线升级原理全解析



点击左上角的“关注”,定期更新 STM32 最新资讯,总有你想要的信息!

STM32 IAP 在线升级原理全解析


1. 什么是 IAP?

   IAP(In-Application Programming)是用户自己的程序在运行过程中对 User Flash 部分的区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信接口对产品中的固件程序进行更新升级。

2. 当无 IAP 功能时 STM32 程序的启动过程

在这里插入图片描述

图1 无 IAP 功能时 Flash 的存储分布图

  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 地址处开始的存储空间是同一块物理空间,其内容也就是一样的了。

在这里插入图片描述

图2 0x00000000 地址数据和 0x08000000 地址数据对比图

在这里插入图片描述

图3 BOOT 引脚自举配置

3. 当有 IAP 功能时 STM32 程序的启动过程

在这里插入图片描述

图4 有 IAP 功能时 Flash 的存储分布图

  当 STM32 要实现 IAP 在线升级功能时,需要把 flash 分成 bootload 程序区和应用程序区。我们将 bootload 程序存放在 flash 的起始地址,这样 STM32 上电后就会先执行 bootload 程序。然后我们只需要在 bootload 程序中将程序跳转到应用程序的栈顶地址,则 STM32 就会开始执行应用程序的代码。

4. 在 bootload 层申请的动态内存不释放会影响到应用层吗?

在这里插入图片描述

图5 RAM的存储分布图

  答案是不会。当从 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,谢谢。



--- End ---

你可能还想看:

> STM32 IAP 在线升级项目实例剖析
> 免费的Zigbee抓包神器!比Ubiqua还好用!


文章都看完了,随手点个赞吧~
在这里插入图片描述
↓↓↓ ↓↓↓

  • 17
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesse_嘉伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值