串口 IAP
- [1. 常规的运行流程](#1. 常规的运行流程)
- [2. IAP 程序的运行流程](#2. IAP 程序的运行流程)
-
- [2.1 设置 APP 程序的起始地址和存储空间大小](#2.1 设置 APP 程序的起始地址和存储空间大小)
- [2.2 设置中断向量表偏移量](#2.2 设置中断向量表偏移量)
- [2.3 生成.bin 文件](#2.3 生成.bin 文件)
- [3. 例程](#3. 例程)
1. 常规的运行流程
TM32F1 的内部闪存(FLASH)地址起始于 0X0800 0000,一般情况下,程序文件就从此地址开始写入。此外 STM32F103 是基于 Cortex-M3 内核的微控制器,其内部通过一张"中断向量表"来响应中断,程序启动后,将首先从"中断向量表"取出复位中断向量执行复位中断程序完成启动,而这张"中断向量表"的起始地址是 0x08000004,当中断来临,STM32F103 的内部硬件机制亦会自动将 PC 指针定位到"中断向量表"处,并根据中断源取出对应的中断向量执行中断服务程序。
① STM32复位后,会从地址为0x8000004处取出复位中断向量的地址,并跳转执行复位中断服务程序
② 复位中断服务程序执行的最终结果是跳转至 C 程序的 main 函数,而 main 函数应该是一个死循环,是一个永不返回的函数
③ 在 main 函数执行的过程中,发生了一个中断请求,此时STM32的硬件机制会将PC指针强制指回中断向量表处
④ 根据中断源进入相应的中断服务程序
⑤ 中断服务程序执行完毕后,程序再度返回至 main 函数中执行
2. IAP 程序的运行流程
① STM32复位后,从地址为 0x8000004 处取出复位中断向量的地址,并跳转执行复位中断服务程序,随后跳转至 IAP 程序的 main 函数
②③ 执行完 IAP 过程后(STM32 内部多出了新写入的程序,以灰色底纹方格表示,地址始于0x8000004+N+M)跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的 main 函数。新程序的main函数应该也具有永不返回的特性。同时应该注意在 STM32 的内部存储空间在不同的位置上出现了2个中断向量表
④ 在新程序main函数执行的过程中,一个中断请求来临,PC指针仍会回转至地址为 0x8000004 中断向量表处,而并不是新程序的中断向量表。注意到这是由 STM32 的硬件机制决定的
⑤ 根据中断源跳转至对应的中断服务。注意此时是跳转至了新程序的中断服务程序中
⑥ 中断服务执行完毕后,返回 main 函数
2.1 设置 APP 程序的起始地址和存储空间大小
FLASH APP 的起始地址设置(左图):
- 默认的条件下,
IROM1的起始地址(Start)一般为 0X08000000,大小(Size)为0x40000,即从 0X08000000 开始的 256K 空间为我们的程序存储区。- 我们设置起始地址(Start)为 0X08010000,即偏移量为 0x10000(64K 字节,即留给 BootLoader 的空间),因而,留给 APP 用的 FLASH 空间(Size)为 0x40000-0x10000=0x30000(192K 字节)大小了。设置好 Start 和 Size,就完成 APP 程序的起始地址设置。
IRAM是内存的地址,APP 可以独占这些内存,我们不需要修改。- 注意:需要确保 APP 起始地址在 Bootloader 程序结束位置之后,并且偏移量为
0X200的倍数即可SRAM APP 的起始地址设置(右图):
2.2 设置中断向量表偏移量
2.3 生成.bin 文件
bin文件 是最直接的代码映像,它记录的内容就是要存储到 FLASH 的二进制数据 (机器码本质上就是二进制数据),在 FLASH 中是什么形式它就是什么形式,没有任何辅助信息,包括大小端格式也没有,因此下载器需要有针对芯片 FLASH 平台 的辅助文件才能正常下载(一般下载器程序会有匹配的这些信息) hex文件 是一种使用十六进制符号表示的代码记录,记录了代码应该存储到 FLASH 的哪个地址,下载器可以根据这些信息辅助下载
3. 例程
开机的时候先显示提示信息,然后等待串口输入接收 APP 程序(无校验,一次性接收),在串口接收到 APP 程序之后,即可执行 IAP。如果是 SRAM APP,通过按下 KEY0 即可执行这个收到的 SRAM APP 程序。如果是 FLASH APP,则需要先按下 KEY_UP 按键,将串口接收到的 APP 程序存放到 STM32F1 的 FLASH,之后再按 KEY1 即可以执行这个 FLASH APP 程序。LED0 用于指示程序运行状态。
总共需要 3 个程序(1 个 IAP,2 个 APP):
FLASH IAP Bootloader,起始地址为 0X08000000,设置为我们用于升级的跳转的程序,我们将用串口 1 来作数据接收程序,通过按键功能手动跳转到指定 APP
FLASH APP,仅使用 STM32 内部 FLASH,大小为 37KB, FLASH APP 程序(起始地址为 0X08010000)
SRAM APP,使用 STM32 内部 SRAM,我们使用-O2 优化,生成的 bin 大小为 44KB, SRAM APP 程序(起始地址为 0X20001000)






