痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可輕鬆配置指定外設

来源:https://www.cnblogs.com/henjay724/archive/2023/04/06/17293325.html
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是利用i.MXRT1xxx系列ROM集成的DCD功能可輕鬆配置指定外設。 關於 i.MXRT1xxx 系列晶元 BootROM 中集成的 DCD 功能這個話題,痞子衡早就想寫了,但是一直沒有動筆,畢竟這個話題比較生澀,單獨講會比較枯燥。最 ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是利用i.MXRT1xxx系列ROM集成的DCD功能可輕鬆配置指定外設

  關於 i.MXRT1xxx 系列晶元 BootROM 中集成的 DCD 功能這個話題,痞子衡早就想寫了,但是一直沒有動筆,畢竟這個話題比較生澀,單獨講會比較枯燥。最近痞子衡在支持一個 i.MXRT1170 客戶,需要在客戶板卡上跑其應用代碼的壓力測試,但是客戶因為保密的緣故僅提供了應用可執行文件,而我們又需要在客戶應用里額外加一些配置代碼做測試,測試過程中會涉及多次斷電上電,如果掛外部調試器去做額外配置又太繁瑣,這時候 DCD 功能就派上用場了。

  • Note:文中貼圖、代碼主要以 i.MXRT1170 為例,其餘 i.MXRT1xxx 系列原理類似。

一、DCD是什麼及其應用場景

  DCD 是 Device Configuration Data 縮寫,這是 i.MXRT1xxx 系列晶元 BootROM 裡帶的一個附加功能,主要用於 App 啟動前系統外設的用戶定製化配置。我們知道 i.MXRT1xxx 系列晶元上電永遠都是 BootROM 代碼先執行,然後由 BootROM 再去載入 App 執行。如果希望在 App 執行前系統就已經被配置到指定狀態(即不需要在 App 里去做這方面系統設置),那就需要藉助 DCD 功能,你只需要按格式將 DCD 數據放到 Boot Device 指定偏移處即可,BootROM 會自動去解析執行。

  翻看晶元參考手冊 Device Configuration Data (DCD) 章節,你會發現 DCD 數據設計特別簡單,它總共支持三類命令: Write data(Tag 是 0xCC)、Check data(Tag 是 0xCF)、NOP(Tag 是 0xC0),這三類命令就是為了讀寫晶元外設寄存器而設計的,我們需要做的就是組合這三類命令完成指定外設模塊寄存器的設置序列。任意打開一個 RT1170 SDK 示例工程,都會包含 dcd.c/h 文件(僅當工程選項預編譯巨集里有 XIP_BOOT_HEADER_DCD_ENABLE=1 才會被使能)。

  隨便摘其中兩句分析下,第一句表明是 Write data 命令的 *address = val_msk 動作合集,第二句是執行 *((uint32_t *)0x40CC0200) = 0x00000703,也就是 CCM->CLOCK_ROOT[kCLOCK_Root_Semc].CONTROL = 0x703。

/* #1.1-129, command header bytes for merged 'Write - value' command */
0xCC, 0x04, 0x0C, 0x04,
/* #1.1, command: write_value, address: CCM_CLOCK_ROOT4_CONTROL, value: 0x703, size: 4 */
0x40, 0xCC, 0x02, 0x00, 0x00, 0x00, 0x07, 0x03,

  接著這個示例 dcd.c 內容繼續聊,這其實是配置晶元 SEMC 外設去初始化外部 SDRAM 的全部序列。有了這個 DCD 設置,那麼 App 里就可以不用管外部 SDRAM 初始化工作了,直接讀寫訪問 SDRAM 完成相應應用業務功能即可,這也是 DCD 的典型應用場景。如果應用代碼直接是全部在 SDRAM 執行,在不設計用戶二級 Bootloader 做載入的情況下,DCD 是必選的解決方案。

