coshi 发表于 2021-8-7 15:31

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

工程师朋友在做产品的时候,有些特殊的场合对单片机有重启(复位)的需要,以达到保证产品的功能可以正常的实现。重启可以通过硬件和软件两种方法来实现。对于华大单片机大家都知道硬件的重启,只要把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();



yangxiaor520 发表于 2021-8-7 18:02

就是一条指令的问题

aspoke 发表于 2021-8-8 21:57

华大单片机跟是stm32一样的吗

232321122 发表于 2021-8-8 21:57

对CM3内核寄存器直接操作的

ghuca 发表于 2021-8-8 21:57

置位VECTRESET位

soodesyt 发表于 2021-8-8 21:58

NVIC_SystemReset   

mnynt121 发表于 2021-8-8 21:58

内部是怎么实现的呢

plsbackup 发表于 2021-8-8 21:58

死机也可以软件复位吗

kmzuaz 发表于 2021-8-8 21:58

这个是stm32的吧

qiufengsd 发表于 2021-8-8 21:59

通用的软件复位吗

sdCAD 发表于 2021-8-8 21:59

一般程序软件复位的多。

fengm 发表于 2021-8-8 21:59

具体的是使用什么代码呢

gwsan 发表于 2021-9-6 12:15

有好几种方式啊这是

zljiu 发表于 2021-9-6 12:38

要是能有详细代码就更好了

caigang13 发表于 2021-9-7 12:30

就是调用软复位命令而已。
页: [1]
查看完整版本: 华大单片机如何实现软件复位重启