STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)

STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)。

1.硬件复位:
硬件复位通过给NRST引脚输入低电平复位单片机。

STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)

STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)
STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)

1.2.2启动过程:

1.2.2.1向IWDG_KR中写入0X5555
通过这一步我们取消了IWDG_PR和IWDG_RLR的写保护,下一步我们设置他们初值。
设置IWDG_PR和IWDG_RLR的初值。
我们计算一下看门狗的喂狗时间(看门狗溢出时间)计算公式

*Tout=((4*2^prer)rlr)/40

其中Tout就是看门狗溢出时间(单位ms),prer是看门狗时钟预分频值(IWDG_PR值),范围为0~7,rlr位看门狗重载值(IWDG_RLR)。比如我们设置prer为4,rlr的值为625,我们就可以计算得到Tout=64*625/40=1000ms,这样,看门狗的溢出时间就是1S,只要在这一秒钟内,有一次吸入0XAAAA到IWDG_KR,就不会导致看门狗复位(写入多次也是可以的)(由于看门狗的时钟不是准确40Khz,所以喂狗不要太晚,以免发生看门狗复位)。

1.2.2.2向IWDG_KR中写入0XAAAA
通过这句可以将重载寄存器(IWDG_RLR)中的计数初值载入到看门狗计数器中(也可以时钟该命令喂狗)。

1.2.2.3向IWDG_KR中写入0XCCCC
通过这句我们就启动了STM32的看门狗了,使能了看门狗,在程序里面我们就必须间隔一定的时间就喂狗,否则导致程序复位,利用这一点,我们通过一个LED来指示是否复位,验证独立看门狗
举例:正点原子独立看门狗
源文件:

主函数源文件:

(2)窗口看门狗

STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)
该位中的 EWI 是提前唤醒中断,也就是在快要产生复位的前一段时间(T[6:0]=0X40)来
提醒我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗
的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中
断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。注意这里在进入中断后,必
须在不大于 1 个窗口看门狗计数周期的时间(在 PCLK1 频率为 36M 且 WDGTB 为 0 的条件下,
该时间为 113us)内重新写 WWDG_CR,否则,看门狗将产生复位!
STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)
图 12.1.1 中,T[6:0]就是 WWDG_CR 的低七位,W[6:0]即是 WWDG->CFR 的低七位。T[6:0]
就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。
当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。
上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保
窗口值大于 0X40,否则窗口就不存在了。
窗口看门狗的超时公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg:WWDG 超时时间(单位为 ms)
Fpclk1:APB1 的时钟频率(单位为 Khz)
WDGTB:WWDG 的预分频系数
T[5:0]:窗口看门狗的计数器低 6 位
根据上面的公式,假设 Fpclk1=36Mhz,那么可以得到最小-最大超时时间表如表 12.1.1 所
示:
STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)
步骤如下:
1)使能 WWDG 时钟
2)设置窗口值和分频数
3)开启 WWDG 中断并分组
4) 设置计数器初始值并使能看门狗
5) 编写中断服务函数

正点原子程序:
源程序

主程序:

3、系统复位:
系统复位是置位同一个寄存器中的 SYSRESETREQ 位。这种复位则会波及整个芯片上的电路:它会使Cortex-M3处理器把送往系统复位发生器的请求线置为有效。但是系统复位发生器不是Cortex-M3的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的响应也不同。因此,读者需要认真参阅芯片规格书,明白当发生片内复位时,各外设和功能模块都会回到什么样的初始状态,或者有哪些功能模块不受影响(比如,STM32系列的芯片有后备存储区,该区就被特殊对待)。

大多数情况下,复位发生器在响应 SYSRESETREQ 时,它也会同时把Cortex-M3处理器的系统复位信号(SYSRESETn)置为有效。通常,SYSRESETREQ不应复位调试逻辑。

这里有一个要注意的问题:从SYSRESETREQ被置为有效到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把FAULTMASK置位。利用库函数:
__set_FAULTMASK(1); //STM32程序软件复位
NVIC_SystemReset();

资料来源:
正点原子STM32F1开发指南。

来源:走出地球

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月16日
下一篇 2021年4月16日

相关推荐