。
程序组成: 1. 开机的时候先显示提示信息,然后等待串口输入 接收 APP 程序(无校验,一次性接收),在串口接收到 APP 程序之后,即可执行 IAP 。 2. 如果 是 SRAM APP ,通过按下 KEY0 即可执行这个收到的 SRAM APP 程序。 3. 如果是 FLASH APP, 则需要先按下 KEY_UP 按键,将串口接收到的 APP 程序存放 STM32F4 的 FLASH,之后再按 KEY2 既可以执行这个 FLASH APP 程序。 4. 通过 KEY1 按键,可以手动清除串口接收到的 APP 程序。 DS0 用于指示程序运行状态。1-BootLoader程序,
- 地址:0x08000000-0x08010000
- 空间:0x00010000(64K 字节)
2-FLASH APP程序,
- 地址:0x08010000-0x08100000,
- 空间:0x100000-0x10000=0xF0000(960K 字节)
- iap_write_appbin 函数用于将存放在串口接收 buf 里面的 APP 程序写入到 FLASH。
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize) //appxaddr:应用程序的起始地址 //appbuf:应用程序 CODE. //appsize:应用程序大小(字节)
- 跳转到APP 程序运行地址
void iap_load_app(u32 appxaddr)将 usart.c 和 usart.h 做了稍微修改。 这里,我们指定 USART_RX_BUF 的地址是从 0x20001000 开始,该地址也就是 SRAM APP 程序的起始地址!然后在 USART1_IRQHandler 函数里面,将串口发送过来的数据,全部接收 到 USART_RX_BUF ,并通过 USART_RX_CNT 计数。代码比较简单,我们就不多说了。
//接收缓冲,最大 USART_REC_LEN 个字节,起始地址为 0x20001000. u16 USART_RX_STA=0; //接收状态标记 u32 USART_RX_CNT=0; //接收的字节数
main.c接收程序 更新固件
2-FALSH APP生成(1)keil修改APP程序起始地址更改
- 地址:0x08010000-0x08100000,
- 空间:0x100000-0x10000=0xF0000(960K 字节)
(2)中断向量表的偏移量
SystemInit 函数VTOR寄存器存放中断向量的起始地址
#ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; #else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; #endif
为了避免修改系统文件,在main.c中修改 中断起始地址,FALSH APP的起始地址
SCB->VTOR = FLASH_BASE | 0x10000;fromelf.exe 转换工具 将MDK输出的.hex转为.bin
。
。



