痞子衡嵌入式:对比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 ...
随机推荐
- Linux创建RAID5_实战
Linux创建RAID5实战 Linux创建RAID5 RAID5最少由三个硬盘组成,它将数据分散存储于阵列中的每个硬盘,并且还伴有一个数据校验位,数据位与校验位通过算法能相互验证 RAID5最多能允 ...
- Linux_网络进阶管理
一.链路聚合 1.什么是链路聚合? 网卡的链路聚合就是将多块网卡连接起来,当-块网卡损坏,网络依旧可以正常运行,可以有效的防止因为网卡损坏带来的损失,同时也可以提高网络访问速度. 2.链路聚合方式: ...
- k8s总结复习
一.k8s介绍 Kubernetes(k8s)是Google开源的容器集群管理系统.在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大规模 ...
- mysql基础之mysql主从架构半同步复制
一.概念 1.异步复制(Asynchronous replication) MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样 ...
- Linux 发行版本介绍
引言 Linux 有非常多的版本,比如世面上常见的有 Ubuntu.RedHat.Fedora.Centos 等,这么多的版本我们究竟该选哪一个呢?对于 Linux 初学者有必要对这些 Linux 发 ...
- 技术干货 | 源码解析 Github 上 14.1k Star 的 RocketMQ
前言 Apache RocketMQ 作为广为人知的开源消息中间件,诞生于阿里巴巴,于 2016 年捐赠给了 Apache.从 RocketMQ 4.0 到如今最新的 v4.7.1,不论是在阿里巴巴内 ...
- GPU微观物理结构框架
GPU微观物理结构框架 一.CPU 和 GPU 在物理结构和设计上有何区别 首先需要解释CPU(Central Processing Unit)和GPU(Graphics Processing Un ...
- OpenCV读写视频文件解析
OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在 OpenCV 中,VideoCapture ...
- CodeGen用户定义的扩展令牌
CodeGen用户定义的扩展令牌 用户定义的扩展令牌是一种特殊的令牌,开发人员可以确定令牌的名称以及在代码生成过程中遇到令牌时要插入的值. CodeGen支持多种机制,允许通过以下方式实现用户定义的令 ...
- AMD–7nm “Rome”芯片SOC体系结构,支持64核
AMD–7nm "Rome"芯片SOC体系结构,支持64核 AMD Fully Discloses Zeppelin SOC Architecture Details at ISS ...