准备
- 开发环境:IAR EWARM v8。
- 下载官方Bootloader程序包 en.stsw-stm32008.zip和应用手册 AN2557,下载页面。
Bootloader程序修改
- 解压缩 en.stsw-stm32008.zip 文件,进入目录 STM32F10x_AN2557_FW_V3.3.0\Project\IAP\EWARM\ 中,用IAR打开 IAP.eww。
- 由于这里采用的处理器为stm32f103re,为hd型处理器,所以在IAR打开的界面中,根据 AN2557 P5(第5页) 在Workspace中,选择STM3210E-EVAL,此时IAR的工程文件夹EWARMv5中,使用启动文件 startup_stm32f10x_hd.s。
- option – General Options 中选择处理器为 stm32f103re。尝试编译工程,会发现多个问题,解决过程不再详述,多为开发stm32所需的基本功。如Warning[25],可参考此文章。另外,core_cm3.c文件中的代码
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
__ASM("strexh r0, r0, [r1]");
__ASM("bx lr");
}
会出现错误,替换成如下代码即可:
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
uint32_t result=0;
__ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
return(result);
}
- 修正官方ymodem.c文件:flash擦除(line 214)、flash写入(line 236)前后加入解锁、加锁语句:
FLASH_Unlock();
......
FLASH_Lock();
- 修改IAP的触发条件和下载流程,原程序采用按键触发,可以修改为检测flash某个地址的数据来触发等。
- 确认工程选项,在 Linker 中,Vector Table: 0x08000000, Memory Regions: ROM: 0x08000000~0x08005FFF(这里app的起始地址为0x08006000),RAM默认。
- 编译下载Bootloader。
App程序修改
- 使用已经测试验证没问题的app工程。
- 修改工程选项,在 Linker 中,Vector Table: 0x08006000, Memory Regions: ROM: 0x08006000~0x0807FFFF(这里app的起始地址为0x08006000),RAM默认。
- 在app中修改中断向量表偏移地址,可在main函数中加入如下语句实现:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x6000);
- 修改工程选项,在 Linker 中,Output Converter中设置生成bin文件。
- Rebuild All,生成app.bin。
IAP测试
- 建议使用SecureCRT作为PC端软件。
- 触发IAP,用SecureCRT – Transfer – Send Ymodem,发送app.bin。
- 验证app是否成功执行。