项目需求,需求开发一款手持设备,对产品进行软件晋级。现在的产品都是运用STM32,所以能够很便利的使用STM32的 IAP功用对软件进行在线晋级。
全体需求便是,主机Master经过CAN接口,发送数据给从机Slave。从机在接纳到使用程序APP后,把接纳的数据覆盖掉本来的使用程序区。然后完结Master对Slave的在线晋级。
这儿先介绍IAP,对IAP的全体完结有个了解,便利后续开发。参阅了原子STM32开发板,对IAP功用的介绍。
要完结IAP,需求有两个项目代码。第一个称之为Bootloader程序,第二个称之为APP程序。Bootloader担任引导APP程序发动,以及需求在线更新APP时,接纳主机发送的APP文件,将接纳的APP覆盖掉本来的APP。
关于IAP的具体内容,能够参阅原子STM32开发板的开发攻略的五十三章。
下面是自己对IAP有大约了解之后,进行的试验。1,编写bootloader程序测验程序,用来引导指定方位的APP。2,修正本来的一个使用程序,使之能够用该bootloader引导。3,经过jlink下载器,别离下载bootloader和APP。
一,bootloader程序。
首要代码如下,流水灯之后,碑文跳转到APP区域的指令
- intmain(void)
- {
- delay_init();
- LED_Init();
- LED1=0;
- delay_ms(200);//延时
- LED2=0;
- delay_ms(200);//延时
- LED3=0;
- delay_ms(200);//延时
- LED4=0;
- delay_ms(200);//延时
- LED1=1;
- delay_ms(200);//延时
- LED2=1;
- delay_ms(200);//延时
- LED3=1;
- delay_ms(200);//延时
- LED4=1;
- delay_ms(200);//延时
- iap_load_app(FLASH_APP1_ADDR);//碑文FLASHAPP代码
- }
- #defineFLASH_APP1_ADDR0x08003C00//第一个使用程序开端地址(寄存在FLASH)
//保存前15K的空间做为bootloader区
FLASH的开端地址是0x0800 0000,所以0x0800 0000~0x0800 3C00用于寄存Bootloader。
二、APP程序区。
完结中断向量表的重定位。工程装备下载方位
- intmain(void)
- {
- SCB->VTOR=FLASH_BASE|0x3C00;
- /*Infiniteloop*/
- while(1)
- {
- OSInit();
- OSTaskCreate(Start_Task,
- (void*)0,
- &Start_Task_Stk[START_TASK_STK_SIZE-1],
- START_TASK_PRIO);
- OSStart();
- return0;
- }
- }
在main函数,最开端处参加SCB->VTOR = FLASH_BASE | 0x3C00;这儿的0x3C00,即在bootloader中设定的Bootloader区域。
jlink下载的地址装备成开端地址是0x0800 3C00。 这样下载的时分不会把bootloader区域擦除。
最终在keil下, 别离下载bootloader , APP两个工程, 能够看到bootloader流水灯最终,APP程序被发动。
经过该试验,能够完结bootloader程序对APP的引导。后续能够再完结主机经过CAN发送数据给从机,从机更新APP数据到flash,即可完结晋级。
bootloader的示例代码,APP的代码在公司本来的工程上改,不便利奇怪,只需依照上面的阐明进行装备,即能够进行试验。