[综合信息] 华大单片机如何实现软件复位重启

[复制链接]
 楼主| 软核硬核 发表于 2022-9-14 16:41 | 显示全部楼层 |阅读模式
工程师朋友在做产品的时候,有些特殊的场合对单片机有重启(复位)的需要,以达到保证产品的功能可以正常的实现。重启可以通过硬件和软件两种方法来实现。对于华大单片机大家都知道硬件的重启,只要把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软件复位的介绍如下:
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dpbGxPa2F5,size_16,color_FFFFFF,t_70#pic_center.jpg

看到介绍我们用明白了如果用寄存器操作的方法来实现只要使用下面的代码就可以:
  1. SCB->AIRCR  = 0X05FA0004;
  2. while(1)
  3. {
  4.     _NOP();
  5. }

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

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

  1.   #define NVIC_SystemReset            __NVIC_SystemReset

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

  13.   for(;;)                                                           /* wait until reset */
  14.   {
  15.     __NOP();
  16.   }
  17. }

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

  1. NVIC_SystemReset();



littlelida 发表于 2022-9-15 20:52 | 显示全部楼层
辛苦辛苦,学习下
 楼主| 软核硬核 发表于 2022-10-5 20:06 | 显示全部楼层
两只袜子 发表于 2022-9-15 11:30
这个贴很适合新手看啊,感谢分享

其实很简单,只要能看到官方的手册和代码就可以了!
wilhelmina2 发表于 2022-10-13 19:50 | 显示全部楼层
SYSRESETREQ 软件复位  
yeates333 发表于 2022-10-13 19:59 | 显示全部楼层
只需简单的控制 ISP_ CONTR 特殊功能寄存器的其中两位 SWBS 和 SWRST 就可以实现系统复位。
ingramward 发表于 2022-10-13 20:23 | 显示全部楼层
官方自带的软件库 在官方软件库的 core_cm3.h 文件里
youtome 发表于 2022-10-13 20:57 | 显示全部楼层
标准库开发软件复位函数完成。   
iyoum 发表于 2022-10-13 21:36 | 显示全部楼层
这个使用看门狗复位不行吗                 
burgessmaggie 发表于 2022-10-13 22:19 | 显示全部楼层
WDT 复位 PCA 复位            
d1z1y2 发表于 2022-10-14 09:02 | 显示全部楼层
都是arm核,这个在内核驱动库里面有相关函数,而且只要是内核相同的芯片,不管哪家,函数名都一样,
skyred 发表于 2022-10-16 11:20 | 显示全部楼层
看门狗?
jonas222 发表于 2022-11-2 17:12 | 显示全部楼层
看门狗复位方案也可以试一下。              
tifmill 发表于 2022-11-2 17:33 | 显示全部楼层
NVIC_SystemReset  可以实现的。
sesefadou 发表于 2022-11-2 17:52 | 显示全部楼层
推荐使用复位芯片,复位芯片定时清除复位信号。
loutin 发表于 2022-11-2 18:21 | 显示全部楼层
查看一下这个应该有宏定义实现的。
 楼主| 软核硬核 发表于 2022-11-3 09:35 | 显示全部楼层
d1z1y2 发表于 2022-10-14 09:02
都是arm核,这个在内核驱动库里面有相关函数,而且只要是内核相同的芯片,不管哪家,函数名都一样, ...

函数名都一样?应该是函数的寄存器都一样吧?
primojones 发表于 2023-1-6 22:02 | 显示全部楼层
你是要实现哪个芯片的操作?              
tifmill 发表于 2023-1-9 11:33 | 显示全部楼层
有软件复位的。              
1988020566 发表于 2023-2-2 11:09 | 显示全部楼层
NVIC_SystemReset() 函数用来复位
alvpeg 发表于 2023-2-2 11:18 | 显示全部楼层
使用看门狗就行了。              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

2274

帖子

1

粉丝
快速回复 返回顶部 返回列表