logo资料库

基于STM32的IPA设计文档.pdf

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
1简介
2Bootloader实现原理
3APP实现与配置
3.1APP1程序起始地址设置方法
3.2中断向量表的偏移量设置
3.3*bin文件生成
3.4步骤总结
4关键点
附件:
Bootloader+3App Bootloader+3App Bootloader+3App Bootloader+3App 1 简介...................................................................................................................... 2 2 Bootloader 实现原理............................................................................................ 3 3 APP 实现与配置...................................................................................................6 3.1 APP1 程序起始地址设置方法.................................................................... 6 3.2 中断向量表的偏移量设置......................................................................... 7 3.3 *bin 文件生成........................................................................................... 7 3.4 步骤总结................................................................................................... 8 4 关键点.................................................................................................................. 9 附件:................................................................................................................... 10
1111 简介 IAP(In Application Programming)即在应用编程,IAP 是用户自己的程 序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后 可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常实现 IAP 功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编 写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通 信方式(如 USB、USART)接收程序或数据,执行对第二部分代码的更新;第二 个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在 User Flash 中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作: 1)检查是否需要对第二部分代码进行更新 2)如果不需要更新则转到4) 3)执行更新操作 4)跳转到第二部分代码执行 第一部分代码必须通过其它手段,如 JTAG 或 ISP 烧入;第二部分代码 可以使用第一部分代码 IAP 功能烧入,也可以和第一部分代码一起烧入,以后 需要程序更新是再通过第一部分 IAP 代码更新。 我们将第一个项目代码称之为 Bootloader 程序,第二个项目代码称之为 APP 程序,他们存放在 STM32 FLASH 的不同地址范围,一般从最低地址区开 始存放 Bootloader,紧跟其后的就是 APP 程序(注意,如果 FLASH 容量足够, 是可以设计很多 APP 程序的,本章我们讨论 3 个 APP 程序的情况)。这样我们 就是要实现 4 个程序:Bootloader 和 3 个 APP。
Bootloader 2222 Bootloader Bootloader Bootloader 实现原理 我们先来看看 STM32 正常的程序运行流程,如图 2.1 所示: ① ② 0X08000000 0X08000004 闪 存 物 理 地 址 复 位 中 断 向 量 (中 断 向 量 表 起 始 地 址) 非 可 屏 蔽 中 断 向 量 栈 顶 地 址 Reset_Handler NMIEeception 增 递 硬 件 错 误 中 断 向 量 HardFaultException … … 0X08000004 +n 复 位 中 断 程 序 入 口 Reset_Handler(vo id ) ④ 硬件错误中断程序入口 HardFaultException(vo id ) ③ … … x x x 中 断 程 序 入 口 x x x _Handler(vo id ) … … 0X08000004 +N m a in函 数 入 口 int main (vo id ) m a in函 数 死 循 环 ⑤ 中 断 请 求 图 2.1 STM32 正常运行流程图 STM32 的内部闪存(FLASH)地址起始于 0x08000000,一般情况下, 程序文件就从此地址开始写入。此外 STM32 是基于 Cortex-M3 内核的微控制 器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中 断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量 表”的起始地址是 0x08000004,当中断来临,STM32 的内部硬件机制亦会自 动将 PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执 行中断服务程序。 在图 2.1 中,STM32 在复位后,先从 0X08000004 地址取出复位中断向 量的地址,并跳转到复位中断服务程序,如图标号①所示;在复位中断服务程 序执行完之后,会跳转到我们的 main 函数,如图标号②所示;而我们的 main
函数一般都是一个死循环,在 main 函数执行过程中,如果收到中断请求(发生 重中断),此时 STM32 强制将 PC 指针指回中断向量表处,如图标号③所示; 然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中断 服务程序以后,程序再次返回 main 函数执行,如图标号⑤所示。 当加入 IAP 程序之后,程序运行流程如图 2.2 所示: 0X08000000 0X08000004 ① 增 递 闪 存 物 理 地 址 复 位 中 断 向 量 (中 断 向 量 表 起 始 地 址 ) 非 可 屏 蔽 中 断 向 量 硬 件 错 误 中 断 向 量 栈 顶 地 址 Reset _Handler NMIEeception HardFaultException … … 0X08000004+N IA P 程 序 m a in 函 数 入 口 int m ain (vo id ) 增 递 IA P 过 程 跳 转 ② 0X08000004 +N+M 复 位 中 断 向 量 (新 中 断 向 量 表 起 始 地 址 ) 非 可 屏 蔽 中 断 向 量 硬 件 错 误 中 断 向 量 Reset_Handler NMIEeception HardFaultException ⑤ ④ 增 递 ③ … … 复 位 中 断 程 序 入 口 Reset _Handler(vo id ) 硬 件 错 误 中 断 程 序 入 口 HardFaultException (vo id ) … … xxx 中 断 程 序 入 口 xxx _Handler(vo id ) … … 0X08000004 +N+M+n 新 程 序 m a in 函 数 入 口 int m ain (vo id ) m a in 函 数 死 循 环 ⑥ 中 断 请 求 图 2.2 加入 IAP 之后程序运行流程图
在图 2.2 所示流程中,STM32 复位后,还是从 0X08000004 地址取出复 位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序 之后跳转到 IAP 的 main 函数,如图标号①所示,此部分同图 2.1 一样;在执行 完 IAP 以后(即将新的 APP 代码写入 STM32 的 FLASH,灰底部分。新程序的 复位中断向量起始地址为 0X08000004+N+M),跳转至新写入程序的复位向量 表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程 序,随后跳转至新程序的 main 函数,如图标号②和③所示,同样 main 函数为 一个死循环,并且注意到此时 STM32 的 FLASH,在不同位置上,共有两个中 断向量表。 在 main 函数执行过程中,如果 CPU 得到一个中断请求,PC 指针仍强制 跳转到地址 0X08000004 中断向量表处,而不是新程序的中断向量表,如图标 号④所示;程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的 中断服务程序中,如图标号⑤所示;在执行完中断服务程序后,程序返回 main 函数继续运行,如图标号⑥所示。 通过以上两个过程的分析,我们知道IAP程序必须满足两个要求: 1) 新程序必须在IAP程序之后的某个偏移量为x的地址开始; 2) 必须将新程序的中断向量表相应的移动,移动的偏移量为x;
3333 APPAPPAPPAPP 实现与配置 本章设计3个APP的情况,因为就是分配的flash扇区不同,所以就举例其 中的一个。 程序起始地址设置方法 3.13.13.13.1 APPAPPAPPAPP1111 程序起始地址设置方法 程序起始地址设置方法 程序起始地址设置方法 随便打开一个之前的实例工程,点击 Options for Target�Target 选项卡, 如图 3.1 所示: 图 3.1 FLASH APP1 Target 选项卡设置 默认的条件下,图中IROM1的起始地址(Start)一般为0X08000000,大 小(Size)为0X80000,即从0X08000000开始的512K空间为我们的程序存储。 而图中,我们设置起始地址(Start)为0X08010000,即偏移量为0X10000(64K 字节),因而,留给APP用的FLASH空间(Size)只有0X80000- 0X10000=0X70000(448K字节)大小了。设置好Start和Szie,就完成APP1程序
的起始地址设置。 APP2则为0X08020000+0X60000; App3则为0X08030000+0X50000; 其实就是为每个app程序分配了4k的空间。 中断向量表的偏移量设置 3.23.23.23.2 中断向量表的偏移量设置 中断向量表的偏移量设置 中断向量表的偏移量设置 之前我们讲解过,在系统启动的时候,会首先调用 systemInit 函数初始化 时钟系统,同时 systemInit 还完成了中断向量表的设置,我们可以打开 systemInit 函数,看看函数体的结尾处有这样几行代码: #ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ #else CB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ #endif 从代码可以理解,VTOR寄存器存放的是中断向量表的起始地址。默认的情况 VECT_TAB_SRAM是没有定义,所以执行SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 对于FLASH APP,我们设置为FLASH_BASE+偏移量0x10000,所 以我们可以在FLASH APP的main函数最开头处添加如下代码实现中断向量表的起 始地址的重设: SCB->VTOR = FLASH_BASE | 0x10000; 如果是APP2可以设置为SCB->VTOR = FLASH_BASE | 0x20000; 如果是APP3可以设置为SCB->VTOR = FLASH_BASE | 0x30000; 这样,我们就完成了中断向量表偏移量的设置。 3.33.33.33.3 *bin*bin*bin*bin 文件生成文件生成文件生成文件生成 不过MDK默认生成的文件是.hex文件,并不方便我们用作IAP更新,我们 希望生成的文件是.bin文件,这样可以方便进行IAP升级。这里我们通过MDK自 带的格式转换工具fromelf.exe,来实现.axf文件到.bin文件的转换。该工具在 MDK的安装目录\ARM\BIN40文件夹里面。 本章,我们通过在MDK点击Options for Targetà User选项卡,在Run User Programs After Build/Rebuild 栏,勾选Run#1和DOS16,并写入:
D:\Keil3.80a\ARM\BIN40\fromelf.exe --bin - o ..\OBJ\TEST.bin ..\OBJ\TEST.axf,如图3.2所示: 图3.2 *bin文件生成设置 通过这一步设置,我们就可以在MDK编译成功之后,调用fromelf.exe (注意,我的MDK是安装在D:\Keil3.80A文件夹下,如果你是安装在其他目录, 请根据你自己的目录修改fromelf.exe的路径),根据当前工程的TEST.axf(如 果是其他的名字,请记住修改,这个文件存放在OBJ目录下面,格式为 xxx.axf),生成一个TEST.bin的文件。并存放在axf文件相同的目录下,即工 程的OBJ文件夹里面。在得到.bin文件之后,我们只需要将这个bin文件传送给 单片机,即可执行IAP升级。 3.43.43.43.4 步骤总结步骤总结步骤总结步骤总结 1111) 设置APPAPPAPPAPP程序的起始地址和存储空间大小 2222) 设置中断向量表偏移量 fromelf.exe 3333) 设置编译后运行fromelf.exe fromelf.exe,生成.bin.bin.bin.bin文件.... fromelf.exe
分享到:
收藏