[应用相关] STM32 IAP升级程序设计详解-IAR环境

[复制链接]
 楼主| 过期的塔头 发表于 2021-12-30 16:14 | 显示全部楼层 |阅读模式
ST, ar
一 STM32 IAP 原理分析
STM32 IAP的实现原理与STM8类似,只是STM32可以设置中断向量表的偏移,而STM8不能设置偏移只能通过中断向量表的重定向来实现APP程序中中断的使用。但是同样还是需要设计两个程序,在Bootloader程序通过某种通信方式,如 USB、 USART接收APP程序数据,并写入Flash中,然后跳转到APP程序的首地址,开始运行第二个程序。

首先我们来分析只有一个APP程序的时候STM32的运行流程图:


6745861cd6a53568df.png

 楼主| 过期的塔头 发表于 2021-12-30 16:17 | 显示全部楼层
以STM32L4系列单片机为例,在官方手册中可以查到Flash的起始地址为0x0800 0000,通过上图可以看到在Flash的起始地址存放的是栈顶指针,紧接着就是中断向量表,中断向量表中的第一个中断向量就是复位中断向量。此时STM32的运行流程可以大致分为以下几步:
 楼主| 过期的塔头 发表于 2021-12-30 16:20 | 显示全部楼层
1芯片上电复位后,PC指针硬件强制指向复位中断向量,跳转执行复位中断函数;
2执行完复位中断函数后再跳转到用户main函数;
3在main函数中如果发生了其他中断,硬件会强制PC指针指向对应的中断向量;
4然后再跳转到相应中断函数中执行;
5执行完成后继续返回main主循环,并重复步骤3,4,5。
 楼主| 过期的塔头 发表于 2021-12-30 16:21 | 显示全部楼层
当加入Bootloader程序之后Flash中的内容变成了这样:
9684861cd6c0a4dcf4.png
 楼主| 过期的塔头 发表于 2021-12-30 16:39 | 显示全部楼层
此时程序的运行流程发生了一些变化:
 楼主| 过期的塔头 发表于 2021-12-30 16:39 | 显示全部楼层
 楼主| 过期的塔头 发表于 2021-12-30 16:41 | 显示全部楼层
此时会出现一个问题:APP程序中的中断服务程序无法执行。
 楼主| 过期的塔头 发表于 2021-12-30 16:42 | 显示全部楼层
note:在STM8中可以通过重定向中断向量表,通过修改BootLoader的中断向量表中的内容,当PC指针指向第一个中断向量表(BootLoader的中断向量表)时,我们把中断向量表中原本应该跳转到中断服务函数的指令,修改为跳转到新的APP的中断向量表的指令,然后再跳转到APP的中断服务函数。这样就能在APP程序中使用中断了,但是这样存在的问题是,无法在BootLoader中使用中断了。
 楼主| 过期的塔头 发表于 2021-12-30 16:43 | 显示全部楼层
显然,STM32仍然可以使用这种办法,只是对于STM32来说有更好的解决方案,STM32提供了中断向量表的偏移机制。只需要在APP程序的启动文件中设置好中断向量向量表的偏移地址,当在APP程序中产生中断请求时,PC指针会强制指向:原中断向量地址+偏移地址,这样就能在APP程序中使用中断了,而只要我们不在BootLoader中设置偏移,当BootLoader中产生中断请求时PC指针还是会指向它自己的中断向量表地址。这样无论在BootLoader中还是在APP中我们都能够使用中断了。
 楼主| 过期的塔头 发表于 2021-12-30 16:43 | 显示全部楼层
note:另外可以设置中断向量表的偏移还有另外一个好处,就是可以使用多个APP,因为只需要在APP程序中设置不同的中断向量表的偏移就行了,而如果用中断向量表的重定向就只能有一个APP应用程序了。
 楼主| 过期的塔头 发表于 2021-12-30 21:46 | 显示全部楼层
二 STM32 IAP升级设计流程
有了以上对升级原理分析我们就可以来实现自己的IAP升级程序了。前面也已经说过了这里需要我们设计两个程序:

BootLoader 程序
用户APP
 楼主| 过期的塔头 发表于 2021-12-30 21:49 | 显示全部楼层
STM32 IAP升级设计流程如下:
8104861cdb84966642.png
 楼主| 过期的塔头 发表于 2021-12-30 21:52 | 显示全部楼层
1.修改链接文件
由于BootLoader和APP程序需要烧录到不同的地址所以这里我们需要通过链接文件来对其的烧写地址进行修改。
 楼主| 过期的塔头 发表于 2021-12-30 21:54 | 显示全部楼层
a. 首先打开工程对应的*.icf链接文件:
3791661cdb9a60a671.png
 楼主| 过期的塔头 发表于 2021-12-30 21:59 | 显示全部楼层
b. 这里我们以Flash中的程序为例,所以选择第一个icf文件,右键编辑:
5963561cdbb4a75293.png
 楼主| 过期的塔头 发表于 2021-12-30 22:00 | 显示全部楼层
c.在Memory Regions栏可以看到该款芯片的ROM地址范围为0x0800 0000 - 0x0803 FFFF (256K),即Flash大小为256K。
1657761cdbb8db5750.png
 楼主| 过期的塔头 发表于 2021-12-30 22:01 | 显示全部楼层
d.对于BootLoader程序可以根据自己的需求自己设置大小,例如这里我们设置为32K。
1659361cdbbb2ae20f.png
 楼主| 过期的塔头 发表于 2021-12-30 22:02 | 显示全部楼层
e.APP程序直接使用剩下的空间即可(共224K)。

331161cdbbc1a8f10.png
 楼主| 过期的塔头 发表于 2021-12-30 22:03 | 显示全部楼层
e.最后APP的链接文件中还需要重新设置中断向量表的起始地址。

9672061cdbc218a011.png
 楼主| 过期的塔头 发表于 2021-12-30 22:04 | 显示全部楼层
2. 设置中断向量表的偏移地址(APP)
首先我们找到STM32的系统启动文件,这里以STM32L4为例:

604061cdbc385eec8.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

999

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部