二、以實際客戶案例代入DCD使用

  現在回到客戶的實際案例,客戶 RT1170 板卡上用了一顆來自 MXIC 的 Octal Flash,代碼是執行在 Flash 上,現在我們需要測試不同 FlexSPI1->DLLACR[SLVDLYTARGET] 設置下的工作情況,而我們手頭僅有客戶可執行文件。

  將客戶可執行文件下載進板卡,並設置啟動模式為從 Flash 啟動(2'b10),然後掛上 JLINK 調試器讀取 FlexSPI1->DLLACR 寄存器值(該寄存器地址是 0x400cc0c0),得到 0x00400079,其中 SLVDLYTARGET 是預設的理想值 4'b1111,這個值是 BootROM 自動配置的,我們無法通過 FDCB 啟動頭來更改設置。

  為了做壓力測試,我們需要更改不同的 FlexSPI1->DLLACR[SLVDLYTARGET] 值,比如將其設為 4'b1000,這時候可以藉助 DCD 來實現,我們直接使用 MCUBootUtility 工具(需要使用 v4.1.1 版本及以上)來使能 DCD。

  將客戶板卡啟動模式改為 Serial Download (2'b01),插上 UART/USB 下載線,打開 MCUBootUtility 工具,在 DCD 設置界面里啟用 "Use DCD description" 選項,併在動作框里直接輸入下麵語句(這裡直接是類 C 語法,會被工具自動轉成 DCD 數據),然後連接、下載。

*(uint32_t*)0x400cc0c0 = 0x00400041;

  將板卡設為從 Flash 啟動模式後重新上電,掛上 JLINK 再去讀取,此時 FlexSPI1->DLLACR 已經是期望的 0x00400041,說明 DCD 功能生效了。這裡還有一個註意事項,即 BootROM 利用 FDCB 啟動頭配置 FlexSPI 外設在前,解析執行 DCD 數據在後,所以我們才能藉助 DCD 實現這樣的更改測試。

三、DCD能配置全部外設嗎?

  看起來 DCD 特別強大,那麼它能幫助操作 ARM 4GB 系統空間里的全部地址嗎?答案是否定的,出於安全考慮,BootROM 里做了地址限制,我們僅能用 DCD 操作如下指定的一些外設(不同 i.MXRT 系列有所不同):

  至此,利用i.MXRT1xxx系列ROM集成的DCD功能可輕鬆配置指定外設痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時發佈到我的 博客園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下麵二維碼,就可以在手機上第一時間看了哦。

  最後歡迎關註痞子衡個人微信公眾號【痞子衡嵌入式】,一個專註嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。

痞子衡嵌入式-微信二維碼 痞子衡嵌入式-微信收款二維碼 痞子衡嵌入式-支付寶收款二維碼

  衡傑(痞子衡),目前就職於某知名外企半導體公司MCU系統部門,擔任嵌入式系統應用工程師。

  專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]

  可以關註痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。

  關於專欄文章有任何疑問請直接在博客下麵留言,痞子衡會及時回覆免費(劃重點)答疑。

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文:cyningsun.com/03-31-2019/live-streaming-danmaku.html 背景 為了更好的支持東南亞直播業務,產品設計為直播業務增加了彈幕。第一期彈幕使用騰訊雲支持,效果並不理想,經常出現卡頓、彈幕偏少等問題。最終促使我們開發自己的彈幕系統。性能要求是需要支持, ...
  • 有空把引入、邏輯、原理介紹給寫了,目前先給大家看看代碼。 將來寫大概會分成這麼幾塊: 汽車運動學自行車模型 跟蹤演算法主流模型及特點 純跟蹤演算法原理推導 代碼介紹 代碼原創,來之不易,請勿不註明轉載。 喜歡點個贊吧!網上許多代碼都跑不起來hh clc; clear; % form road cx = ...
  • 給定兩個字元串 s 和 t ,判斷它們是否是同構的。 如果 s 中的字元可以按某種映射關係替換得到 t ,那麼這兩個字元串是同構的。 每個出現的字元都應當映射到另一個字元,同時不改變字元的順序。不同字元不能映射到同一個字元上,相同字元只能映射到同一個字元上,字元可以映射到自己本身。 示例 1: 輸入 ...
  • 經常會聽到開發者提起單元測試的話題,那麼今天我就帶大伙一起來看看大名鼎鼎的谷歌 C++ 測試框架 GoogleTest。這是系列文章的第二篇。 ...
  • 切片 ​ Go語言切片是一種建立在數組類型之上的抽象,它構建在數組之上並且提供更強大的能力和便捷。解決了數組長度不可變等缺陷 聲明切片 ​ 切片的數據結構非常小,只有三個欄位:指向底層數組的指針,切片長度,切片容量。切片長度是指切片的真實長度,切片容量是指切片可擴展的最大長度,一般來講切片長度要小於 ...
  • 這節講述網路通訊服務端的實現,其開發思想、原則與客戶端的類似,即組合封裝、線程運行時類,面向介面編程等等。源碼面前,了無秘密,我直接以類代碼給大家展示,包含SNetServer類、SNetServerRunning類、INetServerHandler等類。 ...
  • 數組 ​ 數組是具有相同唯一類型的一組已編號且長度固定的數據項序列(這是一種同構的數據結構);這種類型可以是任意的原始類型例如整形、字元串或者自定義類型(結構體、介面)。數組長度也是數組類型的一部分,所以[5]int和[10]int是屬於不同類型的。 :star::在其他語言中數組大多是引用類型,但 ...
  • 前言 一、人物簡介 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。 二、構成和表示方式 關係運算符的作用是判斷符號兩邊大小的關係 C語言中的關係運算符主要有六個,如下表所示 | 運算符 | 名稱 | 示例 | 描述 | | : ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...