新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32 IAP 設計實例 (一)

        STM32 IAP 設計實例 (一)

        作者: 時間:2016-11-19 來源:網絡 收藏
        項目需要,需要開發(fā)一款手持設備,對產品進行軟件升級。現(xiàn)在的產品都是使用STM32,所以可以很方便的應用STM32的 IAP功能對軟件進行在線升級。

        總體需求就是,主機Master通過CAN接口,發(fā)送數(shù)據給從機Slave。從機在接收到應用程序APP后,把接收的數(shù)據覆蓋掉原來的應用程序區(qū)。從而實現(xiàn)Master對Slave的在線升級。

        本文引用地址:http://www.104case.com/article/201611/318460.htm

        這里先介紹IAP,對IAP的整體實現(xiàn)有個了解,方便后續(xù)開發(fā)。參考了原子STM32開發(fā)板,對IAP功能的介紹。

        要實現(xiàn)IAP,需要有兩個項目代碼。第一個稱之為Bootloader程序,第二個稱之為APP程序。Bootloader負責引導APP程序啟動,以及需要在線更新APP時,接收主機發(fā)送的APP文件,將接收的APP覆蓋掉原來的APP。

        關于IAP的具體內容,可以參考原子STM32開發(fā)板的開發(fā)指南的五十三章。

        下面是自己對IAP有大概了解之后,進行的實驗。1,編寫bootloader程序測試程序,用來引導指定位置的APP。2,修改原來的一個應用程序,使之可以用該bootloader引導。3,通過jlink下載器,分別下載bootloader和APP。

        一,bootloader程序。

        主要代碼如下,流水燈之后,執(zhí)行跳轉到APP區(qū)域的命令

        [cpp]view plaincopy
        1. intmain(void)
        2. {
        3. delay_init();
        4. LED_Init();
        5. LED1=0;
        6. delay_ms(200);//延時
        7. LED2=0;
        8. delay_ms(200);//延時
        9. LED3=0;
        10. delay_ms(200);//延時
        11. LED4=0;
        12. delay_ms(200);//延時
        13. LED1=1;
        14. delay_ms(200);//延時
        15. LED2=1;
        16. delay_ms(200);//延時
        17. LED3=1;
        18. delay_ms(200);//延時
        19. LED4=1;
        20. delay_ms(200);//延時
        21. iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASHAPP代碼
        22. }
        [cpp]view plaincopy
        1. #defineFLASH_APP1_ADDR0x08003C00//第一個應用程序起始地址(存放在FLASH)
        2. //保留前15K的空間做為bootloader區(qū)
        FLASH的起始地址是0x0800 0000,所以0x0800 0000~0x0800 3C00用于存放Bootloader。

        二、APP程序區(qū)。

        完成中斷向量表的重定位。工程配置下載位置

        [cpp]view plaincopy
        1. intmain(void)
        2. {
        3. SCB->VTOR=FLASH_BASE|0x3C00;
        4. /*Infiniteloop*/
        5. while(1)
        6. {
        7. OSInit();
        8. OSTaskCreate(Start_Task,
        9. (void*)0,
        10. &Start_Task_Stk[START_TASK_STK_SIZE-1],
        11. START_TASK_PRIO);
        12. OSStart();
        13. return0;
        14. }
        15. }
        在main函數(shù),最開始處加入SCB->VTOR = FLASH_BASE | 0x3C00;這里的0x3C00,即在bootloader中設定的Bootloader區(qū)域。

        jlink下載的地址配置成起始地址是0x0800 3C00。 這樣下載的時候不會把bootloader區(qū)域擦除。

        最后在keil下, 分別下載bootloader , APP兩個工程, 可以看到bootloader流水燈最后,APP程序被啟動。

        通過該實驗,可以實現(xiàn)bootloader程序對APP的引導。后續(xù)可以再實現(xiàn)主機通過CAN發(fā)送數(shù)據給從機,從機更新APP數(shù)據到flash,即可實現(xiàn)升級。

        bootloader的示例代碼,APP的代碼在公司原來的工程上改,不方便公開,只要按照上面的說明進行配置,即可以進行實驗。



        關鍵詞: STM32IA

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 苍山县| 泾川县| 巫溪县| 鹤庆县| 若尔盖县| 武陟县| 富川| 二连浩特市| 收藏| 天门市| 普安县| 镇雄县| 天津市| 五台县| 辽宁省| 嵊州市| 桦川县| 托克托县| 曲阜市| 临安市| 洪洞县| 蒲城县| 中方县| 凤城市| 南岸区| 进贤县| 融水| 淄博市| 景谷| 溆浦县| 久治县| 开封市| 错那县| 乌兰察布市| 南部县| 宜兰市| 长子县| 闵行区| 开化县| 延津县| 金溪县|