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

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

以华大单片机HC32L136为例,我们看其用户手册会发现,该产品的复位方式介绍如下:
本产品具有 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();

关注微信公众号『芯缘意码』,查看更多内容,回复“加群”加入技术交流群。
淘宝 店铺 搜索 『芯缘意码』,购买开发学习板仿真器。
公众号:芯缘意码https://shop219666036.taobao.com


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值