痞子衡嵌入式:对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是对比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寄存器使用上的异同的更多相关文章
- 痞子衡嵌入式:i.MXRT全系列下FlexSPI外设AHB Master ID定义与AHB RX Buffer指定的异同
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT全系列下FlexSPI外设AHB Master ID定义与AHB RX Buffer指定的异同. 因为 i.MXRT 全系列 ...
- 痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是FlexSPI外设对AHB Burst Read特性的支持. 痞子衡之前写过一篇关于FlexSPI LUT的文章 <从头开始认识i ...
- 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项. 在恩智浦官方参考设计板 MIMXRT595-E ...
- 痞子衡嵌入式:i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项. 最近痞子衡在支持一个印度客户,这个客户项目主芯片选择 ...
- 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...
- 痞子衡嵌入式:i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计. 痞子衡之前两篇文章 <在SBL项目实战中妙用i ...
- 痞子衡嵌入式:对比MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异. 近期有 i.MXRT 客户在集成 OTA SBL ...
- 痞子衡嵌入式:16MB以上NOR Flash使用不当可能会造成软复位后i.MXRT无法正常启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验. 痞子衡这几天在支持一个i.MXRT1050客户项 ...
- 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(2) - 识别当前i.MXRT型号
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(2)之识别当前i.MXRT型号. 文接上篇 <超级下载算法(RT-UFL)开发笔记(1) - 执行在不同CM ...
随机推荐
- FireFox-background
- Linux服务之批量部署篇
批量部署步骤: 1.检查环境 getenforce #检查内核防火墙是否关闭 systemctl status firewalld #检查firewalld是否 ...
- linux进阶之远程免密登录,动态添加磁盘及个别基础命令
一. 免密登录(远程连接ssh) ssh IP #连接登录到其它机 ssh 192.168.10.102 ssh IP "CMD" #在其它机器上执行命令 yum -y i ...
- 按时按登录IP记录Linux所有用户操作日志的方法
背景:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所 ...
- jsp表单传值后在页面中文显示乱码
主要通过添加以下代码来实现(前提是其他处的编码都设置成了utf-8): response.setContentType("text/html;charset=utf-8"); re ...
- 3.21-22 od、tee
3.21 od:按不同进制显示文件 od命令用于输出文件的八进制.十六进制或者其他格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符. -A 地址进制 按指定的进制 ...
- 面试官问:ZooKeeper 有几种节点类型?别再说 4 种啦!
本文作者:HelloGitHub-老荀 好久没更新 ZK 的文章了,我想死你们啦.之前发布的 HelloZooKeeper 系列文章完结后,项目收获了将近 600 个 star.这远远超过了我自己的预 ...
- 矩阵中的路径 DFS+剪枝
给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元格内的字母 ...
- Day30 BigInteger和BigDecimal
BigInteger与BigDecimal BigInteger类 Integer类作为int的包装类,能存储的最大整型值为2 31-1,Long类也是有限的, 最大为2 63-1.如果要表示再大的整 ...
- Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期
BPMN 2.0介绍 业务流程模型注解(BusinessProcess Modeling Notation - BPMN)是业务流程模型的一种标准图形注解.这个标准是由对象管理组(Object Man ...