精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

i.MX RT1170上串行NOR Flash雙程序可交替啟動設計

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 作者:恩智浦MCU加油站 ? 2022-04-28 09:55 ? 次閱讀

在前一篇文章 《i.MX RT1060/1010上串行NOR Flash冗余程序啟動設計》里,我詳細介紹了i.MX RT10xx上的冗余程序啟動設計,本質上這就是個雙備份程序啟動, NORFlash里存兩份一樣的image,物理地址靠前的image 0啟動失效就繼續啟動后面的image 1,多一層保障。

i.MX RT1170是區別于i.MX RT10xx的第二代架構,性能/功能更加強大,其在繼承 i.MX RT10xx冗余程序啟動的基礎上,新增了雙程序可交替啟動設計,今天我們就來聊聊這個話題

一、初識雙程序可交替啟動

與i.MX RT10xx一樣,這里要聊的還是在一片掛載在FlexSPI上的串行NOR Flash里做冗余/雙程序設計,就是下圖中的image L和image H,不涉及LPSPI接口Flash B里的image 2。

ff746c68-c689-11ec-bce3-dac502259ad0.png

先說跟i.MX RT10xx上一樣的冗余程序啟動流程,i.MX RT1170上電先啟動物理地址靠前的image L,如果image L被破壞了,則繼續啟動image H。

什么是雙程序可交替啟動呢?簡單說就是物理地址靠前的image L并不總是上電首先啟動的image,在i.MX RT1170上新增了如下原型的image version啟動頭(在固定偏移 0x600 處),芯片上電 BootROM 會嘗試判斷兩個 image L/H 里的 version 頭版本,高版本的 image 優先被啟動。這種設計方便了 OTA 升級。

  • Note: 當image L/H中均不含有效version啟動頭時(img_ver 等于 0xFFFFFFFF,或者高低16bit不符合取反關系),雙程序可交替啟動特性就不生效,此時等效于冗余程序啟動,image L 永遠被優先啟動。

typedefstruct
{
uint16_tversion;//版本值
uint16_tinversion;//version值的取反(~version)
}img_ver_t;

ff93e25a-c689-11ec-bce3-dac502259ad0.png

二、回顧冗余程序啟動

在測試雙程序可交替啟動新特性之前,還是先過一下冗余程序啟動。按照文章《i.MX RT1060/1010上串行NOR Flash冗余程序啟動設計》第2節里一模一樣的方法,在恩智浦官方MIMXRT1170-EVK開發板上做測試,這個板子FlexSPI1上掛了兩片Flash,默認連接的16MB QuadSPI Flash,還有一片 64MB OctalFlash(需要做板子改動才能使能)。

在 i.MX RT1170 fuse 里關于冗余程序啟動的使能位定義與i.MX RT10xx上差不多,只不過 fuse 地址從 0x6E0 換到了0xC80。還是跟之前測試一樣借助MCUBootUtility工具將 FLEXSPI_NOR_SEC_IMAGE_OFFSET 燒錄為 0x10,xSPI_FLASH_IMAGE_SIZE 保持默認 0,即第二份 image 偏移地址在 Flash 0x400000(4MB)處,最大 image 長度也是4MB。

ffb71b1c-c689-11ec-bce3-dac502259ad0.png

繼續用SDK_2.11.0_MIMXRT1170-EVKoardsevkmimxrt1170demo_appsled_blinkycm7iarflexspi_nor_debug例程生成兩個稍微不一樣的 image,閃燈間隔時間一個是200ms(image L - iled_blinky_cm7_delay200ms.bin),另一個是 2s(image H - iled_blinky_cm7_delay2s.bin)。在 MCUBootUtility 工具主界面下使用 All-In-One 操作將 image L 下載進 Flash(baseaddress 設為 0x30000400),使用通用編程器界面 Write 操作將 image H 也下載進 Flash(Start 設為0x400400)。

