妙用MCU中SystemReset不复位的通用寄存器!

嵌入式资讯精选 2021-06-04 11:31

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1xxx里SystemReset不复位的GPR寄存器的小妙用

我们知道稍大规模的项目代码设计一般都是多人协作完成的,在项目开始阶段的总体设计时,项目组长通常会将代码按功能进行划分,每个功能块代码之间尽量做到耦合度低、互不依赖、互不影响,这样各功能可以独立进行单元测试,项目得以并行开发,后期通过事先定义好的接口/协议进行功能块集成即可。

但上述方法在嵌入式软件项目里有时候会遇到功能块集成后互相干扰的问题,因为嵌入式项目很多时候并不是纯软件设计,也会跟片内外设资源打交道,而片内外设属于硬件范畴,硬件模块的工作是有前后状态依赖的(这点在片内时钟的配置上体现得尤其明显),出了问题传统方法是具体分析具体解决,来一个就解决一个,但任何代码的改动或者后期新特性的增加都可能会带来新的潜在干扰问题。

那么对于上述困境,有没有一个一劳永逸的解决方法?其实是有的!那就是每个功能块在设计时都不要依赖芯片初始状态,按照进入时先清理系统环境,然后做功能设计,退出时做一下系统恢复。这种方法虽然保险,但是会引入集成后项目整体运行低效的问题。今天痞子衡要在具体项目实战中介绍一种利用i.MXRT芯片内System Reset后不复位的GPR寄存器来解决属性上互斥的功能代码块集成互相干扰问题的方法。

一、SBL项目中的痛点

恩智浦MCU SE团队近期一直在加班加点赶一个大项目,这个项目是为客户产品OTA需求而生的。我们知道在线升级是每个智能产品都不可绕开的话题,恩智浦SE团队为了方便客户在基于i.MXRT/LPC的产品上做在线升级,特别推出OTA参考设计,下面是功能架构简图:项目分为SBL + SFW两部分,SBL负责ISP本地更新(UART/USB)以及App切换管理;SFW是一个示例App,其除了客户项目业务功能外,也集成了远程更新功能(WiFi、以太、U盘、SD卡四种升级方式)。

在SBL代码设计里,主要有两大子功能模块:一个是ISP本地更新 (isp_boot_main),另一个是App切换管理(sbl_boot_main),其中ISP本地更新属于可选项,而App切换管理是必选。

SBL的主流程是上电启动运行后,先执行ISP本地更新功能块,在超时时间内,如果有收到来自Host的ISP命令,则进入ISP命令处理,此后除非执行ISP复位命令或者有板级复位,否则不会退出ISP;

如果在超时时间内没有收到ISP命令,则转到App切换管理功能块。在验证App时,如果发现Flash里有合法App,则跳转过去执行;如果没有发现合法的App,会重新返回ISP本地更新(此时是无限超时)。大概主逻辑代码如下:

#define COMPONENT_MCU_ISP
#define ISP_TIMEOUT (5) // in seconds

int main(void)
{
#if (defined(COMPONENT_MCU_ISP))
    // 先尝试isp本地更新(有5s超时)
    bool isInfiniteIsp = false;
    isp_boot_main(isInfiniteIsp);
#endif

    // 无本地升级则进入app跳转处理
    sbl_boot_main();
}

#if (defined(COMPONENT_MCU_ISP))
void isp_boot_main(bool isInfiniteIsp)
{
    if (isInfiniteIsp || ISP_TIMEOUT)
    {
        // isp相关功能外设初始化
        isp_boot_init();
        // 在5s超时时间内/无限超时去等待isp命令
        isp_boot_run(isInfiniteIsp);
    }
}
#endif

