标签:应该 有一个 存储 网络 网络设备 iap cti boot1 偏移量
关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案。
原理与网上流传的串口作为传输手段 一致;不同之处,无非我这里使用了网络设备传输。==(lwip)TFTP客户端的应用.
参考:
IAR环境下STM32+IAP方案的实现
STM32浅谈之IAP.pdf
基于IAP和Keil MDK的远程升级设计
keil MDK中如何生成*.bin格式的文件
IAP在应用中编程,可以拓展成远程网络更新应用固件。
片内的flash,至少划分成2个分区,对应至少两个完整的程序;
低地址分区端推荐放入IAP程序==bootloader引导程序(这里边的手段可以是串口、网络等不同的方式),高地址分区端推荐烧写app固件。
关键点提及:
IAP程序中,当满足跳转条件(被触发)时,执行跳转代码到app应用固件程序,跳转代码流程:
至少需要设定跳转目的地的app应用固件 栈顶指针,:
/* Initialize user application‘s Stack Pointer */
__set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
其中,app应用固件的分区地址:
#define USER_FLASH_FIRST_PAGE_ADDRESS 0x08009000
需要两处的更改,不然错误未知
IROM设置如图:
中断向量表偏移:
NVIC_SetVectorTable(NVIC_VectTab_FLASH,VectorTable_Offset);
其中:
#define NVIC_VectTab_FLASH ((uint32_t)0x08000000)
#define VectorTable_Offset 0x9000
如果做了上边的工作,IAP依然无法顺利执行跳转至app应用程序,可以查看.map和.bin文件,确定是否如实的改变的中断向量表的偏移和栈顶指针,如图:
.bin文件:
可以看到,主栈顶MSP地址=0x2000C8C8、reset_handler地址=0x08009189
如此,才能生效,否则,可能原因:
修改后的向量表偏移,在之后的程序中,又再次被还原,通过如下的函数:
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
void SystemInit (void);
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
1、如需要.hex文件转.bin,参见上边的文章
当然,就算使用.hex文件,同样可以升级,只是需要修改IAP中判定已经升级的文件是否有效,文件条件部分的代码,
if(((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
2、地址偏移后的app应用程序,是否能够独立的运行?
不能,理由:
可知,开机上电并不能够找到我们指定的偏移后的向量表。
标签:应该 有一个 存储 网络 网络设备 iap cti boot1 偏移量
原文地址:http://www.cnblogs.com/wanghuaijun/p/7810182.html