痞子衡嵌入式:i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计。
痞子衡之前两篇文章 《在SBL项目实战中妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器》、《对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同》 介绍了 i.MXRT/LPC 上 System Reset 后不复位的 GPR 寄存器用法,但是有客户发现在 i.MXRT1010 和 i.MXRT1170 上没法直接使用文中示例读写代码,后来痞子衡检查了一番,发现 SNVS GPR 寄存器在这两款型号上确实不太一样,今天痞子衡就来讲讲它们到底有啥不一样:
一、SNVS GPR一般读写设计
先来回顾一下 i.MXRT1015/1020/1024/1050/1060/1064 型号上的 SNVS GPR 设计,从参考手册里来看,SNVS GPR 一共有四个,其中 GPR2 - GPR0 是开放给用户自由使用的,GPR3 里面有一些系统控制功能,不建议使用。
因为 CCM 模块里默认打开了 iomuxc_snvs_gpr 模块的时钟,所以在用户代码里可以直接读写 GPR2 - GPR0:
void snvs_gpr_rw_test(void)
{
    uint32_t flag = 0x5aa55aa5;
    // 测试 GPR0 - 2
    uint32_t *snvs_gpr;
    for (snvs_gpr = &IOMUXC_SNVS_GPR->GPR0;
         snvs_gpr <= &IOMUXC_SNVS_GPR->GPR2;
         snvs_gpr++)
    {
        *snvs_gpr = flag;
        flag = *snvs_gpr;  // flag 为 0x5aa55aa5
    }
}
二、i.MXRT1010上的精简设计
我们知道 i.MXRT1010 是目前最入门级的 i.MXRT 型号,整个芯片设计相比主流型 i.MXRT1050 做了不少精简,在 SNVS GPR 上也是,GPR2 - GPR0 直接被拿掉了(读取永远是0,不可写入),仅剩 GPR3,好在这个 GPR3 上没有系统控制功能,可供用户自由读写,但也仅低 16bit 有效,高 16bit 是只读的。
CCM 模块里默认也打开了 iomuxc_snvs_gpr 模块时钟,可在用户代码里可以直接读写 GPR3[15:0]:
void snvs_gpr_rw_test(void)
{
    uint32_t flag = 0x5aa5;
    // 测试 GPR3[15:0]
    IOMUXC_SNVS_GPR->GPR3 = (IOMUXC_SNVS_GPR->GPR3 & 0xFFFF0000u) | (uint16_t)flag;
    flag = IOMUXC_SNVS_GPR->GPR3 & 0x0000FFFFu;  // flag 为 0x5aa5
}
三、i.MXRT1170上的增强设计
i.MXRT1170 是目前最高端的 i.MXRT 型号,整个芯片设计相比主流型 i.MXRT1050 做了很大改动,在架构上有增强。具体到 SNVS GPR 上,我们可以看到增加了很多 GPR,其中 GPR31 - GPR0 是完全可供用户使用的(但需要在 Secure 状态下才能被写入,默认无法写入)。GPR32 默认可以直接写入,但仅 bit15 - 1 可供用户自由使用,高 16bit 做了低 16bit 的 lock 控制。而 GPR33 里面则是一些系统控制功能,不建议使用。
- Note: 在 i.MXRT1170 头文件里,你可能还会发现有 GPR37 - 34,由于参考手册里并未开放,这里不讨论。
 
CCM 模块里默认也打开了 iomuxc_snvs_gpr 模块时钟,可在用户代码里可以直接读写 GPR32[15:1],但要想写入 GPR31 - 0,则需要先配置下 SNVS 模块:
void enable_snvs_gpr(void)
{
    // Write the proper value(4173_6166h) into LPLVDR
    SNVS->LPLVDR = 0x41736166u;
    // Clear the low-voltage event record
    SNVS->LPSR |= 0x8u;
}
void snvs_gpr_rw_test(void)
{
    uint32_t flag = 0x5aa5;
    // 测试 GPR32[15:1]
    IOMUXC_SNVS_GPR->GPR32 = (IOMUXC_SNVS_GPR->GPR32 & 0xFFFF0001u) | (uint16_t)(flag  << 1);
    flag = (IOMUXC_SNVS_GPR->GPR32 & 0x0000FFFEu) >> 1;  // flag 为 0x5aa5
    flag = 0x5aa55aa5;
    // 测试 GPR0 - GPR31
    enable_snvs_gpr();
    volatile uint32_t *snvs_gpr;
    for (snvs_gpr = &IOMUXC_SNVS_GPR->GPR[0];
         snvs_gpr <= &IOMUXC_SNVS_GPR->GPR[31];
         snvs_gpr++)
    {
        *snvs_gpr = flag;
        flag = *snvs_gpr;  // flag 为 0x5aa55aa5
    }
}
最后再补充两点:
- Note 1: i.MXRT1160 和 i.MXRT1170 关于 SNVS GPR 设计是一样的。
 - Note 2: i.MXRT1170 上执行了 enable_snvs_gpr() 后,SNVS_LPGPR[3] - SNVS_LPGPR[0] 才能被写入。
 