void sbl_boot_main(void)
{
    // 判断Flash里是否存在合法的app
    if (sbl_boot_go() != 0
    {
#if (defined(COMPONENT_MCU_ISP))
        // 无合法app,重入isp本地更新(无限超时)
        bool isInfiniteIsp = true;
        isp_boot_main(isInfiniteIsp);
#endif
        NVIC_SystemReset();
    }
    else
    {
        // 有合法app,跳转到app执行
        sbl_do_boot();
    }

    while (1);
}

上述SBL设计里,你会发现ISP本地更新和App切换管理两个功能块在执行上是互斥的,是Flash里的App处理需求将它们联系在了一起。从软件集成角度来说,这两个功能本不该互相影响,但实际上它们之间产生了互相影响,因为各自在设计时没有遵循进入时清理系统、退出时恢复现场的准则,所以 isp_boot_main() 在超时结束后跳到 sbl_boot_main() 对其部分验签功能产生了影响,而 sbl_boot_main() 执行后没找到合法App跳回 isp_boot_main() 时又出现ISP功能不正常的情况,我们需要解决这个问题。

二、寻找i.MXRT中理想的GPR寄存器

第一小节里描述的问题,可以通过功能块退出时恢复现场来解决,但是每个模块代码量都比较大,使用代码去逐一恢复现场不太容易。痞子衡想到的一个好办法就是调用 NVIC_SystemReset() 函数来简单粗暴地将芯片系统复位,我们所需要做的就是寻找一个区域,能够临时存放标志位,并且这个区域内容不受系统软复位的影响,芯片复位回来之后在SBL里增加对标志位的判断处理,处理结束后再将标志位清掉。

在寻找这个不受系统软复位影响的区域前,我们先对i.MXRT里面的电源管理架构作个基本了解。下图是i.MXRT1060的电源架构,除了USB和ADC模块特殊供电需求外,芯片一共有四种电源输入。在板级供电设计时,通常VDD_SNVS_IN需要单独一路外部输入(设计上应由电池供电),其他三路电源VDD_HIGH_IN / DCDC_IN / VDD_SOC_IN可共用一路外部输入(芯片POR_B引脚往往连在这个外部输入控制上)。

VDD_HIGH_IN:给芯片内部LDO供电
DCDC_IN:给芯片内部DCDC模块供电
VDD_SOC_IN:给芯片主系统(Core,SoC,Memory)供电

VDD_SNVS_IN:给芯片内部SNVS域相关模块供电

从芯片系统复位等级上来分,一共有三类复位:第一类是借助Cortex-M7内核SCB模块的AIRCR寄存器中集成的SYSRESETREQ复位的支持、第二类是DCDC重新上电(POR_B复位)、第三类是整体重新上电。依据这三种不同程度的复位,痞子衡整理了i.MXRT上所有可存放标志位的区域受不同复位类型影响情况如下:

模块 \ 复位类型NVIC_SystemReset()POR_B和DCDC重新上电整体重新上电
TCM
           OCRAM
           IOMUXC_GPR
           SRC_GPR
保持复位复位
IOMUXC_SNVS_GPR
           SNVS_LPGPR
保持保持复位
Flash, eFuse保持保持保持

根据上表,我们先排除掉NVM属性的Flash和eFuse,它们不符合临时存放、轻松读写的需求。TCM / OCRAM可用,但需要在SBL工程里做特殊处理,分配一块.noinit区,并且要确定BootROM没有使用这个区域,用起来还是有点麻烦。IOMUXC_GPR / SRC_GPR用起来简单,但它们已被SoC / BootROM占用了,不能随便使用,对芯片产生的影响未知。IOMUXC_SNVS_GPR / SNVS_LPGPR这两个都不错,但后者在使能加密时有时会被用来存放用户密钥。所以 IOMUXC_SNVS_GPR 寄存器才是最佳选择,这也是真正意义上开放给用户自由使用的GPR寄存器。

三、在SBL项目中使用GPR寄存器

现在我们找到了理想的 IOMUXC_SNVS_GPR 寄存器,那么可在SBL代码中增加两个函数 isp_cleanup_enter()、isp_cleanup_exit(),前者用于触发软复位前标记状态,后者用于软复位后读取标记的状态做相应处理。最终修改后的SBL主逻辑代码如下:

#define CLEANUP_ISP_TO_SBL (0x5A)
#define CLEANUP_SBL_TO_ISP (0xA5)

bool isp_cleanup_exit(bool *isInfiniteIsp)
{
    uint32_t flag = IOMUXC_SNVS_GPR->GPR0;
    switch (flag)
    {
        // SBL_TO_ISP软复位情况下,进入无限超时isp
        case CLEANUP_SBL_TO_ISP:
            *isInfiniteIsp = true;
            flag = 0x0;
            break;
        // 第一次上电或ISP_TO_SBL软复位情况下,直接退出isp
        case CLEANUP_ISP_TO_SBL:
        default:
            break;
    }
    IOMUXC_SNVS_GPR->GPR0 = 0x0;
    return flag;
}

void isp_cleanup_enter(uint32_t flag)
{
    IOMUXC_SNVS_GPR->GPR0 = flag;
    NVIC_SystemReset();
}

#if (defined(COMPONENT_MCU_ISP))
void isp_boot_main(bool isInfiniteIsp)
{
    // 加一级对于Reset不复位flag的判断处理
    if (!isp_cleanup_exit(&isInfiniteIsp))
    {
        if (isInfiniteIsp || ISP_TIMEOUT)
        {
            isp_boot_init();
            isp_boot_run(isInfiniteIsp);
            // 标记flag为ISP_TO_SBL,并触发软复位
            isp_cleanup_enter(CLEANUP_ISP_TO_SBL);
        }
    }
}
#endif

void sbl_boot_main(void)
{
    if (sbl_boot_go() != 0
    {
#if (defined(COMPONENT_MCU_ISP))
        // 标记flag为SBL_TO_ISP,并触发软复位
        isp_cleanup_enter(CLEANUP_SBL_TO_ISP);
#endif
        NVIC_SystemReset();
    }
    else
    {
        sbl_do_boot();
    }

    while (1);
}

至此,i.MXRT1xxx里SystemReset不复位的GPR寄存器的小妙用痞子衡便介绍完毕了,掌声在哪里~~~

1.对国产嵌入式操作系统,你了解多少?

2.“构建安全的嵌入式系统”线上课程,6月1日正式报名!

3.Arm亮出多款大小核CPU!

4.在51单片机上跑RTOS有没有意义?

5.国产芯片创业的战略思考

6.嵌入式开发中,数值常量如何转化为内存地址?

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

嵌入式资讯精选 掌握最鲜资讯,尽领行业新风
评论
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 324浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 666浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 619浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 135浏览
  • 飞凌嵌入式基于瑞芯微RK3562系列处理器打造的FET3562J-C全国产核心板,是一款专为工业自动化及消费类电子设备设计的产品,凭借其强大的功能和灵活性,自上市以来得到了各行业客户的广泛关注。本文将详细介绍如何启动并测试RK3562J处理器的MCU,通过实际操作步骤,帮助各位工程师朋友更好地了解这款芯片。1、RK3562J处理器概述RK3562J处理器采用了4*Cortex-A53@1.8GHz+Cortex-M0@200MHz架构。其中,4个Cortex-A53核心作为主要核心,负责处理复杂
    飞凌嵌入式 2025-01-24 11:21 50浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 123浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 181浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 159浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 195浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 145浏览
  • 故障现象 一辆2007款日产天籁车,搭载VQ23发动机(气缸编号如图1所示,点火顺序为1-2-3-4-5-6),累计行驶里程约为21万km。车主反映,该车起步加速时偶尔抖动,且行驶中加速无力。 图1 VQ23发动机的气缸编号 故障诊断接车后试车,发动机怠速运转平稳,但只要换挡起步,稍微踩下一点加速踏板,就能感觉到车身明显抖动。用故障检测仪检测,发动机控制模块(ECM)无故障代码存储,且无失火数据流。用虹科Pico汽车示波器测量气缸1点火信号(COP点火信号)和曲轴位置传感器信
    虹科Pico汽车示波器 2025-01-23 10:46 80浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