• 正文
    • 一、搭建硬件平臺(tái)
    • 二、軟件代碼設(shè)計(jì)
    • 三、在板卡上測(cè)試
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

一種多MCU分時(shí)復(fù)用Flash啟動(dòng)的創(chuàng)新方法(下)

06/05 16:02
412
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是多個(gè)i.MXRT共享一顆Flash啟動(dòng)的方法。

在?《多個(gè)i.MXRT共享一顆Flash啟動(dòng)的方法與實(shí)踐(上)》?一文里痞子衡給大家從理論上介紹一種多 i.MXRT 共享 Flash 啟動(dòng)的方法,但是理論雖好,如果沒(méi)有經(jīng)過(guò)實(shí)踐驗(yàn)證切實(shí)可行,不過(guò)是紙上談兵,所以今天痞子衡就找了兩個(gè) i.MXRT 開(kāi)發(fā)板來(lái)具體實(shí)操這種方法:

一、搭建硬件平臺(tái)

理論上任意兩塊 i.MXRT 開(kāi)發(fā)板均可以用作硬件測(cè)試平臺(tái)(這里僅考慮一主一從,至于一主多從原理差不多),但是痞子衡手頭 MIMXRT1010-EVK_Rev.C 開(kāi)發(fā)板較多,就選用它來(lái)做測(cè)試吧,痞子衡對(duì)硬件做了如下改動(dòng):

    去除從板上 U13 - Flash保留主板上 U13 - Flash,并且飛線(xiàn)連接到從板 U13(低速啟動(dòng)僅需 CS, SCLK, IO0, IO1)主板主芯片 GPIO_11 信號(hào)(R1870 靠主芯片端,非 D25 LED 端)連到從板主芯片 POR_B(SW3 的 Pin3/4)

二、軟件代碼設(shè)計(jì)

有了硬件平臺(tái),現(xiàn)在開(kāi)始設(shè)計(jì)代碼。為了簡(jiǎn)單起見(jiàn),主從 i.MXRT 共用一份 App(可以在條件分支里做區(qū)分)。因?yàn)?Flash 是共享的,所以 App 必須是 Non-XIP 性質(zhì)。要讓芯片 BootROM 去支持 Non-XIP 啟動(dòng),得使用專(zhuān)用上位機(jī)工具(比如痞子衡的 MCUBootUtility 或者恩智浦官方 SPT )來(lái)下載程序鏡像文件,這樣稍微麻煩一點(diǎn)。為了避免下載程序的麻煩,我們可以簡(jiǎn)單設(shè)計(jì)一個(gè) boot_loader 工程來(lái)拷貝和跳轉(zhuǎn) boot_app 程序。

    代碼倉(cāng)庫(kù):https://github.com/JayHeng/func-imxrt-flexspi-share-flash-boot-multiple-mcu
兩個(gè)工程路徑:
/boards/evkmimxrt1010/demo_apps/boot_loader
/boards/evkmimxrt1010/demo_apps/boot_app
2.1 boot_loader 工程設(shè)計(jì)

boot_loader 工程是一個(gè) XiP 工程,由芯片 BootROM 直接啟動(dòng)。我們可以直接基于 SDK 里的 hello_world 來(lái)修改(flexspi_nor target),先對(duì)它的啟動(dòng)頭 FCB 做如下修改(1-bit SPI 30MHz Normal Read Mode):

boot_app 工程是一個(gè) Non-XiP 工程,也可以基于 SDK 里的 hello_world 來(lái)修改(debug target),它生成的 binary 直接導(dǎo)入到 boot_loader 工程里,具體方法可參見(jiàn) 《i.MXRT雙核工程調(diào)試的三種方法(IAR篇)》 一文里的?2.3 通用方法:雙核工程有關(guān)聯(lián),主核加載從核?小節(jié),這里不再贅述。

boot_loader 工程里有了 boot_app 數(shù)據(jù)以及鏈接地址,拷貝和跳轉(zhuǎn)函數(shù)設(shè)計(jì)就比較簡(jiǎn)單了,都是通用代碼。最終調(diào)穩(wěn)定的 boot_loader 工程可以直接在 IDE 里下載到 Flash 里運(yùn)行(需調(diào)試器連接到主板 SWD 口)。

2.2 boot_app 工程設(shè)計(jì)

