zoukankan      html  css  js  c++  java
  • 痞子衡嵌入式: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主页知乎主页微信公众号 平台上。

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

      最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。

    痞子衡嵌入式-微信二维码 痞子衡嵌入式-微信收款二维码 痞子衡嵌入式-支付宝收款二维码

      衡杰(痞子衡),目前就职于恩智浦MCU系统部门,担任嵌入式系统应用工程师。

      专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/

      与痞子衡进一步交流或咨询业务合作请发邮件至 hengjie1989@foxmail.com

      可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。

      关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。

      痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。


  • 相关阅读:
    pronunciation techniques
    contraction prnounciation
    洛谷P2097 资料分发1 题解
    洛谷P1482 Cantor表(升级版) 题解
    洛谷P1615 西游记公司 题解
    洛谷P2676 超级书架 题解
    洛谷P1554 梦中的统计 题解
    洛谷P1720 月落乌啼算钱 题解
    洛谷P1420 最长连号 题解
    洛谷P1634 禽兽的传染病 题解
  • 原文地址:https://www.cnblogs.com/henjay724/p/15072866.html
Copyright © 2011-2022 走看看