从之前的STM32F0,F1都使用了IAP。
首先我使用的是根据判断STM32内部FLASH的方法来判断是否需要IAP升级。如在0x8004000处写入0xAABB,则需要更新。更新完写入0xBBAA,这样IAP程序来判断是否需要执行更新。
一直有个疑问,APP程序更新完后,跳转到APP。如果发送的的是正确的APP升级文件,那肯定没问题,这是如果发送错了APP升级文件(这不是我的意愿),就会出现问题,无法执行APP程序而进入到void HardFault_Handler(void)这个硬件中断函数。这时你就完全无能为力了,无法重现更新APP程序,这个情况不是我们想要的。
现在的处理方式是在IAP程序的void HardFault_Handler(void)函数中,写入IAP使能标记(即在0x8004000写入0xAABB)然后重启NVIC_SystemReset();这样可实现即时你更新选错了APP文件,也可以重新更新。
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
STMFLASH_Write(IAP_FLAG_ADD,&IAP_Flag_ENABLE_Data,1);
NVIC_SystemReset();
while (1)
{
}
}
疑问1:这样的方式是否可行,会不会影响到APP的void HardFault_Handler(void)函数。
疑问2:
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.
我在IAP程序中定义了一个120K的变量,跳转到APP时这个变量会释放吗? |