首页 > 其他分享 >痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设

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

时间:2023-04-18 19:01:57浏览次数:53  
标签:ROM 痞子 DCD 配置 外设 BootROM MXRT1xxx


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是利用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 才会被使能)。

痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设_嵌入式

  随便摘其中两句分析下,第一句表明是 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 启动头来更改设置。

痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设_寄存器_02

  为了做压力测试,我们需要更改不同的 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;

痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设_寄存器_03

  将板卡设为从 Flash 启动模式后重新上电,挂上 JLINK 再去读取,此时 FlexSPI1->DLLACR 已经是期望的 0x00400041,说明 DCD 功能生效了。这里还有一个注意事项,即 BootROM 利用 FDCB 启动头配置 FlexSPI 外设在前,解析执行 DCD 数据在后,所以我们才能借助 DCD 实现这样的更改测试。

痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设_App_04

三、DCD能配置全部外设吗?

  看起来 DCD 特别强大,那么它能帮助操作 ARM 4GB 系统空间里的全部地址吗?答案是否定的,出于安全考虑,BootROM 里做了地址限制,我们仅能用 DCD 操作如下指定的一些外设(不同 i.MXRT 系列有所不同):

痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设_App_05

  至此,利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

 最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。


痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设_App_06

  衡杰(痞子衡),目前就职于某知名外企半导体公司MCU系统部门,担任嵌入式系统应用工程师。

  关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。




标签:ROM,痞子,DCD,配置,外设,BootROM,MXRT1xxx
From: https://blog.51cto.com/henjay724/6203993

相关文章

  • 容器启动 Promethus \node-exporter \grafana 查看版本号
    说明:镜像拉取时默认都是latest版本,为了更好地管理,对镜像进行重新标记。一、拉取镜像dockerpullprom/prometheusdockerpullgrafana/grafanadockerpullprom/node-exporter二、运行服务#启动node_exporter服务dockerrun-d-p9100:9100--restart=always--privi......
  • 用C#破解Chrome浏览器cookie值
    背景最近小编接到一个获取网站请求数据的需求,要求抓取网站某个页面请求的数据。我使用GoogleChrome浏览器查看了一下请求链接的传入参数,发现需要传入一个Token值才能获取数据。于是我在Chrome中登录后,通过Postman请求成功,并将Token存储到了Cookie中。然而问题又来了,在代码层面如......
  • Promise基本用法
    Promise是ES6的新特性,是异步编程的一种解决方案从语法上说,Promise是一个对象,从它可以获取异步操作的消息,可以解决回调地狱(回调地狱嵌套回调函数)Promise的含义:本身不是异步,是封装异步操作容器,统一异步的标准Promise对象的特点:对象的状态不受外界影响,一旦状态改变,就不会......
  • zabbix 集成 prometheus 数据
    一、概述Zabbix和Prometheus都是开源监控系统,它们具有不同的特点和优势,因此很多人希望将它们集成在一起,以便充分利用它们的功能。以下是将Zabbix和Prometheus集成的一些步骤:安装和配置Prometheus:在安装和配置Prometheus之前,需要先确定您要监控的目标。可以是主机、容器、服务等......
  • Mapboxgl Chrome75版本下发现问题:中文标签无法加载,由Canvas的measureText()方法导致
    很刁钻的问题,排查了好久。我自己开发测试用的浏览器(版本为112)运行正常,在老版本(75)谷歌浏览器报错如下:mapbox-gl.js:32UncaughtTypeError:Failedtoexecute'getImageData'on'CanvasRenderingContext2D':Valueisnotoftype'long'.atMp.TinySDF.draw(mapbox-gl.j......
  • 记录selenium,python自动化测试中的chromedriver.exe地址和打开后自动关闭浏览器问题
    selenium的官方地址为:https://selenium-python.readthedocs.io/index.html镜像地址:https://npmmirror.com/#导入webdriverfromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy#调用键盘按键操作时需要引入的Keys包fromselenium.webdriver.common.k......
  • vite启动vue项目报错import { performance } from 'node:perf_hooks'
    import{performance}from'node:perf_hooks'^^^^^^SyntaxError:Cannotuseimportstatementoutsideamodule要求node版本要大于16 使用nvm切换node版本 成功运行......
  • Receive double value in WndProc from legacy
    ReceivedoublevalueinWndProcfromlegacyAskQuestionAsked 9years,8monthsagoModified 9years,1monthagoViewed 158times I'mtryingtosenddouble/floatvaluesfrommyMFClegacycodetoWPFwindow.WPFWndProcprocedurerece......
  • Prometheus 的监控方法论
    许多监控框架的重点都是故障检测,即检测是否发生了特定的系统事件或处于什么状态(这是Nagios的风格)。当收到有关特定系统事件的通知时,我们通常会查看收集到的任何指标,以找出发生的确切情况及其原因。在这个思路下,指标被视为故障检测的副产品或者补充。正确使用指标可以提供基础设施的......
  • .Net [FromBody]与[FromForm]区别、各请求格式说明
    [FromBody]与[FromForm]区别1,FromBody:在Action方法传入参数后添加[frombody]属性,参数将以一个整体的josn对象的形式传递。代码示例:///<summary>///发公告///</summary>///<paramname="dateTime"></param>///<retur......