各位猿友大家好,今天收到了嵌入式程序猿公众号文章推送以来的第一篇投稿,来自于一位美女工程师。欢迎大家踊跃投稿。
概述
在嵌入式系统中,复位(Reset)功能的应用非常广泛。复位是MCU工作开始的标志,MCU中所有的初始化工作都是在复位之后开始的。在实际应用中,我们也可以通过对系统复位类型的检测和分析,判断系统的工作状态是否正常,在代码调试的过程中,也可以帮助我们分析异常原因。
这篇文章主要总结一下Freescale的Kv4x系列的复位类型。Kv4x系列基于ARMCortex-M4内核,支持的复位源还真不少。从复位类型上可以分为三个大类: 上电复位,系统复位和调试复位。如下图所示。
每一个复位源都对应系统复位状态寄存器(SRS)中的一个相关位,可以在系统复位后,通过读该寄存器的值来判断复位类型。
Kv4x系列还支持对一些模块进行配置,允许将一些产生中断的情况也配置成复位源,这些内容在本文中暂不作阐述,如需进一步了解可查阅相应的参考手册。
复位源类型
上电复位
Power On Reset。当MCU的电源上电,或者电源电压下降到上电复位电压VPOR以下时,上电复位电路将会产生一个POR复位信号。
随着电源电压的上升,LVD 电路将 MCU 保持在复位状态,直到电压上升到 LVD 低压门限之上(VLVDL),系统才会重新启动。
在上电复位发生后,RCM_SRS0寄存器的POR和LVD位会同时被置位。
系统复位
外部引脚复位
External PIN Reset。在器件中,复位引脚是一个专用的引脚,引脚是开漏的,有一个内部的上拉驱动。外部复位引脚可以将MCU从任何模式唤醒。
在外部引脚复位之后,RCM_SRS0寄存器的PIN位会被置位。
低电压复位
Low Voltage Detect Reset。器件包含一个在电压变化时保护器件的内存,并且控制MCU系统状态的系统。系统包含一个上电复位电路和用户可配置上下限的低压检测电路。检测阀值由LVDSC1[LVDV]控制。低压检测单元在 MCU运行、等待和停止模式都会使能。在 VLPx、LLSx和 VLLSx 等低功耗模式下被禁止。
通过配置 LVDSC1[LVDRE]可以使低压检测单元在检测到电压变化时产生一个复位。当一个低压复位产生时,低压检测单元可以使 MCU 保持复位状态,直到电压恢复到最低水平之上。
低电压复位会导致RCM_SRS0寄存器的LVD位被置位。
需要注意的是,如果要正确的使能LVD复位,还需要配置PMC_LVDSC1寄存器
该寄存器的 LVDIE 位和LVDRE位可以配置当检测到Low Voltage时,究竟是引发中断还是引发系统复位。当LVDIE位置1时,将引发中断。当LVDRE位置1时,将引发系统复位。
该寄存器的LVDV位用来配置Low Voltage检测电压。具体配置如下表
看门狗复位
Watchdog Reset。看门狗定时器会通过周期性的对系统喂狗,从而监视系统是否正常工作,防止系统跑飞。如果等待时间超过看门狗定时器的复位时间,还没有发生周期性的喂狗,则会产生一个看门狗复位。
看门狗复位会导致RCM_SRS0寄存器的COP位置位。
低漏唤醒复位
LLWU Reset。低漏唤醒模块可以使用高达 16 个外部引脚、复位引脚和高达7个内部的模块从 LLS 和 VLLSx模式中唤醒MCU。LLWU模块只在LLS和VLLSx模式下有效。在LLS 模式下只能使用复位引脚唤醒MCU,在任何VLLS 模式下可以通过唤醒或者其它的复位事件唤醒MCU。当发生地漏唤醒时,系统会产生一个低漏唤醒复位。
低漏唤醒复位会导致RCM_SRS0寄存器的WAKEUP位置位。
多路时钟发生器时钟丢失复位
Loss of Clock Reset。若要使能LOC Reset,需要做以下配置。
1. 使能时钟监控器。将MCG_C6寄存器的CME位置1。
2. 配置MCG_C2寄存器的RANGE位,配置MCG外部参考时钟频率下限,见下表:
MCG包含一个时钟监控器。当MCG的外部参考时钟频率下降到期望值之下时,该时钟监控器会产生一个LOC复位。
LOC复位会导致RCM_SRS0寄存器的LOC位被置位。
软件复位
SW Reset。NVIC控制器的SYSRESETREQ位能够强制系统产生一个软件复位。当SYSRESETREQ位被置位时,会产生一个复位请求。软件复位会重置除去调试模块以外的其他任何模块。
软件复位会导致RCM_SRS1寄存器的SW位置位。
锁定复位
LOCKUP Reset。锁定复位用来指示内核软件的严重错误。当系统内置的硬件保护装置被激活,从而产生了一个不可恢复的异常时,内核将被锁定,并引发锁定复位。
锁定复位会导致RCM_SRS1寄存器的LOCKUP位置位。
MDM-AP系统复位
将MDM-AP控制器的复位请求位(System Reset Request)置位,将导致MDM-AP系统复位。这是通过JTAG接口复位的主要方法。直到在该位被清除之前,系统复位会一直保持。
将 MDM-AP 控制器的复位保持位(Core Hold Reset)会在复位发生时,使内核一直保持在复位状态,直到该位被清除。
MDM-AP系统复位会导致RCM_SRS1寄存器的MDMAP位置位。
调试复位
调试复位不会导致RCM_SRS1寄存器的状态位发生改变。
特定的代码会使 JTAG 模块产生一个系统复位。这个复位功能是在EXTEST,HIGHZ和CLAMP功能下使能的。
使能nTRST引脚会产生一个 JTAG逻辑复位。
复位类型检测
Kv4x系列芯片有一个复位控制模块,可以用来监测系统的复位类型和状态。通过读取RCM_SRS0和RCM_SRS1寄存器的相应位的值,可以判断系统的上一次复位是什么类型。
POR:置1表示系统发生了上电复位。(此时LVD位也会被同时置1)。
PIN:置1表示系统发生了外部引脚复位。
WDOG:置1表示系统发生了看门狗复位。
LOL:置1表示系统发生了MCG PLL失锁复位。
LOC:置1表示系统发生了外部时钟丢失复位。
LVD:置1表示系统发生了低电压复位。
WAKEUP:置1表示系统发生了低漏唤醒复位。
SACKERR:置1表示系统发生了停止模式应答错误复位。
MDM_AP:置1表示系统发生了MDM_AP系统复位。
SW:置1表示系统发生了软件复位。
LOCKUP:置1表示系统发生了锁定复位。
复位检测软件设计
实际系统中,我们经常需要对系统工作中的复位的类型和次数信息进行记录和保存。这时就需要用到存储模块。由于Kv4x系列没有内部的EEPROM,所以需要使用外接EEPROM来完成存储。还有一种方法是将FLASH空间进行配置,划出一片专用区域,实现EEPROM的功能。(具体可查阅参考手册中相关内容)。
复位检测功能的具体实现步骤如下:
STEP 1:初始化EEPROM。将初始化好的复位信息结构体存入EEPROM中指定地址。这部分工作需要提前完成,不在最终的程序中。
STEP 2:复位检测逻辑。这部分就是最终程序中的逻辑。
1. 系统上电后,读取EEPROM中的复位信息结构体。
2. 检测上一次复位类型,更新复位信息结构体。例如更新上次复位类型,该复位类型计数加1等。
3. 将更新后的复位信息结构体再次保存如EEPROM指定地址。
4. 继续运行后续程序。
这样,每当系统发生复位时,程序会检测复位信息,并记录在EEPROM中。
我们还可以在读写EEPROM时加入CRC校验逻辑。具体方法如下,写入EEPROM时同时写入CRC校验值,下次读取时计算并检验CRC校验值是否正确,如果不正确则说明EEPROM中的信息出现错误,则重新初始化EEPROM中储存复位信息的地址空间。使用CRC校验的方法,不仅可以保证存储的正确性。而且还能省去前一种方法中EEPROM的初始化部分,因此更加推荐。