現在Flash 里有了兩份 image,當第一份 image 啟動失敗后,i.MX RT1170 BootROM 不是立刻去執行下一份 image ,還是那個取巧的方法,在一個軟復位不置位的寄存器里(SRC_GPR10)標記當前狀態,然后調用 NVIC_SystemReset() 重新進入 BootROM 執行。不過此時標記位從 GPR10[30] 換到了 GPR10[27:26],雖然是 2bit 狀態,但設值 1/2/3 等效于設值 1,因為對于串行 NOR Flash 最多就是兩份 image。這時候如果你想掛 J-Link 改寫 SRC_GPR10 去做快速驗證恐怕無法如愿,原因請看《i.MX RT1170上用J-Link連接復位后PC總是停在0x223104》

ffd3fb10-c689-11ec-bce3-dac502259ad0.png

所以在i.MX RT1170上只能老老實實做破壞 image 完整性的動作來驗證冗余程序啟動,經實測其效果與i.MX RT10xx 是完全一致的。

三、實測雙程序可交替啟動

現在我們開始實測雙程序可交替啟動,主要的工作量就是為 image L 和 image H 添加 version 啟動頭,并且將它們分別下載進 Flash。因為我們想驗證物理地址靠后的 image H 比 image L 優先啟動(冗余程序啟動做不到這點),所以需要將 image H 的 version 頭版本設高一點。

3.1 為 image 添加version 啟動頭

還是在SDK_2.11.0_MIMXRT1170-EVKoardsevkmimxrt1170demo_appsled_blinkycm7iarflexspi_nor_debug例程基礎上,首先在工程鏈接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 添加如下語句,指定 .img_ver 段的位置。

define symbol m_boot_img_ver_start = 0x30000600;

place at address mem: m_boot_img_ver_start { section .img_ver };

然后在工程隨便一個源文件里添加如下常量 s_bt_img_l_ver 定義,這個 image 閃燈間隔時間是 200ms(image L -iled_blinky_cm7_delay200ms_ver0.bin),版本是 0x0000(注意編譯鏈接工程時為防止 s_bt_img_l_ver 被優化,可以在工程選項 Linker / Input /Keep symbols 里將其添加進去)。

constimg_ver_ts_bt_img_l_ver@".img_ver"={
.version=0x0000,
.inversion=~0x0000,
};

同樣的工程,再生成另一個閃燈間隔時間為 2s(image H -iled_blinky_cm7_delay2s_ver1.bin) 的 image 時使用如下常量s_bt_img_h_ver 定義,版本是 0x0001。

constimg_ver_ts_bt_img_h_ver@".img_ver"={
.version=0x0001,
.inversion=~0x0001,
};

當然如果你嫌上述方法繁瑣,也可以直接在最終 image binary 文件上做修改(注意 offset 位置一定要找對,i.MX RT1170 SDK XIP binary 文件起始數據對應 Flash 偏移是 0x400,因此文件中 0x200 處才對應 Flash 偏移 0x600):

0005e3f0-c68a-11ec-bce3-dac502259ad0.png

3.2 下載含 version 頭的image 進 Flash

現在需要借助 MCUBootUtility 工具的通用編程器功能分別將兩個含 version 頭的 image L/H 下載進 Flash。這里需要注意的是此時 image L 無法再通過主界面 All-In-One 操作來下載了,因為工具 v3.4 版本及以下沒有對 version 啟動頭做識別處理,因此會丟掉 version 頭數據(這個考慮會在 v4.0 之后加入支持)。

0031caba-c68a-11ec-bce3-dac502259ad0.png

005fa5de-c68a-11ec-bce3-dac502259ad0.png

兩個 image下載完成,一切工作就結束了,這時候你調整芯片啟動模式到 2'b10 - Flash boot,給板卡重新上電,應該可以看到 image H 正在執行。

3.3 BootROM中判斷version的邏輯

BootROM中關于 version 啟動頭是否有效以及版本高低判斷邏輯其實是有一點復雜的,這里把具體代碼分享給大家,方便大家為 image 設置有效的 version 頭以及正確使能這個雙程序可交替啟動特性。

判斷邏輯代碼主要意思是僅當 image L 的版本不是 0xFFFFFFFF 且 image H 的版本是有效的(img_ver 高低16bit符合取反關系)情況下,如果 image L 版本無效或者 image L 版本有效但比 image H 版本低,則物理地址靠后的 image H 優先啟動。除此以外其余情況,一律是物理地址靠前的 image L 優先啟動。

