STM32 BootLoader原理分析

1、IAP简介

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

        一片STM32芯片的Code(代码)区内一般只有一个用户程序而IAP方案则是将代码划分为两部分,两部分区域各存放一个程序,一个叫bootloader(引导加载程序)另一个user application(用户应用程序)bootloader出厂时固定下来了,在需要变更user application时只需要通过触发bootloader对userapplication擦除和重新写入即可完成用户应用程序的更换。如下图所示:


起始地址为0x08000000,在只有一个程序的情况下,程序的执行流程如下图所示:


STM32有一个中断向量表,这个中断向量表存放在代码开始部分的后4个字节处(即0x08000004),代码开始的4个字节存放的是堆栈栈顶的地址,发生中断后程序通过查找该表得到相应的中断服务程序入口地址,然后再跳到相应的中断服务程序中执行。上电后从0x08000004处取出复位中断向量的地址,然后跳转到复位中断程序的入口(标号所示)执行结束后跳转到main函数中(标号②所示)。在执行main函数的过程中发生中断STM32强制PC指针指回中断向量(标号所示)从中断向量表中找到相应的中断函数入口地址,跳转到相应的中断服务函数(标号所示),执行完中断函数后返回到main函数中来(标号所示)。
在STM32中使用IAP方案,则内置的Flash分配情况大致如下图所示




上电初始程序依然从0x08000004取出复位中断向量地址执行复位中断函数后跳转到IAP的main(标号所示),在IAP的main函数执行完成后强制跳转到0x08000004+N+M处(标号所示),最后跳转到新的main函数中来(标号所示)发生中断请求后,程序跳转到新的中断向量表中取出新的中断函数入口地址,跳转到新的中断服务函数中执行(标号④⑤所示),执行完中断函数后再返回到main函数中来(标号所示)。
对于步骤④⑤网友认为是:“在main执行的过程中如果CPU得到一个中断请求,PC指针强制跳转到地址0x08000004中断向量表处,而不是新的中断向量表,图标号所示程序再根据我们设置的中断向量表偏移量,跳转对应中断源新的中断服务程序如图标号所示”。我对此的理解是:“当发生中断后,程序从0x08000004()处的中断向量表中得到相应的中断服务函数入口地址,继而跳转相应的中断服务程序但是旧的中断向量列表里边存放的是IAP程序中断函数的入口地址,它是如何得到user程序中断函数的入口地址?所以觉得此种说法是错误的。当发生中断时PC指针强制会跳转到0x08000004处”这种说法并没有错,只是忽略了后续的一些知识要点导致这个说法出现矛盾。
对于步骤④⑤我认为的是在main函数的执行过程中,如果CPU得到一个中断请求,PC指针本来应该跳转到0x08000004的中断向量表,由于我们设置中断向量表偏移量为N+M,因此PC指针强制跳转0x08000004+N+M的中断向量表中得到相应的中断函数地址,再跳转到相应新的中断服务函数,执行结束后返回到main函数中来。

3、IAR中bootloader和user application代码FLASH内存地址设置

以bootloader内存大小为32KB为例,bootloader的内存地址范围为:0x08000000--0x08007FFF

user application内存地址范围为:0x08008000--0x0807FFFF

以user application代码设置为例,需要将中断向量表的地址和ROM起始地址一起修改


除了修改以上配置外,还需要在代码中system_stm32f4xx.c中设置中断向量表的偏移值

/* #define VECT_TAB_SRAM */

#define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.

并在系统初始化时调用固件库的初始化函数:

/* Setup STM32 system (clock, PLL and Flash configuration) */

    SystemInit();

这样代码就能正确运行了。


  • 11
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值