因为项目需要,这几天好好的研究了一下STM32的在线升级功能。首先网上搜索了很多的资料例程,但是所有的例程肯定和自己最终功能不一样,还是得自己去改,去移植。
首先单纯的IAP包含至少两个工程,一个是BootLoader,一个是APP。当然也可以有多个APP。以下摘自正点原子:
“第一个项目程序不执行正常的功能操作,而只是通
过某种通信方式(如 USB、 USART)接收程序或数据,执行对第二部分代码的更新;第二个项目
代码才是真正的功能代码。这两部分项目代码都同时烧录在 User Flash 中,当芯片上电后,首
先是第一个项目代码开始运行,它作如下操作:
1)检查是否需要对第二部分代码进行更新
2)如果不需要更新则转到 4)
3)执行更新操作
4)跳转到第二部分代码执行
第一部分代码必须通过其它手段,如 JTAG 或 ISP 烧入;第二部分代码可以使用第一部分
代码 IAP 功能烧入,也可以和第一部分代码一起烧入,以后需要程序更新是再通过第一部分 IAP
代码更新。”
其最主要的要看这两个图:
两者区别:
1.有IAP的程序是先跑bootloader,在其中跳转到APP的内存地址去执行APP,而无IAP是直接跑APP的
2.有IAP的在发生中断之后会跳转到BootLoader的复位中断向量处,然后再跳转到自己的中断向量处执行相应中断的
这个地方我有个疑问:
1.在APP中发生的任何中断都会跳转到8000004这个位置么?还是仅仅是发生复位中断才跳转到这个位置?
2.跳转到复位中断向量之后如何查询到自己的中断程序入口的?否则如何从8000004跳到自己APP的中断程序入口呢?
正点原子说的是根据中断向量表偏移量找到的。其实还是不太理解。这个回头再好好思考。
反正根据以上种种,得出结论:
1) 新程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始;
2) 必须将新程序的中断向量表相应的移动,移动的偏移量为 x;
那么接下来就是关键!步骤:
1.设置APP起始地址
2.中断向量偏移量设置
3.生成bin文件,这些具体操作方法,网上很多,大家自己去搜,关键是理解其为何这么做。第三步没什么可说的,关键是前两步。
设置APP起始地址是把BootLoader和APP放在内存的不同位置,包括flash的不同位置和SRAM的不同位置,他们的起始位置都是8000000,后续依据所占内存大小,设置。但是flash我们很好理解,那么SRAM和flash有什么区别呢?以下是正点原子中对flash APP和SRAM APP的设置:
“默认的条件下,图中 IROM1 的起始地址(Start)一般为 0X08000000,大小(Size)为 0X80000,
即从 0X08000000 开始的 512K 空间为我们的程序存储(因为我们的 STM32F103ZET6 的 FLASH
ALIENTEK 战舰STM32开发板大小是 512K)。而图中,我们设置起始地址(Start)为 0X08010000,即偏移量为 0X10000(64K字节),因而,留给 APP 用的 FLASH 空间(Size)只有 0X80000-0X10000=0X70000(448K 字节)大小了。设置好 Start 和 Szie,就完成 APP 程序的起始地址设置。
这里的 64K 字节,需要大家根据 Bootloader 程序大小进行选择,比如我们本章的 Bootloader
程序为 22K左右,理论上我们只需要确保 APP 起始地址在 Bootloader 之后,并且偏移量为 0X200
的倍数即可(相关知识,请参考: http://www.openedv.com/posts/list/392.htm)。这里我们选择 64K
(0X10000)字节,留了一些余量,方便 Bootloader 以后的升级修改。
这是针对 FLASH APP 的起始地址设置,如果是 SRAM APP,那么起始地址设置如图 53.1.4
所示:
”
这里我们将 IROM1 的起始地址(Start)定义为: 0X20001000,大小为 0XA000(40K 字节),
即从地址 0X20000000 偏移 0X1000 开始,存放 APP 代码。因为整个 STM32F103ZET6 的 SRAM
大 小 为 64K 字 节 , 所 以 IRAM1 ( SRAM ) 的 起 始 地 址 变 为 0X2000B000
( 0x20001000+0xA000=0X2000B000 ) , 大 小 只 有 0X5000 ( 20K 字 节 )。 这 样 , 整 个
STM32F103ZET6 的 SRAM 分配情况为:最开始的 4K 给 Bootloader 程序使用,随后的 40K 存
放 APP 程序,最后 20K,用作 APP 程序的内存。这个分配关系大家可以根据自己的实际情况
修改,不一定和我们这里的设置一模一样,不过也需要注意,保证偏移量为 0X200 的倍数(我
们这里为 0X1000)。”
经过我的查询,我理解如下:FLASH是会掉电保存的,而SRAM掉电丢失,SRAM读取速度比FLASH快,主要用来存取程序运行中的中间变量,也就是你程序中定义的可变变量。
正点例程中的SRAM APP是BootLoader将接收到的数据直接存到SRAM中,那么sram被分为了三部分,第一部分:
20000000到20001000是BootLoader的SRAM
20001000到2000B000是SRAM APP的程序代码存储区,设置为了只读
2000B000到20010000是SRAM APP的数据存储区,设置为了可读可写
从芯片的内存分布可以看出,FLASH和SRAM对于STM32的寻址是在一个系统内的,SRAM的地址是大于FLASH的。FLASH的读取次数可以达到10000次