stm32 IAP
stm32f4,Flash不能用Ex的函数,否则Flash有两个寄存器莫名其妙置位,Flash容易写不进去。
APP无损跳入IAP的关键在于,把所有的中断都关闭,如果一个中断时不时在发生,那么程序跳转就会出现混乱。
注意APP不能擦除整个chip
IAP的逻辑
先给APP发送指令,要进入IAP了;
主程序跳转到APP段(复位);
IAP返回确认数据(从APP进入的)
命令:
从APP进入:
T=01,05 R=0xaa 进入IAP
T=02,05 R=0xaa 初始化地址
T=03,2048字符 R=0xaa 发送2048个字符
。。。
T=04,4byte剩余字符count,剩余字符 R=0xaa
T=05 05 测试 R=0xaa;
IAP项目
1、接收APP程序数据,串口命令有两种,1是整包,2是散包(最后一个包);
2、进入跳转的条件:
/*
程序已下载 由APP进入 超时 程序更新完成
A B C D
满足如下条件就会跳转:
AB*+ABC+ABD
A*D
*/
超时:由APP进入的,但是串口通信突然中断了,程序还要继续运行下去,所以只能是,程序已下载的情况下,超过一定时间新程序还没下载完,就直接跳转
APP项目
1、魔术棒中设置程序启动的地址;
2、程序中设置中断向量表的新地址: SCB->VTOR = FLASH_BASE | 0x10000; /* Vector Table Relocation in Internal FLASH. */
3、可以复位,进入IAP:__set_FAULTMASK(1); NVIC_SystemReset();
移植到stm32f1
cube生成stm32f1的工程
主函数包含文件iap.h
main函数更新为iap程序
flash的erase更改为stm32f1的库,把stm32f4的文件改为stm32f1
flash的erase的库函数没有清除标志位,导致多次操作flash后,flash不能正常工作,增加如下语句后,正常,原因未知
CLEAR_BIT(FLASH->SR,FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
IAP和APP来回跳转,停止响应终于搞定,其中APP里uc/osiii操作系统,IAP无操作系统
1、网上有说要在OsStart之前放SCB->VTOR=0x8010000;,实际不需要,这个是在SystemInit之中在main之前执行的,只要在main中写这句就可以覆盖
2、主要原因是要把中断关闭,主要是一个任务中定时调用了uart3
在调试过程中,把能看到的中断都关闭了,懒得再改了,如下:
__disable_irq();
BSP_IntDisAll();
BSP_Deinit();
BSP_IntDis(BSP_INT_ID_USART2);
BSP_IntDis(BSP_INT_ID_USART3);
CPU_IntSrcDis(CPU_INT_SYSTICK);
CPU_IntSrcDis(CPU_INT_MEM);
CPU_IntSrcDis(CPU_INT_BUSFAULT);
CPU_IntSrcDis(CPU_INT_USAGEFAULT);
UpadateProgramBit(1);
iap_load_app(FLASH_BASE);//??FLASH APP??
3、IAP中__enable_irq();