STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决
IAP 是啥
??IAP( In Application Programming)即在應用編程,也就是用戶可以使用自己的程序對MCU的中的運行程序進行更新,而無需借助于外部燒寫器。其實ST官網也給出了IAP的示例程序,感興趣的可以直接去官網搜索。
??這里有一點需要特殊注意,就是在MCU中,有一個特殊區域被稱為 System memory。在這塊區域中存放了ST公司自己的 bootloader 程序,它是在MCU出廠時,有ST固化到芯片中的,后續不能再更改。其中的 bootloader 程序也可以對MCU進行升級(DFU對芯片的編程應該就是用的這個Bootloader)。而且,芯片不同,BootLoader的功能也是有區別的。ST官網對于這些也是有詳細文檔的,后續再寫篇文章介紹這一塊。下圖為部分芯片BootLoader版本及功能
STM32 MCU啟動配置
??要實現IAP,首先要了解一下MCU是如何啟動的。這一點在芯片的參考手冊中都有詳細的說明,不同的芯片手冊所在位置可能不同,但是一般在第二章會有單獨一節叫Boot configuration。如下圖:
主要就是說,啟動是通過管腳BOOT0和BOOT1的連接方式來控制的。這個是在硬件設計階段設計好的。不同的配置決定了,MCU將何處映射到0x00000000。從這里又可以看到一點,MCU眼里只有0x00000000。至于為啥可以從Flash(0x08000000)啟動,就是因為MCU內部做了映射。從其他位置啟動時同理。
IAP 實現
??要實現IAP,則整個程序實現分為大程序(APP)和小程序(IAP)兩部分。其中,APP主要接收升級數據并存儲,IAP處理擦除APP,并重新寫入升級數據。此外,IAP還應該可以獨立接收升級數據的情況。但是,由于Cortex-M0核是沒有中斷向量表偏移寄存器的,這就導致了在Cortex-M0核的MCU上實現在線升級比較麻煩。在實際產品中,整個程序的基本組成結構:
實際的IAP流程如下:
就是這么簡單!
注意:
(1)與 Cortex-M3 和 Cortex-M4 不同,Cortex-M0 沒有中斷向量表偏移寄存器(VTOR寄存器)
(2)Cortex-M3 r2p0 及其之前版本,中斷向量表只能位于SRAM或者CODE區域,但是Cortex-M3 r2p1及之后,Cortex-M4 沒有該限制!
(3)MCU根據Boot引腳配置將指定地址映射為0x地址!
IAP 啟動
??啟動網上有很多文章介紹,但是或多或少不是很完善,我只做了一張相對來說比較詳細的圖,如下:
??Cortex-M內核規定,中斷向量表開始的4個字節存放的是堆棧棧頂的地址,其后是中斷向量表各中斷服務程序的地址。當發生中斷后程序通過查找該表得到相應的中斷服務程序入口地址,然后再跳到相應的中斷服務程序中執行,中斷服務程序中最終調用用戶實現的各函數。例如:main函數就是復位中斷服務函數中調用的!
??在沒有IAP時,上電后從0x08000004處取出復位中斷向量的地址,然后跳轉到復位中斷程序的入口(標號①所示),執行結束后跳轉到main函數中(標號②所示)。通常main函數是個死循環,不會退出。在執行main函數的過程中發生中斷,則STM32強制將PC指針指回中斷向量表處(標號④所示),從中斷向量表中找到相應的中斷函數入口地址,跳轉到相應的中斷服務函數(標號⑤所示),執行完中斷函數后再返回到main函數中來(標號⑥所示)。
??在添加IAP后,上電后仍然從0x08000004處取出復位中斷向量的地址,然后跳轉到復位中斷程序的入口(標號①所示),執行結束后跳轉到小程序的main函數中(標號②所示)。在執行小程序main函數的過程中發生中斷,則STM32強制將PC指針指回中斷向量表處(標號④所示),從中斷向量表中找到相應的中斷函數入口地址,跳轉到相應的中斷服務函數(標號⑤所示),執行完中斷函數后再返回到main函數中來(標號⑥所示)。而想要大程序執行,則必須在小程序中顯示強制跳轉(標號⑦)。
??在大程序的main函數的執行過程中,如果CPU得到一個中斷請求,由于我們設置了中斷向量表偏移量為N+M,因此PC指針被強制跳轉到0x08000004+N+M處的中斷向量表中得到相應的中斷函數地址,再跳轉到相應新的中斷服務函數,執行結束后返回到main函數中來。
??需要注意的是,復位中斷比較特殊。產生復位后,PC的值會被硬件強制置為0x08000004。因為,在發生復位后,負責中斷向量偏移的寄存器VTOR變為了0,因此,復位后的中斷就變為了0x08000004。而其他中斷發生時,VTOR為已經設置好的終端向量表偏移。
程序實現
??有了上面的介紹,實現就比較簡單了!其實我有設計了一套適用于全部STM32芯片的IAP模板,但是屬于公司產品,不方便對外公布!簡單說幾個重點:
總結
以上是生活随笔為你收集整理的STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 之七 备份域(备份寄存器、备
- 下一篇: 常用算法 之一 详解 MD5 实现(基于