STM32學(xué)習(xí)記錄18 IAP(1)
總體需求就是,主機(jī)Master通過CAN接口,發(fā)送數(shù)據(jù)給從機(jī)Slave。從機(jī)在接收到應(yīng)用程序APP后,把接收的數(shù)據(jù)覆蓋掉原來的應(yīng)用程序區(qū)。從而實(shí)現(xiàn)Master對Slave的在線升級。
本文引用地址:http://www.ex-cimer.com/article/201611/316195.htm這里先介紹IAP,對IAP的整體實(shí)現(xiàn)有個(gè)了解,方便后續(xù)開發(fā)。參考了原子STM32開發(fā)板,對IAP功能的介紹。
要實(shí)現(xiàn)IAP,需要有兩個(gè)項(xiàng)目代碼。第一個(gè)稱之為Bootloader程序,第二個(gè)稱之為APP程序。Bootloader負(fù)責(zé)引導(dǎo)APP程序啟動(dòng),以及需要在線更新APP時(shí),接收主機(jī)發(fā)送的APP文件,將接收的APP覆蓋掉原來的APP。
關(guān)于IAP的具體內(nèi)容,可以參考原子STM32開發(fā)板的開發(fā)指南的五十三章。
下面是自己對IAP有大概了解之后,進(jìn)行的實(shí)驗(yàn)。1,編寫bootloader程序測試程序,用來引導(dǎo)指定位置的APP。2,修改原來的一個(gè)應(yīng)用程序,使之可以用該bootloader引導(dǎo)。3,通過jlink下載器,分別下載bootloader和APP。
一,bootloader程序。
主要代碼如下,流水燈之后,執(zhí)行跳轉(zhuǎn)到APP區(qū)域的命令
- intmain(void)
- {
- delay_init();
- LED_Init();
- LED1=0;
- delay_ms(200);//延時(shí)
- LED2=0;
- delay_ms(200);//延時(shí)
- LED3=0;
- delay_ms(200);//延時(shí)
- LED4=0;
- delay_ms(200);//延時(shí)
- LED1=1;
- delay_ms(200);//延時(shí)
- LED2=1;
- delay_ms(200);//延時(shí)
- LED3=1;
- delay_ms(200);//延時(shí)
- LED4=1;
- delay_ms(200);//延時(shí)
- iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASHAPP代碼
- }
- #defineFLASH_APP1_ADDR0x08003C00//第一個(gè)應(yīng)用程序起始地址(存放在FLASH)
//保留前15K的空間做為bootloader區(qū)
二、APP程序區(qū)。
完成中斷向量表的重定位。工程配置下載位置
- 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;
- }
- }
jlink下載的地址配置成起始地址是0x0800 3C00。 這樣下載的時(shí)候不會(huì)把bootloader區(qū)域擦除。
最后在keil下, 分別下載bootloader , APP兩個(gè)工程, 可以看到bootloader流水燈最后,APP程序被啟動(dòng)。
評論