uint32_t image_l_base = FlexSPIx_AMBA_BASE
uint32_t image_h_base = FlexSPIx_AMBA_BASE + FLEXSPI_NOR_SEC_IMAGE_OFFSET

uint32_t get_image_index(void)
{
    uint32_t redundant_boot = ((SRC->GPR[9] & 0x0C000000) >> 26);

    static uint32_t image_index[] = { 0, 0 };
    img_ver_t image_l_version = *(img_ver_t *)(image_l_base + 0x600);
    img_ver_t image_h_version = *(img_ver_t *)(image_h_base + 0x600);
    if ((image_l_version.version != 0xFFFFu || image_l_version.inversion != 0xFFFFu) &&
        ((0xFFFFu & image_h_version.version) == (0xFFFFu ^ image_h_version.inversion)) &&
        ((0xFFFFu & image_l_version.version) != (0xFFFFu ^ image_l_version.inversion) || (image_l_version.version < image_h_version.version)))
    {
        image_index[0] = 1;
    }
    else
    {
        image_index[1] = 1;
    }

    return image_index[redundant_boot];
}

痞子衡在MIMXRT1170-EVK 開發板上對image 版本設置情況也做了比較全面的實測,測試結果如下:

008675f6-c68a-11ec-bce3-dac502259ad0.png

四、一些關于image的注意事項

  1. 雖然文中所有的測試均是針對 XIP image,但這個冗余程序/雙程序可交替啟動特性對于 Non-XIP image 也同樣適用。
  2. 如果是 XIP image,其鏈接地址不一定要固定在偏移 0x2000 處,因為 IVT 的存在,其是可以鏈接在偏移 0x2000 之后的任意位置的。
  3. 如果是 Non-XIP image,在 SDK 包里無法直接生成含啟動頭的 Non-XIP image binary,這時候可以先使用 MCUBootUtility 主界面的 All-In-One 操作下載一次 image,再通過通用編程器界面 Read 操作讀回來便是含啟動頭的 Non-XIP image binary。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 冗余
    +關注

    關注

    1

    文章

    109

    瀏覽量

    20181
  • 串行
    +關注

    關注

    0

    文章

    237

    瀏覽量

    33792

