0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

YTM32B1MD1微控制器的boot swap機制和用法

安芯教育科技 ? 來源:安德魯?shù)脑O(shè)計筆記本 ? 2024-07-25 10:39 ? 次閱讀

Introduction

Pricinple & Machenisim

Application

基本的boot swap用例

不更新bootloader的情況

更新bootloader的情況

Conclusion

Introduction

客戶在開發(fā)量產(chǎn)型的ECU軟件時,大多會考慮實現(xiàn)OTA(在線更新)的功能,方便在將ECU設(shè)備裝車之后,可以利用通信過程更新固件。OTA的實現(xiàn)技術(shù)中,為了提升更新過程的安全性,避免在更新過程中因意外中斷導(dǎo)致整個ECU軟件系統(tǒng)崩潰,通常會考慮備份更新的方式,如果本次更新固件的過程被意外中斷,MCU仍可啟動至最近一次能夠正常運行的固件中,故而在MCU的片內(nèi)flash中實際會存放至少兩份程序,A程序和B程序。

這兩份程序存放在不同的存儲區(qū),在創(chuàng)建這些application程序時,需要分別調(diào)整linker地址,讓A程序和B程序映射到指定對應(yīng)不同的地址區(qū)才能正常運行。芯片在上電啟動后進入bootloader,經(jīng)過信息安全檢查、完整性檢查、有效性檢查等一些列判定條件之后,有選擇地跳轉(zhuǎn)到存放在不同地址的application程序。而在更新程序的時候,也要分別更新不同區(qū)域的程序。

為了簡化開發(fā)者和用戶區(qū)分application程序的A / B版本,有些專用于ECU的MCU,設(shè)計了硬件支持flash存儲的AB面交換功能(boot swap),對應(yīng)于兩塊獨立的但地址連續(xù)拼接的flash存儲器(pflash0和pflash1),可以通過軟件配置,指定哪塊flash存儲區(qū)被映射到0x0000_0000開始的位置。如此,將用于更新的固件application工程,其linker可以不做調(diào)整,始終為一份工程。在bootloader更新固件的過程中,將實際運行地址空間的程序,先寫到備份flash存儲區(qū)(例如flash的后半段)中,在更新成功完畢后,再執(zhí)行boot swap命令,將備份flash存儲區(qū)映射到實際運行的地址空間(例如,flash地址區(qū)間的前半段)。復(fù)位芯片后,就會從備份轉(zhuǎn)正的flash啟動,執(zhí)行新的application了。如此,兩個獨立的存儲區(qū)可互為備份。

Pricinple & Machenisim

以YTM32B1MD1微控制器為例,介紹boot swap的機制和用法。

YTM32B1MD1微控制片上集成了2片容量為256KB的flash,稱為pflash0和pflash1,總計512KB。默認情況下,pflash0被映射在0x0000_0000開始的地址空間,pflash1拼接在pflash0之后。當執(zhí)行了boot swap命令后,復(fù)位,pflash1的物理存儲被映射到0x0000_0000開始的地址空間,pflash0拼接在pflash1之后。

執(zhí)行boot swap命令的具體操作,就是向EFM模塊的CMD寄存器中,寫入boot swap的命令碼0x30。如圖x所示。

0f3392ca-4a1b-11ef-b8af-92fbcf53809c.png

圖x boot swap的命令碼

而在,EFM模塊的STS寄存器中,可以通過查看BOOT_INFO標志位,判定當前0x0000_0000開始的區(qū)域映射到哪塊pflash上。如圖x所示。

0f56bdc2-4a1b-11ef-b8af-92fbcf53809c.png

圖x boot_info標志位

切記,只有當芯片復(fù)位之后,新的設(shè)置才能生效。通常開發(fā)者可以在軟件中,執(zhí)行boot swap命令后,再調(diào)用NVIC_SystemReset()函數(shù)復(fù)位生效。

當然,如果不適用boot swap機制,兩塊拼接在一起的pflash存儲器,也可以作為一個地址連續(xù)的大存儲器。仍然可以適配一些使用回滾策略或者使用復(fù)制方式實現(xiàn)的FOTA等機制。

Application

這里提供了一個可運行的用例,展示boot swap的用法。同時還討論了一些同boot swap功能相結(jié)合的bootlaoder方案的策略。

基本的boot swap用例

在展示boot swap基本用法的用例中,在main()函數(shù)中編寫用例,在同一份代碼中,查看BOOT_INFO標志位,然后打印出來,告知開發(fā)者當前的程序(總是從0x0000_0000開始)運行在哪塊pflash上。

在運行用例時,需要進行兩次下載:第一次下載程序,下載到從0x0000_0000開始的pflash0中,運行程序后,0x0000_0000地址切換到pflash1上,此時,還需要再下載一次程序,程序會覆蓋到pflash1上。注意,第一次下載程序后運行,從pflash1開始啟動,pflash1此時沒有可執(zhí)行的程序,可能會出現(xiàn)“卡死”的狀態(tài)。

/*main.c*/

#include"board_init.h"

