大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同

  本篇是 《在SBL项目实战中妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器》 一文的延续,SBL 项目是为 i.MXRT/LPC 系列设计的,上文只介绍了 i.MXRT1xxx 里 SystemReset 不复位的 IOMUXC_SNVS_GPR 寄存器,我们需要在 i.MXRTxxx 和 LPC 中也找出 SystemReset 不复位的通用寄存器。

  我们知道 i.MXRT1xxx 来自于 i.MX 应用处理器,而 i.MXRTxxx 来自于 LPC 微控制器,出身不同,使用上差异其实也不小。痞子衡在 i.MXRTxxx/LPC 参考手册里找了一圈,最终发现 RTC 外设里的 GPREG 寄存器符合要求。今天痞子衡就以这个通用寄存器的使用为例来展开聊一聊 i.MXRT1xxx/i.MXRTxxx/LPC 关于外设寄存器访问设计上的异同:

一、回顾i.MXRT1xxx上的设计

  在 《在SBL项目实战中妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器》 一文里我们找到符合条件的寄存器有两组,分别是 IOMUXC_SNVS_GPR 和 SNVS_LPGPR,文中最终选用了 IOMUXC_SNVS_GPR,在示例代码里是直接读写这个寄存器的,没有任何多余准备工作,甚至连 IOMUXC_SNVS_GPR 外设时钟使能的操作都不用。

void gpr_rw_test(void)
{
uint32_t flag = 0x5a;
IOMUXC_SNVS_GPR->GPR0 = flag;
flag = IOMUXC_SNVS_GPR->GPR0; // flag 为 0x5a
}

  这跟 i.MXRT1xxx 系统设计有关,在 i.MXRT1xxx 里 CCM 模块负责所有其他外设的时钟开关控制(具体在 CCM->CCGRx 寄存器),下图是 i.MXRT1052 里 CCM->CCGRx 的默认值(复位后初值,包含软/硬复位):

  每个 CCM->CCGRx 包含 16 个 2bit 的 CGx 位,每个 CGx 控制一个外设的时钟开关,2bit 取值定义如下表所示。可以看到大部分外设默认时钟都是打开的(2'b11),仅有如下三个外设默认时钟是关闭的(2'b00):

CCM->CCGR2[CG12] - xbar2
CCM->CCGR2[CG11] - xbar1
CCM->CCGR3[CG2] - semc

  所以我们能随意读写 IOMUXC_SNVS_GPR 寄存器是因为如下时钟控制位是默认打开的,如果将这个时钟控制位设为 2'b00,即关闭,会是什么现象呢?痞子衡挂上 J-Link 做了个读写测试,发现时钟不打开的情况下,寄存器的值依旧能够被有效读取,只是寄存器写入操作是无效的(被系统直接忽略,就像写操作没发生一样),这种体验其实跟一般 MCU 外设寄存器读写设计不太一样, i.MXRT1xxx 上对外设地址空间的访问并没有做 MCU 上常见的保护机制(即外设时钟不使能的情况下,外设寄存器的写访问应返回总线错误,读访问应返回总线错误或无效 0 值),并且复位后几乎所有外设时钟都是默认打开的。

CCM->CCGR3[CG15] - iomuxc_snvs_gpr

二、再看i.MXRTxxx上的设计

  现在我们看一下 i.MXRTxxx 上 SystemReset 不复位的通用寄存器 RTC->GPREGx,我们在代码里尝试直接写这个寄存器,发现写入操作不报错也不生效,读回来是默认值 0,看起来 i.MXRTxxx 上的这里设计逻辑跟 i.MXRT1xxx 不一样。

void gpreg_rw_test(void)
{
uint32_t flag = 0x5a;
RTC->GPREG[0] = flag;
flag = RTC->GPREG[0]; // flag 为 0
}

  我们知道 i.MXRTxxx 里 CLKCTLx 模块负责所有其他外设的时钟开关控制(具体在 CLKCTLx->PSCCTLx 寄存器),下图是 i.MXRT685 里 CLKCTLx->PSCCTLx 的默认值(复位后初值,包含软/硬复位):

  每个 CLKCTLx->PSCCTLx 包含 32 个 1bit 的 xxxPeripheral_CLK 位,每个 xxxPeripheral_CLK 控制一个外设的时钟开关,0 表示关闭,1 表示打开。可以看到大部分外设默认时钟都是关闭的,仅有 BootROM 默认时钟是开启的:

CLKCTL0->PSCCTL0[ROM_CTL_128KB] - Boot ROM

  因为 GPREGx 是 RTC 外设里的一部分,那我们试着先将 RTC 外设时钟打开,然后再写入 GPREG 寄存器,发现还是不行,后来查阅 RTC 章节,发现还需要将 RTC->CTRL[SWRESET] 位清零才可以(否则 RTC 模块一直处于复位状态),挂上 J-Link 做个读写测试,打开外设时钟后可以正常做写寄存器操作,关闭时钟后依旧能够有效读取寄存器。总结一下,i.MXRTxxx 上也没有对外设地址空间的访问做 MCU 上常见的保护机制,所以本质上它和 i.MXRT1xxx 一样,只是不像 i.MXRT1xxx 那样复位后默认打开几乎所有外设时钟。

void gpreg_rw_test(void)
{
// 准备工作
CLKCTL1->PSCCTL2_SET = (1UL << CLKCTL1_PSCCTL2_SET_RTC_LITE_CLK_SET_SHIFT); // 或 CLOCK_EnableClock(kCLOCK_Rtc);
RTC->CTRL &= ~RTC_CTRL_SWRESET_MASK;
// 原代码
uint32_t flag = 0x5a;
RTC->GPREG[0] = flag;
flag = RTC->GPREG[0]; // flag 为 0x5a
}