現(xiàn)在來(lái)到最核心的 boot_app 工程設(shè)計(jì),工程還是基于 hello_world,可以從串口接收簡(jiǎn)單的字符指令(A,B...)來(lái)做不同測(cè)試,目前設(shè)計(jì)了六個(gè)測(cè)試指令:

字符指令 A(僅適用主 i.MXRT)- 將 GPIO_11 輸出電平由低變高控制 POR_B 信號(hào)以釋放從 i.MXRT
字符指令 B(僅適用主 i.MXRT)- 將 GPIO_11 輸出電平由高變低控制 POR_B 信號(hào)以復(fù)位保持從 i.MXRT
字符指令 C(適用主/從i.MXRT)- 初始化 Flash 相關(guān)引腳為 FlexSPI 功能
字符指令 D(適用主/從i.MXRT)- 恢復(fù) Flash 相關(guān)引腳為默認(rèn) GPIO 狀態(tài)
字符指令 E(適用主/從i.MXRT)- 以一線(xiàn)模式擦寫(xiě)讀 U13 Flash
字符指令 F(僅適用從 i.MXRT)- 用定時(shí)器不斷翻轉(zhuǎn) GPIO_11 來(lái)驅(qū)動(dòng) D25 LED 閃爍

這里需要特別說(shuō)一下指令 A 和 E,這里面涉及到主/從 i.MXRT 芯片 FlexSPI 引腳共同驅(qū)動(dòng)一個(gè) Flash 的沖突問(wèn)題。當(dāng)主 i.MXRT 執(zhí)行 A 指令來(lái)釋放從 i.MXRT 時(shí),需要先執(zhí)行 D 指令(即調(diào)用如下函數(shù))將 FlexSPI 引腳恢復(fù)到上電默認(rèn) GPIO 狀態(tài)(BootROM 啟動(dòng)時(shí)已將這些引腳配置成了 FlexSPI 功能),否則從 i.MXRT 可能無(wú)法正常從 Flash 啟動(dòng)。

void?bsp_deinit_flexspi_pins(void)?
{
? ? IOMUXC_SetPinMux(IOMUXC_GPIO_SD_06_GPIO2_IO06,?0U);?
? ? IOMUXC_SetPinMux(IOMUXC_GPIO_SD_07_GPIO2_IO07,?0U);?
? ? IOMUXC_SetPinMux(IOMUXC_GPIO_SD_09_GPIO2_IO09,?0U);?
? ? IOMUXC_SetPinMux(IOMUXC_GPIO_SD_10_GPIO2_IO10,?0U);
? ? IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_06_GPIO2_IO06,?0x10A0U);
? ? IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_07_GPIO2_IO07,?0x10A0U);
? ? IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_09_GPIO2_IO09,?0x10A0U);
? ? IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_10_GPIO2_IO10,?0x10A0U);
}

C 指令和 E 指令顯然是結(jié)伴而行的,當(dāng)從 i.MXRT 執(zhí)行過(guò) C,E 指令且仍處于激活狀態(tài)時(shí),如果主 i.MXRT 想正常執(zhí)行 C,E 指令,要么先執(zhí)行 B 指令直接將從 i.MXRT 復(fù)位保持住(FlexSPI 相關(guān)引腳配置也自動(dòng)復(fù)位了),要么讓從 i.MXRT 先執(zhí)行下 D 指令。

三、在板卡上測(cè)試

現(xiàn)在給板卡供電,將包含 boot_app 的 boot_loader 程序下載進(jìn) Flash,主板串口是 COM43,從板串口是 COM50,我們做一個(gè)快速測(cè)試,給主板直接發(fā)送 A 指令發(fā)現(xiàn)從板沒(méi)有啟動(dòng),但是執(zhí)行過(guò) D 指令后再發(fā)送 A 指令,這時(shí)候從板就正常啟動(dòng)了。此外主/從板也都能對(duì) Flash 進(jìn)行正常擦寫(xiě),這證明我們的創(chuàng)新連接方法是切實(shí)可行的。

至此,多個(gè)i.MXRT共享一顆Flash啟動(dòng)的方法痞子衡便介紹完畢了,掌聲在哪里~~~

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶(hù)資源
  • 寫(xiě)文章/發(fā)需求
立即登錄

碩士畢業(yè)于蘇州大學(xué)電子信息學(xué)院,目前就職于恩智浦(NXP)半導(dǎo)體MCU系統(tǒng)部門(mén),擔(dān)任嵌入式系統(tǒng)應(yīng)用工程師。痞子衡會(huì)定期分享嵌入式相關(guān)文章