0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设

痞子衡嵌入式 来源:痞子衡嵌入式 2023-04-21 09:40 次阅读

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

facaaa18-df6c-11ed-bfe3-dac502259ad0.png

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

/*#1.1-129,commandheaderbytesformerged'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 启动头来更改设置。

fae51ec0-df6c-11ed-bfe3-dac502259ad0.png

为了做压力测试,我们需要更改不同的 FlexSPI1->DLLACR[SLVDLYTARGET] 值,比如将其设为 4'b1000,这时候可以借助 DCD 来实现,我们直接使用 MCUBootUtility 工具(需要使用 v4.1.1 版本及以上)来使能 DCD。

下载地址:https://github.com/JayHeng/NXP-MCUBootUtility/archive/refs/tags/v4.1.1.zip

将客户板卡启动模式改为 Serial Download (2'b01),插上 UART/USB 下载线,打开 MCUBootUtility 工具,在 DCD 设置界面里启用 "Use DCD description" 选项,并在动作框里直接输入下面语句(这里直接是类 C 语法,会被工具自动转成 DCD 数据),然后连接、下载。

*(uint32_t*)0x400cc0c0=0x00400041;
faf696aa-df6c-11ed-bfe3-dac502259ad0.png

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

fb0f99de-df6c-11ed-bfe3-dac502259ad0.png

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

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

fb252f10-df6c-11ed-bfe3-dac502259ad0.png

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117723
  • ROM
    ROM
    +关注

    关注

    4

    文章

    524

    浏览量

    84812
  • 命令
    +关注

    关注

    5

    文章

    638

    浏览量

    21849
  • DCD
    DCD
    +关注

    关注

    0

    文章

    6

    浏览量

    2357
  • bootrom
    +关注

    关注

    0

    文章

    6

    浏览量

    3650

原文标题:日常炫技!DCD功能可轻松配置i.MXRT指定外设!

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    恩智浦i.MXRT1xxx系列MCU的Serial NAND启动

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MXRT1xxx系列MCU的Serial NAND启动。
    发表于 08-21 09:20 206次阅读
    恩智浦<b class='flag-5'>i.MXRT1xxx</b><b class='flag-5'>系列</b>MCU的Serial NAND启动

    为什么改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位会造成系统异常呢

    为什么改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位会造成系统异常呢?怎样去解决在i.MXRT1062应用程序里动态调整FlexRAM导致WDOG模块工作异常的问题呢?
    发表于 11-29 06:34

    i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择

    篇非常详细的文章 《深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程》,这篇文章主要针对 i.MXRT1xxx 四位数系列
    发表于 12-21 06:34

    如何解决i.MXRT1xxx系列启动应用程序发生异常跑飞问题?

    i.MXRT1xxx系列启动应用程序如何解决异常跑飞问题?
    发表于 12-23 07:41

    i.MXRT1xxx Boot的Serial Downloader模式相关资料分享

    (sdphost, mfgtool) 里痞子衡为大家介绍了i.MXRT1xxx Boot的Serial Downloader模式,这种模式主要是用来引导启动Flashloader,那么Flashlo...
    发表于 01-26 08:12

    i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计资料分享

    i.MXRT1xxx里SystemReset不复位的GPR寄存器》、《对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同》 介绍了 i.MXRT/LPC 上 System
    发表于 02-07 07:49

    系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败的解决办法

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题。  我们知道,i.MXRT1xxx家族早
    发表于 02-08 06:09

    i.MXRT1xxx上的普通GPIO与高速GPIO的差异是什么?

    i.MXRT1xxx上的普通GPIO与高速GPIO的差异是什么?
    发表于 02-08 06:54

    i.MXRT1xxx系列里暗藏的Product ID寄存器介绍

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1xxx系列里暗藏的Product ID寄存器。  MCU 厂商在定义一个产品系列时,通常是会预先规划产品发展路线
    发表于 02-11 06:24

    介绍的是i.MX RT1xxx系列MCU的Parallel NOR启动

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1xxx系列MCU的Parallel NOR启动。  上一篇讲i.MXRT1xxx从Raw NA
    发表于 02-22 06:31

    介绍i.MX RT1xxx系列MCU的Raw NAND启动

    ,我们知道i.MXRT1xxx支持的外部Boot Device共有6种(Serial NOR&NAND、Parallel NOR&NAND、SD/eMMC、SPI NOR/...
    发表于 02-22 07:20

    i.MXRT系列ROM API设计

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 i.MXRTxxx 系列 ROM API 设计细节。 痞子衡之前写过两篇文章 《利用 i.MXRT1xxx
    的头像 发表于 10-30 10:52 343次阅读

    痞子衡嵌入式:改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常。  痞子衡的嵌入式技术交流群里有一位非常活跃的朋友
    发表于 12-04 17:36 8次下载
    痞子衡嵌入式:改动<b class='flag-5'>i.MXRT1xxx</b>里IOMUXC_GPR寄存器保留位可能会造成系统异常

    痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题。  我们知道,i.MXRT1xxx家族早
    发表于 12-04 19:36 1次下载
    痞子衡嵌入式:系统时钟<b class='flag-5'>配置</b>不当会导致<b class='flag-5'>i.MXRT1xxx</b><b class='flag-5'>系列</b>下OTFAD加密启动失败

    利用i.MX RT1xxx系列ROM集成DCD功能轻松配置指定外设

    关于i.MX RT1xxx系列芯片BootROM中集成DCD功能这个话题,早就想写了,但是一直没有动笔,毕竟这个话题比较生涩,单独讲会比较
    的头像 发表于 04-20 15:54 706次阅读