
串口 IAP1. 常规的运行流程2. IAP 程序的运行流程2.1 设置 APP 程序的起始地址和存储空间大小2.2 设置中断向量表偏移量2.3 生成.bin 文件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 内部多出了新写入的程序以灰色底纹方格表示地址始于0x8000004NM跳转至新写入程序的复位向量表取出新程序的复位中断向量的地址并跳转执行新程序的复位中断服务程序随后跳转至新程序的 main 函数。新程序的main函数应该也具有永不返回的特性。同时应该注意在 STM32 的内部存储空间在不同的位置上出现了2个中断向量表④在新程序main函数执行的过程中一个中断请求来临PC指针仍会回转至地址为 0x8000004 中断向量表处而并不是新程序的中断向量表。注意到这是由 STM32 的硬件机制决定的⑤根据中断源跳转至对应的中断服务。注意此时是跳转至了新程序的中断服务程序中⑥中断服务执行完毕后返回 main 函数2.1 设置 APP 程序的起始地址和存储空间大小FLASH APP 的起始地址设置左图:默认的条件下IROM1的起始地址Start一般为 0X08000000大小Size为0x40000即从 0X08000000 开始的 256K 空间为我们的程序存储区。我们设置起始地址Start为 0X08010000即偏移量为 0x1000064K 字节即留给 BootLoader 的空间因而留给 APP 用的 FLASH 空间Size为 0x40000-0x100000x30000192K 字节大小了。设置好 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 个 IAP2 个 APPFLASH IAP Bootloader起始地址为 0X08000000设置为我们用于升级的跳转的程序我们将用串口 1 来作数据接收程序通过按键功能手动跳转到指定 APPFLASH APP仅使用 STM32 内部 FLASH大小为 37KB FLASH APP 程序起始地址为 0X08010000SRAM APP使用 STM32 内部 SRAM我们使用-O2 优化生成的 bin 大小为 44KB SRAM APP 程序起始地址为 0X20001000