至此,i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计的更多相关文章
- 痞子衡嵌入式:聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上的普通GPIO与高速GPIO差异. GPIO 可以说是 MCU 上最简单最常用的外设模块了,当一些原生功能外设接口模块不能 ...
 - 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Octal或Hyper Flash上DQS信号与Dummy Cycle联系. 关于在 i.MXRT 上启动 NOR Flash 时如何设 ...
 - 痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT三位数系列隐藏的FlexSPI Remap功能. 前段时间痞子衡写了一篇文章 <利用i.MXRT1060,1010上新 ...
 - 痞子衡嵌入式:对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同. 本篇是 <在SBL项目实战中妙用i.MXRT1xxx里Syst ...
 - 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...
 - 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...
 - 痞子衡嵌入式:聊聊i.MXRT1170双核下不同GPIO组的访问以及中断设计
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170双核下不同GPIO组的访问以及中断设计. 在双核 i.MXRT1170 下设计应用程序,有一个比较重要的考虑点就是外 ...
 - 痞子衡嵌入式:实测i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率. 上一篇文章 <聊聊i.MXRT1xxx上的普通GPIO与高速GP ...
 - 痞子衡嵌入式:再测i.MXRT1060,1170上的普通GPIO与高速GPIO极限翻转频率
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060/1170上的普通GPIO与高速GPIO极限翻转频率. 按照上一篇文章 <实测i.MXRT1010上的普通GP ...
 
随机推荐
- 【模拟8.09】建设城市(city) (容斥)
			
放在了考试T1 发现70分的DP很水啊,f[i][j]为当前位置是i分配了j个队的方案 我们用前缀和统计,在将i删去,j倒序枚举,就可以删掉一维(也可以滚动数组滚起来) 1 #include<i ...
 - NOIP模拟测试17「入阵曲·将军令·星空」
			
入阵曲 题解 应用了一种美妙移项思想, 我们先考虑在一维上的做法 维护前缀和$(sum[r]-sum[l-1])\%k==0$可以转化为 $sum[r]\% k==sum[l-1]\%k$开个桶维护一 ...
 - HTTP首部字段详解
			
HTTP首部字段详解 在HTTP/1.1规范中定义了47种首部字段,总共分为四大类: 通用首部字段 -- 请求报文和响应报文两方都会使用的首部 请求首部字段 -- 从客户端向服务器端发送请求报文时使用 ...
 - 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作
			
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 Kubernetes Java客户端 对于Kubernetes集群的操作,官方提供了命令行工具kubectl,这也是我 ...
 - 旁路电容的PCB布局布线透彻详解(4)
			
原文地址点击这里: 前面使用了较多的篇幅介绍旁路电容的工作原理及其选择依据,我们已经能够为电路系统中相应的数字集成芯片选择合适的旁路电容,在实际应用过程中,旁路电容的PCB布局布线也会影响到高频噪声旁 ...
 - LCD1602液晶显示模块的单片机驱动深入详解之硬件篇
			
(本文以HD44780主控芯片的LCD1602为蓝本进行描述,其中的截图也来自HD44780数据手册,用户可自行搜索其datasheet,有部分整理网上的,但绝对要比你看到的要深入得多) 一.接口 L ...
 - 其实 Linux IO 模型没那么难
			
文章首发于公众号「陈树义」及个人博客 shuyi.tech,欢迎关注访问. 博主个人独立站点开通啦!欢迎点击访问:https://shuyi.tech IO 其实就是 Input 和 Output,在 ...
 - 基于uniapp自定义Navbar+Tabbar组件「兼容H5+小程序+App端Nvue」
			
uni-app跨端自定义navbar+tabbar组件|沉浸式导航条|仿咸鱼凸起标签栏 在跨端项目开发中,uniapp是个不错的框架.采用vue.js和小程序语法结构,使得入门开发更容易.拥有非常丰富 ...
 - ps 快速替换背景颜色
			
1.打开图片: 点击工具栏上的"选择"--色彩范围--按[delete]
 - SQL 小知识笔记
			
1.自动生成序列号 select row_number() over(order by field1) as row_number,* from t_table