三、对比LPC上的设计

  最后我们看一下 LPC 上 SystemReset 不复位的通用寄存器 RTC->GPREGx,从 RTC 模块寄存器定义上来看,它和 i.MXRTxxx 里的 RTC 一模一样,是的,说 i.MXRTxxx 来自于 LPC 没有丝毫夸张,它们就是一个平台的产物。我们在代码里尝试直接写这个寄存器,发现读写操作都会直接发生系统错误,在线调试无法继续进行。

void gpreg_rw_test(void)
{
uint32_t flag = 0x5a;
RTC->GPREG[0] = flag; // 系统错误,调试无法进行
flag = RTC->GPREG[0];
}

  我们知道 LPC 里 SYSCON 模块负责所有其他外设的时钟开关控制(具体在 SYSCON->AHBCLKCTRLx 寄存器),下图是 LPC55S69 里 SYSCON->AHBCLKCTRLx 的默认值(复位后初值,包含软/硬复位):

  每个 SYSCON->AHBCLKCTRLx 包含 32 个 1bit 的 xxxPeripheral 位,每个 xxxPeripheral 控制一个外设的时钟开关,0 表示关闭,1 表示打开。可以看到大部分外设默认时钟都是关闭的,仅有 Flash/FMC 默认时钟是开启的:

SYSCON->AHBCLKCTRL0[FLASH] - Flash 存储器
SYSCON->AHBCLKCTRL0[FMC] - FMC 控制器

  至于操作 RTC->GPREGx 前准备工作,与 i.MXRTxxx 上是一致的,这里不予赘述。现在我们发现 LPC 上才真正对外设地址空间的访问做了 MCU 上常见的保护机制(即外设时钟不使能的情况下,外设寄存器的写访问应返回总线错误,读访问应返回总线错误),它才是典型的 MCU 产物, 而 i.MXRT 其实更偏向 MPU 设计风格。

void gpreg_rw_test(void)
{
// 准备工作
SYSCON->AHBCLKCTRLSET[0] = (1UL << SYSCON_AHBCLKCTRL0_RTC_SHIFT); // 或 CLOCK_EnableClock(kCLOCK_Rtc);
RTC->CTRL &= ~RTC_CTRL_SWRESET_MASK;
// 原代码
uint32_t flag = 0x5a;
RTC->GPREG[0] = flag;
flag = RTC->GPREG[0]; // flag 为 0x5a
}

  至此,对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同的更多相关文章

  1. 痞子衡嵌入式:i.MXRT全系列下FlexSPI外设AHB Master ID定义与AHB RX Buffer指定的异同

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT全系列下FlexSPI外设AHB Master ID定义与AHB RX Buffer指定的异同. 因为 i.MXRT 全系列 ...

  2. 痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是FlexSPI外设对AHB Burst Read特性的支持. 痞子衡之前写过一篇关于FlexSPI LUT的文章 <从头开始认识i ...

  3. 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项. 在恩智浦官方参考设计板 MIMXRT595-E ...

  4. 痞子衡嵌入式:i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项. 最近痞子衡在支持一个印度客户,这个客户项目主芯片选择 ...

  5. 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...

  6. 痞子衡嵌入式:i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计. 痞子衡之前两篇文章 <在SBL项目实战中妙用i ...

  7. 痞子衡嵌入式:对比MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异. 近期有 i.MXRT 客户在集成 OTA SBL ...

  8. 痞子衡嵌入式:16MB以上NOR Flash使用不当可能会造成软复位后i.MXRT无法正常启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验. 痞子衡这几天在支持一个i.MXRT1050客户项 ...

  9. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(2) - 识别当前i.MXRT型号

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(2)之识别当前i.MXRT型号. 文接上篇 <超级下载算法(RT-UFL)开发笔记(1) - 执行在不同CM ...

随机推荐

  1. FireFox-background

  2. Linux服务之批量部署篇

    批量部署步骤: 1.检查环境 getenforce               #检查内核防火墙是否关闭 systemctl status firewalld       #检查firewalld是否 ...

  3. linux进阶之远程免密登录,动态添加磁盘及个别基础命令

    一. 免密登录(远程连接ssh) ssh IP   #连接登录到其它机 ssh 192.168.10.102 ssh IP "CMD"   #在其它机器上执行命令 yum -y i ...

  4. 按时按登录IP记录Linux所有用户操作日志的方法

    背景:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所 ...

  5. jsp表单传值后在页面中文显示乱码

    主要通过添加以下代码来实现(前提是其他处的编码都设置成了utf-8): response.setContentType("text/html;charset=utf-8"); re ...

  6. 3.21-22 od、tee

    3.21 od:按不同进制显示文件       od命令用于输出文件的八进制.十六进制或者其他格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符.   -A 地址进制    按指定的进制 ...

  7. 面试官问:ZooKeeper 有几种节点类型?别再说 4 种啦!

    本文作者:HelloGitHub-老荀 好久没更新 ZK 的文章了,我想死你们啦.之前发布的 HelloZooKeeper 系列文章完结后,项目收获了将近 600 个 star.这远远超过了我自己的预 ...

  8. 矩阵中的路径 DFS+剪枝

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元格内的字母 ...

  9. Day30 BigInteger和BigDecimal

    BigInteger与BigDecimal BigInteger类 Integer类作为int的包装类,能存储的最大整型值为2 31-1,Long类也是有限的, 最大为2 63-1.如果要表示再大的整 ...

  10. Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期

    BPMN 2.0介绍 业务流程模型注解(BusinessProcess Modeling Notation - BPMN)是业务流程模型的一种标准图形注解.这个标准是由对象管理组(Object Man ...