中颖M0+内核芯片软件模拟内核复位的方法

1、关于复位
说到复位,我们都不会陌生,对于一个mcu系统,复位电路是必不可少的一部分。复位的种类有很多:上电复位、低电压复位、引脚复位、看门狗复位、软件复位等等。本文说的内核复位是软件复位的一种。
cortex-m3内核芯片提供了两种软件复位,分别是系统复位和内核复位,而cortex-m0+内核芯片只提供了系统复位,内核复位不支持,只能软件模拟。
2、系统复位和内核复位的区别
内核复位:只复位内核处理器,而不复位外设如gpio、timer、uart、flash等的寄存器。
系统复位:既复位内核处理器,又复位外设寄存器。
下面分别是cortex-m3和cortex-m0+的应用程序中断及复位控制寄存器(aircr)配置图,从图中可以看出,置位aircr寄存器中的sysresetreq位(位偏移:2),即可实现系统复位;置位vectreset位(位偏移:0),即可实现内核复位。cortex-m0+中没有vectreset的定义,故不支持内核复位。本文会介绍一种软件模拟内核复位的方法。
图1  cortex-m3 应用程序中断及复位控制寄存器(aircr)
图2  cortex-m0+应用程序中断及复位控制寄存器(aircr)
系统复位在arm官方的库文件中都有提供相关的函数,用户直接调用即可。官方给出的系统复位函数定义如下所示:
内核复位在arm官方的库文件中没有相关的函数,需要用户自行编写。cortex-m3的内核复位函数编写如下:
3、软件模拟内核复位的方法
内核复位在某些特殊应用下,如ota升级时,往往会被用到。此时,不希望复位外设,只需要程序从头开始跑即可。以中颖m0+内核芯片为例,在启动配置章节有介绍到,用软件模拟内核复位来使运行在引导区的程序改由从用户代码区启动。
中颖m0+内核芯片从复位中退出时,会首先读取向量表中(从地址0x00000000开始,见图3)的头两个字。第一个字为主栈指针(msp)的初始值,而第二个字则为决定程序执行起始地址(复位处理)的复位向量。该复位流程可以用软件去模拟,图4是软件模拟内核复位的c语言源码。
图3 向量表
图4 软件模拟内核复位的c语言源码
图4源码中,第1行定义了函数指针类型,取名为“func_call”;第2,3行申明了两个变量,分别是无符号整型变量main_pgm和函数指针类型变量func;第5~20行定义了一个函数,取名为__nvic_corereset(),该函数可以实现对msp装载复位初始值,并使程序跳转到复位向量处开始执行,进而模拟了内核复位。
函数__nvic_corereset()中,第9行调用了arm官方库文件中的函数(见下图),将存储器0x0地址处的值赋给了寄存器msp,实现了msp复位初始值的装载;第10行是将存储器0x4地址处的值赋给变量main_pgm;第11行是将变量main_pgm强制转换成函数指针类型并赋给func;第12行调用函数func(),最终使程序跳转到了存储器0x4地址存储的复位向量处运行。
用户需要内核复位时,在程序中直接调用图4中定义的函数__nvic_corereset()即可。
4、总结
综上所述,本文提供了一种软件模拟内核复位的方法,通过调用自定义函数__nvic_corereset()即可实现内核复位,给出了该函数的c语言源码,用户直接在自己程序中加载即可使用。该方法弥补了cortexm0+芯片没有自带内核复位功能的不足。
来源:中颖电子(作者:余为国)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


中国成全球汽车市场最亮眼的存在
天玑9300什么时候发布?11月6日4*4全大核架构来袭
LED照明产品的五个基础要点
基于VMM的智能配电设计
一文详解Java动态调试技术
中颖M0+内核芯片软件模拟内核复位的方法
数码相机维修基础知识
如何防止过电压对变电设备的危害(避雷器、避雷针、接地装置)
中软国际在数字化转型方向的实践与成果
Pika能源公司推出Harbor Plus智能电池
测试套件加速 SPE 汽车设计
USB4作为一个“新物种”有何特殊之处?
基于800V技术的新型动力总成解决方案
十年半导体改变了什么?
PPC-3100D工业平板电脑特点介绍
盘点大陆与台湾在半导体业呈现的极大差距
Bantam Tools 桌面 PCB 铣床通过 Digi-Key 面向全球即时供货
可穿戴式传感器的类型盘点
物联网ABC-A,从整体上掌握物联网的概念
生物识别支付技术在生活中的应用有哪些