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(); 

posted @ 2019-07-05 16:36  得一寸  阅读(364)  评论(0编辑  收藏  举报