日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决

發布時間:2024/10/14 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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模板,但是屬于公司產品,不方便對外公布!簡單說幾個重點:

  • 使用 分散加載文件 實現起來會比較方便
  • 對于沒有中斷向量表偏移寄存器的MCU(主要是Cortex-M0核),一般采用將中斷向量表復制到指定位置的內存中的方式實現:
  • 使用分散加載文件在內存中指定一塊區域:
  • #if (defined ( __CC_ARM ))__IO uint32_t VectorTable[48] __attribute__((section("SECTION_APP_VECTOR")));#elif (defined (__ICCARM__))#pragma location = 0x20000000__no_init __IO uint32_t VectorTable[48];#elif defined ( __GNUC__ )__IO uint32_t VectorTable[48] __attribute__((section(".RAMVectorTable")));#elif defined ( __TASKING__ )__IO uint32_t VectorTable[48] __at(0x20000000);#endif
  • 將APP的終端向量表復制到以上位置,設置中斷向量表重映射
  • static void SetVectorTable(void) {int i;/*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startupfile (startup_stm32f0xx.s) before to branch to application main.To reconfigure the default setting of SystemInit() function, refer tosystem_stm32f0xx.c file*/ /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/ /* Copy the vector table from the Flash (mapped at the base of the application load address 0x08003000) to the base address of the SRAM at 0x20000000. */for(i = 0; i < 48; i++){VectorTable[i] = *(__IO uint32_t*)(APP_SPACE_ADDR + (i<<2));}/* Enable the SYSCFG peripheral clock */RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* 注意:ST官方例程使用 RCC_APB2PeriphResetCmd是不對的 *//* Remap SRAM at 0x00000000 */SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM); }
  • 在由 IAP 跳轉到 APP 時,一定注意把 IAP 中開啟的外設全部關閉,否則在剛進入 APP中時,如果產生中斷將導致死機等問題。 包括 SysTic 中斷!!!包括 SysTic 中斷!!!包括 SysTic 中斷!!!這里可以做測試:
  • 測試一:IAP 中開啟串口,然后用上位機不停的發送數據,在發送數據過程中執行 IAP 跳轉 APP
  • 將 SysTick 中斷 配置時間很短(微秒級別),當程序跳轉到 APP 后,會出現 先產生 SysTick 中斷,然后才會到 main 函數。此時如果 SysTick 中斷中有相關代碼,將導致出現錯誤!
  • STM32 的 back SRAM 在 IAP 中和 APP 中都初始化時,將導致 APP中的初始化不起作用。如果 IAP 中有使用,則在跳轉 APP前必須反初始化。
  • 總結

    以上是生活随笔為你收集整理的STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩一级淫片 | 国产情侣久久 | 亚洲一区二区三区麻豆 | 欧美一级片免费观看 | 免费在线观看av的网站 | 操人网 | www狠狠操 | 亚洲aa在线 | av影视天堂 | 九月丁香婷婷 | 亚洲欧美国产精品久久久久久久 | 性欧美大战久久久久久久免费观看 | 久久视频免费看 | 原神女裸体看个够无遮挡 | 色爱AV综合网国产精品 | 色中文网 | 欧美日比视频 | 欧美黄色一区二区三区 | 黄色片亚洲| 青青青视频在线播放 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 精品人妻无码一区二区色欲产成人 | 精品爆乳一区二区三区无码av | 无码人妻丰满熟妇啪啪欧美 | 日本成人网址 | 日本护士体内she精2xxx | 美国三级视频 | 九草影院| 成人久久精品人妻一区二区三区 | 九九综合久久 | 久久精品久久久久久久 | 古装做爰无遮挡三级聊斋艳谭 | 涩涩视频软件 | 天堂综合网 | 亚洲少妇网 | 香蕉福利| 亚洲伦理一区二区 | 久久亚洲综合国产精品99麻豆精品福利 | 欧美肥妇bwbwbwbxx | 久久综合亚洲色hezyo国产 | 打开免费观看视频在线播放 | 91啪在线| 女人18毛片水真多18精品 | www.国产精品视频 | 久久综合国产 | 一区中文字幕 | 日日摸夜夜添狠狠添欧美 | 最新av不卡| 玖玖视频| 青青草视频免费看 | 成人日韩欧美 | 国产亚洲精品自拍 | 国产高清成人 | 日本一本在线 | 超碰蜜臀 | 国产不卡av在线播放 | 中文字幕第2页 | 久久77777 | 亚洲h动漫| 91看片成人 | 天堂av资源在线 | 亚洲黄片一区二区 | 无遮挡无掩盖网站 | 国产成人久久精品麻豆二区 | 秋霞影院一区二区 | 欧美少妇xx| 亚洲av综合色区无码另类小说 | 日韩一区二区精品 | 国产人妖ts重口系列网站观看 | 国产蜜臀在线 | 少妇久久久久久被弄到高潮 | 亚洲免费播放 | 中国美女黄色 | 欧美一级一区 | 日韩激情免费 | 欧美日韩国产三区 | 亚洲毛片一区二区 | 成人免费毛片网站 | 美女网站全黄 | 亚洲视频91 | 午夜黄色在线观看 | 青青草综合在线 | 捆绑无遮挡打光屁股 | 亚洲一区在线免费 | 免费成人黄色 | 欧美xxxx在线 | 国产精品情侣 | 青春草av | 911亚洲精品| 亚欧在线播放 | 美女伦理水蜜桃4 | 天天操你 | 色噜噜一区二区三区 | 欧美双性人妖o0 | 亚洲丁香色 | 嫩草视频一区二区三区 | 久久久久麻豆v国产精华液好用吗 | 无码人妻丰满熟妇啪啪网站 | av999|