STM32中的IAR详解

IAR

编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如 USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在 User Flash 中,当芯片上电后,首先是第一个项目代码开始运行:
1)检查是否需要对第二部分代码进行更新
2)如果不需要更新则转到 4)
3)执行更新操作
4)跳转到第二部分代码执行

第一部分代码必须通过其它手段,如 JTAG 或 ISP 烧入

我们将第一个项目代码称之为 Bootloader 程序,第二个项目代码称之为 APP 程序,他们存
放在 STM32 FLASH 的不同地址范围,一般从最低地址区开始存放 Bootloader,紧跟其后的就是 APP 程序

我们先来看看 STM32 正常的程序运行流程,

STM32中的IAR详解
STM32 的内部闪存(FLASH)地址起始于 0x08000000,一般情况下,程序文件就从此地址开始写入。

程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成
启动,而这张“中断向量表”的起始地址是 0x08000004,当中断来临,STM32 的内部硬件机制亦会自动将 PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。

1 STM32 在复位后,先从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;
2 在复位中断服务程序执行完之后,会跳转到我们的main 函数,如图标号②所示;
3 main 函数一般都是一个死循环,在 main 函数执行过程中,如果收到中断请求(发生重中断),此时 STM32 强制将 PC 指针指回中断向量表处,如图标号③所示;
4 根据中断源进入相应的中断服务程序,如图标号④所示;
5 在执行完中断服务程序以后,程序再次返回 main 函数执行,如图标号⑤所示。

当加入 IAP 程序之后,

STM32中的IAR详解
1 STM32 复位后,还是从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到 IAP 的 main 函数,如图标号①所示,
2 在执行完 IAP 以后(即将新的 APP 代码写入 STM32的 FLASH,灰底部分。新程序的复位中断向量起始地址为 0X08000004+N+M),跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的 main 函数,如图标号②和③所示,
3 main 函数为一个死循环,并且注意到此时 STM32 的 FLASH,在不同位置上,共有两个中断向量表。
4 在 main 函数执行过程中,如果 CPU 得到一个中断请求,PC 指针仍强制跳转到地址0X08000004 中断向量表处,而不是新程序的中断向量表,如图标号④所示;
5 程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;
6 在执行完中断服务程序后,程序返回 main 函数继续运行,如图标号⑥所示。

通过以上两个过程的分析,我们知道 IAP 程序必须满足两个要求:
1) 新程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始;
2) 必须将新程序的中断向量表相应的移动,移动的偏移量为 x;

1.APP 程序起始地址设置方法
STM32中的IAR详解
默认的条件下,图中 IROM1 的起始地址(Start)一般为 0X08000000,大小(Size)为 0X40000,即从 0X08000000 开始的 256K 空间为我们的程序存储区。

而图中,我们设置起始地址(Start)为 0X08010000,即偏移量为 0X10000(64K 字节),因而,留给 APP 用的 FLASH 空间(Size)只有 0X40000-0X10000=0X30000(192K 字节)大小了。

这里的 64K 字节不是固定的,大家可以根据 Bootloader 程序大小进行不同设置,理论上我们只需要确保 APP 起始地址在 Bootloader 之后,并且偏移量为 0X200 的倍数即可。

2.中断向量表的偏移量设置方法
在系统启动的时候,会首先调用 systemInit 函数初始化时钟系统,同时systemInit 还完成了中断向量表的设置,
STM32中的IAR详解
VTOR 寄 存 器 存 放 的 是 中 断 向 量 表 的 起 始 地 址 。 默 认 的 情 况VECT_TAB_SRAM 是没有定义,所以执行 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
对于 FLASH APP,我们设置为 FLASH_BASE+偏移量 0x10000,所以我们可以在 FLASH APP 的
main 函数最开头处添加如下代码实现中断向量表的起始地址的重设:
STM32中的IAR详解
我们通过在 MDK 点击 Options for TargetUser 选项卡,在 After Build/Rebuild 栏,
勾选 Run #1,并写入:D:\MDK5.14\ARM\BIN40\fromelf.exe --bin -o …\OBJ
\TEST.bin …\OBJ\TEST.axf ,
STM32中的IAR详解

3 在 MDK 编译成功之后,调用 fromelf.exe
(注意,我的 MDK是安装在 D:\MDK5.14 文件夹下,如果你是安装在其他目录,请根据你自己的目录修改fromelf.exe 的路径),根据当前工程的 RTC.axf,生成一个 RTC.bin 的文件。并存放在 axf 文件相同的目录下,即工程的 OBJ 文件夹里面。在得到.bin 文件之后,我们只需要将这个 bin 文件传送给单片机,即可执行 IAP 升级。

APP程序的地址偏移设置

A第一种方法

1勾选上IROM1 设置start size 分别为起始地址0x08010000 大小30000
STM32中的IAR详解

2去掉use memory layout target dialog的勾选框 选择edit
STM32中的IAR详解

3 把红色部分的数值更改到和前面irom1一样
STM32中的IAR详解

B第二种方法
替换第一种方法的23步骤

STM32中的IAR详解

STM32中的IAR详解

axf bin文件生成

1确定Name of Executable的名字
STM32中的IAR详解
2编辑并确认user中的Run #1
C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o …\Output\ledtest.bin …\Output\ledtest.axf
STM32中的IAR详解
3编译即可