[MCU] 华大单片机如何实现软件复位重启

火辣西米秀   2021-3-28 19:48 楼主

   有些特殊的场合对单片机有重启(复位)的需要,以达到保证产品的功能可以正常的实现。重启可以通过硬件和软件两种方法来实现。对于华大单片机大家都知道硬件的重启,只要把RESET引脚给一个20us以上的低电平,再拉高就可以实现,或者直接断电单片机的供电重新上电, 也可以实现单片机的重新运行。可以看出来,硬件的重启需要手工操作来实现,或者搭配额外的电路来实现,硬件操作相对来说不是很方便。软件重启只要通过在程序中写入相应的代码,当条件发生的时候单片机就可以自动完成重启的动作,这样相对来说会方便很多。本篇文章就介绍下如何用软件的方法来实现华大单片机的重启。

以华大单片机HC32L136为例,我们看其用户手册会发现,该产品的复位方式介绍如下:

image-20210328194743-1.png
本产品具有 7 个复位信号来源,每个复位信号都可以让 CPU 重新运行,绝大多数寄存器会被复位到复位值,程序会从复位向量处开始执行。

数字区域上电掉电复位 POR
外部 Reset PAD,低电平为复位信号
WDT 复位
PCA 复位
LVD 低电压复位
Cortex-M0+ SYSRESETREQ 软件复位
Cortex-M0+ LOCKUP 硬件复位
从上面的介绍中可以看出来硬件方式可以实现的复位有:
数字区域上电掉电复位 POR
外部 Reset PAD,低电平为复位信号
LVD 低电压复位
Cortex-M0+ LOCKUP 硬件复位
软件方式可以实现的复位有:
WDT 复位
PCA 复位
Cortex-M0+ SYSRESETREQ 软件复位
WDT复位为看门狗复位,开启看门狗后,在看门狗设置的时间内没有发生喂狗的操作,WDT模块将会产中复位操作把单片机复位。PCA复位其实也是一种特殊的看门狗复位,只对PCA4模块起作用,并且要把PCA4模块配置为看门狗方式,原理和WDT复位相同。Cortex-M0+ SYSRESETREQ 软件复位是通过操作单片机的寄存器直接完成复位操作,这种方法在实际使用中应用的最普遍。下面着重介绍一下这种方法。
细心的工程师会发现在华大单片机的用户手册中没有关于Cortex-M0+ SYSRESETREQ 软件复位是如何来实现的相关介绍,这是为什么呢?因为Cortex-M0+ SYSRESETREQ 软件复位是ARM内核中自带的功能,不是厂家来定义的,大多数的用户手册介绍的内容都是厂家自己搭配的外设模块的使用。关于内核的介绍大家可以ARM的官网下载相关的文档,也可以看也《ARM+Cortex-M0权威指南》这本书。在《ARM+Cortex-M0权威指南》中可以找到关于 SYSRESETREQ软件复位的介绍如下:

看到介绍我们用明白了如果用寄存器操作的方法来实现只要使用下面的代码就可以:

SCB->AIRCR  = 0X05FA0004;
while(1)
{
    _NOP();
}

代码中在操作AIRCR寄存器后面加入的死循环的目的是等待作用,等待单片机完成复位,而不要再去做其它的工作。

其实SYSRESETREQ 软件复位的代码,在ARM的内核代码中已经为大家提供了,大家在使用的时候只在调用就可以。在core_cm0plus.h文件中相关的代码如下 :

  #define NVIC_SystemReset            __NVIC_SystemReset

/**
  \brief   System Reset
  \details Initiates a system reset request to reset the MCU.
 */
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
{
  __DSB();                                                          /* Ensure all outstanding memory accesses included
                                                                       buffered write are completed before reset */
  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
                 SCB_AIRCR_SYSRESETREQ_Msk);
  __DSB();                                                          /* Ensure completion of memory access */

  for(;;)                                                           /* wait until reset */
  {
    __NOP();
  }
}

由上面的代码可以知道,我们在自己的程序中果要想实现SYSRESETREQ 软件复位软件复位的话只要如下的代码就可以实现:

NVIC_SystemReset();

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复