/*
*Functions.
*/
intmain(void)
{
BOARD_Init();

printf("efm_swap_bool_flash.
");

if(0u==(EFM_FLAG_BOOT_INFO&EFM_GetStatusFlags(BOARD_EFM_PORT)))
{
printf("bootfrompflash0.
");
}
else
{
printf("bootfrompflash1.
");
}

printf("pressanykeytolaunchtheEFM_SwapBootFlash()...
");
uint8_tch=getchar();
putchar(ch);/*echotocheckinput.*/

/*switchthebootflash.*/
EFM_SwapBootFlash(BOARD_EFM_PORT);

printf("EFM_SwapBootFlash()done.
");

printf("NVIC_SystemReset()

");
NVIC_SystemReset();

while(1)
{
}
}

進行了兩次下載之后,pflash0和pflash1上都存放了相同的一份程序。但運行時,每個pflash的程序會查閱BOOT_INFO標志位,從而打印不同的信息。如此相互交替。如圖x所示。

0f65eefa-4a1b-11ef-b8af-92fbcf53809c.png

圖x 運行efm_swap_boot_flash

不更新bootloader的情況

在支持A / B面的平臺上,設(shè)計bootloader + application的存儲結(jié)構(gòu)。為了確保程序總是從bootloader開始執(zhí)行,實際上是在兩個pflash的開始位置存放了兩個相同的bootloader,對應(yīng)跳轉(zhuǎn)到自己專屬的application。如圖x所示。如此,在一個pflash中執(zhí)行更新另一個pflash中的程序時,僅更新其中application的區(qū)域。在執(zhí)行boot swap和復(fù)位操作后,將會直接跳轉(zhuǎn)到相同的一份bootloader,并進一步跳轉(zhuǎn)到新的application,從而實現(xiàn)僅更新application的效果。

0f99c4e6-4a1b-11ef-b8af-92fbcf53809c.png

圖x 帶有bootloader的AB面存儲規(guī)劃

這里還討論了一種使用片上flash存放參數(shù)(模擬eeprom)的情形。當存放數(shù)據(jù)(以地址映射方式訪問)在pflash0上后,若執(zhí)行boot swap命令后,實際存放數(shù)據(jù)的內(nèi)存區(qū)域,其地址映射發(fā)生了變化。但在程序中,若仍使用原來的地址訪問數(shù)據(jù),則不會訪問到正確的存儲區(qū)。此時,如果仍想用一份固定的代碼,以“自適應(yīng)”的方式訪問之前存放數(shù)據(jù)的區(qū)域,一種可行的方式,是借助于BOOT_INFO標志位進行判斷。

uint32_teep0_base_addr=(BOOT_INFO=1)?0x3C000:0x1C000;
uint32_teep1_base_addr=(BOOT_INFO=0)?0x3C000:0x1C000;

更新bootloader的情況

如果進一步考慮更新bootloader的情況,就需要在更新策略上,在其中一個pflash中執(zhí)行更新另一個pflash程序的過程中,連帶這另一個pflash中的bootlaoder部分一起更新掉。如此,在執(zhí)行boot swap和復(fù)位操作后,將會直接跳轉(zhuǎn)到新的bootloader,從而實現(xiàn)更新bootloader的效果。

Conclusion

在有A / B分區(qū)的存儲平臺上,設(shè)計boot swap是為了實現(xiàn)備份程序和提升更新固件提供了便利。操作簡單,效果明顯。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16885

    瀏覽量

    349914
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1614

    瀏覽量

    147652
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7430

    瀏覽量

    163514
  • ecu
    ecu
    +關(guān)注

    關(guān)注

    14

    文章

    875

    瀏覽量

    54360

原文標題:YTM32的flash存儲器boot-swap功能詳解

文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    YTM32的LIN通信協(xié)議引擎LinFlexD外設(shè)模塊詳解

    YTM32微控制器的LINFlexD外設(shè)模塊,實現(xiàn)了LIN協(xié)議控制器的功能,可以支持LIN總線協(xié)議的主機和從機功能。
    的頭像 發(fā)表于 10-08 11:15 ?1810次閱讀
    <b class='flag-5'>YTM</b>32的LIN通信協(xié)議引擎LinFlexD外設(shè)模塊詳解

    貿(mào)澤電子開售面向便攜式電子應(yīng)用的 英飛凌EZ-PD PMG1-B1 USB Type-C高壓微控制器

    Type-C?微控制器。EZ-PD PMG1-B1微控制器為工程師提供一種集成式單芯片解決方案,適用于需要靈活安全的MCU和更少物料的高壓USB-C應(yīng)用,如電動工具、小家電、電動自行車等。 ? 貿(mào)澤電子供應(yīng)
    發(fā)表于 04-18 16:29 ?691次閱讀
    貿(mào)澤電子開售面向便攜式電子應(yīng)用的 英飛凌EZ-PD PMG<b class='flag-5'>1-B1</b> USB Type-C高壓<b class='flag-5'>微控制器</b>

    Cortex-M1微控制器和FPGA問答

    問答選編問:Cortex-M1微控制器有哪些接口資源?答:Cortex-M1處理掛在AHB總線上,AHB總線通過橋接邏輯可以掛APB總線,APB總線上可以掛的接口有IIC、UART、
    發(fā)表于 07-26 07:46

    微控制器IO口有什么用法?

    微控制器(MCU)IO口的一些用法
    發(fā)表于 03-17 06:29

    STM32G0B1xB/xC/xE微控制器的相關(guān)資料分享

    本文檔提供有關(guān) STM32G0B1xB/xC/xE 微控制器的信息,例如描述、功能概述、引腳分配和定義、電氣特性、封裝和訂購代碼。
    發(fā)表于 11-24 06:44

    PSoC 1 使用外部微控制器對 PSoC? 1 器件編程 (HSSP)-AN44168

    PSoC 1 使用外部微控制器對 PSoC? 1 器件編程 (HSSP)-AN44168
    發(fā)表于 10-10 16:10 ?7次下載
    PSoC <b class='flag-5'>1</b> 使用外部<b class='flag-5'>微控制器</b>對 PSoC? <b class='flag-5'>1</b> 器件編程 (HSSP)-AN44168

    瑞薩電子推出的RL78/I1x系列微控制器是RL78微控制器系列

    RL78/I1x和RL78 / H1x系列微控制器是基于瑞薩電子RL78 CPU內(nèi)核為核心構(gòu)建而成,其中RL78 / I1A系列是高分辨率PWM輸出的
    的頭像 發(fā)表于 08-01 08:29 ?6117次閱讀

    什么是微控制器?如何編程微控制器?

    微控制器進行編程或刻錄意味著“將程序從編譯傳輸?shù)?b class='flag-5'>微控制器的存儲”。微控制器的程序通常是用C或匯編語言編寫的,最后編譯
    的頭像 發(fā)表于 08-21 15:40 ?1w次閱讀

    微控制器MG74PG1B08英文數(shù)據(jù)手冊

    MG74PG1B08是一款基于高性能1-T架構(gòu)80C51 CPU的單片微控制器,該CPU具有以1~7個時鐘周期(約為標準8051設(shè)備的6-7倍)執(zhí)行指令,并具有8051兼容的指令集。因
    發(fā)表于 07-01 09:13 ?0次下載
    <b class='flag-5'>微控制器</b>MG74PG<b class='flag-5'>1B</b>08英文數(shù)據(jù)手冊

    微控制器CH32V1數(shù)據(jù)手冊

    電子發(fā)燒友網(wǎng)站提供《微控制器CH32V1數(shù)據(jù)手冊.pdf》資料免費下載
    發(fā)表于 09-09 15:11 ?4次下載
    <b class='flag-5'>微控制器</b>CH32V<b class='flag-5'>1</b>數(shù)據(jù)手冊

    英飛凌EZ-PD PMG1-B1 USB Type-C微控制器介紹

    EZ-PD PMG1-B1微控制器是高度集成的單端口USB-C供電 (PD) 解決方案。這些高電壓的可編程USB供電系統(tǒng)搭載集成式Arm Cortex (-M0/M0+) 處理、128KB閃存、16KB RAM和32KB RO
    發(fā)表于 04-18 16:32 ?631次閱讀

    云途正式發(fā)布量產(chǎn)版本AUTOSAR MCAL驅(qū)動軟件和配置工具

    云途MCAL軟件包RTM v1.1.0包含了YTM32B1ME05 和YTM32B1MD1兩個系列車規(guī)MCU的片上外設(shè)模塊的驅(qū)動程序代碼和MCAL驅(qū)動模塊所需的相應(yīng)樁模塊(stub module)的示例代碼,如Det、Dem、CanIf、LinIf、EcuC和EcuM等。
    的頭像 發(fā)表于 07-19 15:29 ?2506次閱讀
    云途正式發(fā)布量產(chǎn)版本AUTOSAR MCAL驅(qū)動軟件和配置工具

    YTM32的HA系列微控制器啟動過程詳解

    HA系列微控制器基于Arm Cortex-M7處理內(nèi)核,集成了Security Boot的功能。Security Boot的關(guān)鍵代碼集成在BOOT
    的頭像 發(fā)表于 07-15 09:24 ?341次閱讀
    <b class='flag-5'>YTM</b>32的HA系列<b class='flag-5'>微控制器</b>啟動過程詳解

    stm32boot0和boot1對應(yīng)哪個p引腳

    STM32系列微控制器是一種廣泛應(yīng)用于嵌入式系統(tǒng)領(lǐng)域的32位微控制器。在STM32系列微控制器中,BOOT0和BOOT1是兩個重要的引腳,它
    的頭像 發(fā)表于 08-22 09:40 ?2074次閱讀

    STM32引腳中的BOOT1在哪里

    STM32是STMicroelectronics(意法半導(dǎo)體)推出的一系列32位微控制器,廣泛應(yīng)用于嵌入式系統(tǒng)設(shè)計。關(guān)于STM32的BOOT1引腳,它主要與系統(tǒng)的啟動模式有關(guān)。 BOOT1引腳功能
    的頭像 發(fā)表于 08-22 09:43 ?1275次閱讀