原文標題:i.MX RT1170上串行NOR Flash雙程序可交替啟動設計

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于NXP MCXA153 MCU實現RT-Thread的MTD NOR Flash驅動

    在嵌入式系統中,片Flash存儲器是一個關鍵組件,用于存儲程序代碼和關鍵數據。本文將詳細介紹如何在NXPMCXA153 MCU實現RT-
    的頭像 發表于 11-09 14:00 ?275次閱讀
    基于NXP MCXA153 MCU實現<b class='flag-5'>RT</b>-Thread的MTD <b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>驅動

    NXP專為邊緣AI打造的i.MX RT700跨界MCU到底強在哪?

    500和i.MX RT600跨界MCU的成功基礎,恩智浦宣布推出i.MX RT700,超低功耗、集成多核和eIQ Neutron神經處理單
    發表于 11-08 09:40 ?497次閱讀
    NXP專為邊緣AI打造的<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>700跨界MCU到底強在哪?

    如何在i.MX RT微控制器初始化LWIP協議棧

    i.MX RT微控制器初始化LWIP協議棧是一個復雜但有趣的過程,它涉及多個步驟和關鍵組件的配置.
    的頭像 發表于 10-12 11:48 ?293次閱讀
    如何在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>微控制器<b class='flag-5'>上</b>初始化LWIP協議棧

    恩智浦推出全新i.MX RT700跨界MCU系列

    高度集成的全新i.MX RT700跨界MCU旨在顯著節省功耗,配備eIQ Neutron神經處理單(NPU),可在邊緣端提供高達172倍的AI加速。
    的頭像 發表于 10-12 11:41 ?728次閱讀

    i.MX Linux開發實戰指南—基于野火i.MX系列開發板

    電子發燒友網站提供《i.MX Linux開發實戰指南—基于野火i.MX系列開發板.pdf》資料免費下載
    發表于 10-10 17:23 ?9次下載

    使用TPS65023的NXP i.MX 7電源設計

    電子發燒友網站提供《使用TPS65023的NXP i.MX 7電源設計.pdf》資料免費下載
    發表于 09-30 10:38 ?0次下載
    使用TPS65023的NXP <b class='flag-5'>i.MX</b> 7電源設計

    恩智浦半導體發布i.MX RT700系列MCU,賦能智能AI邊緣設備

    恩智浦半導體近期震撼發布了其最新力作——i.MX RT700跨界微控制器(MCU)系列,專為推動智能AI在邊緣端設備的應用而設計。這款創新產品精準定位可穿戴設備、消費級醫療設備、智能家居系統以及人機交互(HMI)平臺等前沿領域,展現了恩智浦在物聯網與人工智能融合領域的深厚
    的頭像 發表于 09-26 16:06 ?578次閱讀

    NXP Semiconductors i.MX 93處理器特性概述

    應用。 NXP i.MX 93節能應用處理器采用恩智浦創新的Energy Flex架構,優化工業、物聯網和汽車設備的性能與能效。該器件具有豐富的接口,包括兩個1GbE、多個音
    發表于 09-25 14:42 ?454次閱讀
    NXP Semiconductors <b class='flag-5'>i.MX</b> 93處理器特性概述

    恩智浦i.MX RT1170 uSDHC eMMC啟動時間

    大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1170 uSDHC eMMC啟動時間。
    的頭像 發表于 08-08 15:32 ?523次閱讀
    恩智浦<b class='flag-5'>i.MX</b> <b class='flag-5'>RT1170</b> uSDHC eMMC<b class='flag-5'>啟動</b>時間

    重新定義入門級嵌入式處理器模組-米爾NXP i.MX 93核心板

    近日,米爾電子推出基于NXP i.MX 93系列產品-MYC-LMX9X核心板及開發板。NXP i.MX?9系列在i.MX 6和i.MX 8系列產品市場驗證的基礎
    的頭像 發表于 04-19 17:50 ?407次閱讀
    重新定義入門級嵌入式處理器模組-米爾NXP <b class='flag-5'>i.MX</b> 93核心板

    基于 NXP i.MX RT1060 + IW416 的 Matter Thermostat 智慧溫控器應用方案之 Apple 生態系統

    NXP i.MX RT1060 是一款搭載 Arm Cortex-M7 的跨界微控制器,具有強大的處理能力和低功耗特性,而 IW416 則是一款高度集成的 Wi-Fi 4 和 Bluetooth 5.2 系統單芯片(SoC),提供了低成本的連接解決方案。
    的頭像 發表于 03-28 15:54 ?621次閱讀
    基于 NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1060 + IW416 的 Matter Thermostat 智慧溫控器應用方案之 Apple 生態系統

    i.MX 9系列-啟動時間測量方法應用指南

    電子發燒友網站提供《i.MX 9系列-啟動時間測量方法應用指南.pdf》資料免費下載
    發表于 02-20 10:37 ?0次下載
    <b class='flag-5'>i.MX</b> 9系列-<b class='flag-5'>啟動</b>時間測量方法應用指南

    使用i.MX RT500實現SPI/DMA AN14170應用指南

    電子發燒友網站提供《使用i.MX RT500實現SPI/DMA AN14170應用指南.pdf》資料免費下載
    發表于 02-01 10:05 ?0次下載
    使用<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>500實現SPI/DMA AN14170應用指南

    i.MX RT SDK的Wi-Fi TX功率表和信道掃描管理應用指南

    電子發燒友網站提供《i.MX RT SDK的Wi-Fi TX功率表和信道掃描管理應用指南.pdf》資料免費下載
    發表于 01-14 09:27 ?0次下載
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> SDK的Wi-Fi TX功率表和信道掃描管理應用指南

    如何在i.MXRT1170快速點亮一款全新LCD屏?

    我們知道 LCD 屏的接口有很多:DPI-RGB、MIPI DSI、DBI/MCU(I8080)、LVDS、SPI 等等,接口不同,對應的軟件驅動也不同。RT1170 片內外設對以上接口都能很好地支持,今天我們主要聊最近比較火的 MIPI DSI 接口。
    的頭像 發表于 01-05 15:49 ?1151次閱讀
    如何在<b class='flag-5'>i.MXRT1170</b><b class='flag-5'>上</b>快速點亮一款全新LCD屏?