STM32/GD32 BootLoader升级 IAP升级

文章详细阐述了STM32在进行IAP(In-ApplicationProgramming)固件升级时,BootLoader如何下载App并跳转执行,以及App启动过程中的中断向量表重定位和栈指针设置。同时讨论了两种不同的BootLoader实现方式,一种需要备份区,另一种则可能导致升级失败后无法运行App。在调试App时,需修改ROM起始位置、中断向量表偏移和堆栈指针设置。
摘要由CSDN通过智能技术生成

前言

如果我们的App 程序起始地址在0x08006000 ,并且App 的中断向量表在起始地址,那么BootLoader 程序下载App 后,为了App 程序能正确运行,开始App 程序的运行后第一步,就要把中断向量表重定位到0x08006000 那里。

跳转到新程序运行

我们的BootLoader下载App程序后,App程序就需要做同样的事情。主要有三个步骤,其中BootLoader程序需要做的是:

  • 跳转到复位向量

App需要做的是:

  • 重定位中断向量表
  • 设置栈指针

 

根据上图分析加入IAP后的起动和运行过程

  1. STM32复位后,还是从0X08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到IAP的main函数,如将IAP看作是一个APP的话,那么此部分和正常起动是一样的。(此步=执行复位中断服务程序+跳转main,即将正常运行的①和②合并了)。
  2.  在执行完IAP以后(固件升级或直接跳转),跳转至APP的复位向量表(APP的复位中断向量起始地址为0X08000004+N+M)。
  3.  取出APP的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至APP的main函数(此步=执行复位中断服务程序+跳转main)
  4.  同样main函数为一个超循环,并且注意到此时STM32的FLASH,在不同位置上,共有两个中断向量表。在main函数执行过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0X08000004中断向量表处,而不是APP程序的中断向量表。
  5.  程序再根据我们设置的中断向量表偏移量,跳转到对应中断源的APP的中断服务程序中,
  6. 在执行完中断服务程序后,程序返回main函数继续运行。

gd32的启动文件:

升级bootloader调试记录

目前boot的实现方式有两种

  1. 一直是boot里面只做文件拷贝、版本对比与跳转。这种方法的好处是不需要在boot中添加通讯协议及相关的通讯功能。但是升级需要外部有一个备份区来进行存储升级数据,占用空间较大,但是升级失败后,依然可以运行之前的app,保证机器能一直有app可以使用。
  2. 另外一种是在boot里面增加通讯功能,让其具备接收数据、并将数据写到指定位置的特性。使用这种方式可以实现不要备份区升级、以此来满足小容量单片机的需求。每次进行升级都会对app区进行擦写。这样就会导致一个问题,当升级失败后,会一直停留在boot等待再一次升级,直到升级成功后,才能去运行app。

升级app调试记录

如果使用了bootloader后需要调试app应用需要做一下操作

1、修改ROM1起始位置及大小

 

2、修改启动文件(.s)中的NVIC中断向量表的偏移。比如,我的app其中地址的偏移为

#define VECT_TAB_OFFSET (uint32_t)0x1E00 /* vector table base offset */

在SystemInit中会用到

3、修改debug的app堆栈指针的偏移,这里使用外部加载ini文件的方式。

文件内容

SP = _RDWORD(0x08001E00); // Setup Stack Pointer

PC = _RDWORD(0x08001E04); // Setup Program Counter

 

4、到这里你就可以开心的调试自己的代码了。

 

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
好的,关于STM32 IAP串口升级bootloader程序案例,我可以给您提供一些参考信息。 首先,IAP(In-Application Programming)是指在应用程序运行时,通过编程方式对内部Flash进行编程的技术。而bootloader程序则是一种特殊的应用程序,它可以在系统启动时运行,用于升级或者恢复系统。 在STM32中使用IAP实现串口升级的过程一般如下: 1. 编写bootloader程序,该程序需要实现串口通信、Flash编程、跳转等功能。 2. 在应用程序中加入升级代码,当需要升级时,将控制权交给bootloader程序。 3. bootloader程序通过串口接收新固件数据,将数据写入Flash。 4. 升级完成后,跳转回应用程序,完成升级。 以下是一个简单的bootloader程序的示例代码,仅供参考: ``` #include "stm32f10x.h" #define APP_ADDRESS 0x08008000 typedef void (*pFunction)(void); int main(void) { // 初始化串口、GPIO等 // ... // 判断是否需要升级 if (need_upgrade()) { // 进入升级模式 upgrade_mode(); } else { // 跳转到应用程序 jump_to_app(); } while (1) { // 等待升级或者运行应用程序 } } void upgrade_mode(void) { // 初始化Flash编程 // ... // 接收新固件数据,并写入Flash while (1) { // 接收数据 // ... // 写入Flash // ... if (upgrade_complete()) { // 升级完成,跳转到应用程序 jump_to_app(); } } } void jump_to_app(void) { pFunction app_entry = (pFunction)APP_ADDRESS; __set_MSP(*(__IO uint32_t*)APP_ADDRESS); app_entry(); } ``` 需要注意的是,实现IAP串口升级需要对STM32的Flash编程、串口通信、跳转等方面有一定的了解,同时还需要考虑固件的安全性和稳定性,因此建议在实际应用中谨慎使用。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流浪_彩虹

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

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

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

打赏作者

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

抵扣说明:

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

余额充值