参考文章见这里
需要两个程序,一个为bootloader程序,一个为app。在FLASH中的分布如下
1.bootloader
(1)开启串口1接收app的bin文件,接收到的文件数据既可以存u16数组,也可以存外部SRAM(正点原子例子就是存的SRAM)。
(2)按下KEY_UP,调用iap_write_appbin将接收到的文件数据写入FLASH。
(3).调用iap_load_app加载app程序。
(4)设置程序在FLASH中的开始地址和长度。
主要代码
int main(void)
{
delay_init();
LED_Init();
KEY_Init();
uart_init(115200);
printf("Uart init");
u16 buff[12]={0};
STMFLASH_Read(FLASH_APP1_ADDR, buff,12);
if(buff[0]!=0xFFFF)//有app
{
iap_load_app(FLASH_APP1_ADDR);
}
while(1)
{
u8 key=KEY_Scan(0);
if(key==WKUP_PRES)
{
if(USART_RX_STA)
{
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,USART_RX_STA);
printf("固件更新完成!\r\n");
iap_load_app(FLASH_APP1_ADDR);
printf("开始执行FLASH用户代码!!\r\n");
}
}
}
}
2.app
程序根据实际写就行。
(1)设置程序在FLASH中的开始地址和长度。
(2) 在main函数中设置中断向量表的偏移量
SCB->VTOR = FLASH_BASE | 0x10000;
(3)将*.axf文件转换为*.bin文件
D:\MDK5\ARM\ARMCC\bin\fromelf.exe --bin -o ..\OBJ\BEEP.bin ..\OBJ\BEEP.axf
3.测试。
(1)将bootloader程序使用ST-LINK刷入stm32,并运行程序。
(2)使用串口工具SSCOM发送app.bin到stm32。
3.按下KEY_UP实现app文件写入与加载。