STM32F10xx中独立看门狗(IWDG)和窗口看门狗(WWDG)介绍

本文大部分内容只用到了键盘的3个按键…你懂的 。 简单总结,Markdown了解一下,推荐。

1.看门狗电路介绍
看门狗电路(watchdog timer),又称监控电路。百度百科解释的很详细:

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误,不在程序区,取出错误的程序指令等,都会陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续正常工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。

看门狗电路本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做喂狗(no service, die!),输出一般连接到另外一个部分的复位端,一般是连接到主控芯片。看门狗的功能是定期的查看芯片内部的情况,防止程序发生死循环或者程序跑飞,一旦发生错误就向芯片发出重启信号。
通俗理解就是你领养了一只小狗,你不在时可以帮你看好你的羊不乱跑,为了让它听话你必须按时地喂它。显然,如果是只‘小狗’,便看不住太多的‘羊’。
注意:看门狗命令在程序的中断中拥有最高的优先级!

2.基本原理
看门狗是一种监控系统运行状况的手段,通过软硬件结合的方式实现对系统运行状况的监控。稳定运行的软件会在执行完特定指令后进行喂狗,若在一定周期内看门狗没有收到来自软件或硬件的喂狗信号,则表示MCU已经挂了,会进入中断处理程序或强制系统复位(最高优先级)。看门狗主要由寄存器、计数器和狗叫模块构成,通过寄存器对看门狗进行基本设置,计数器计算狗叫时间,狗叫模块决定看门狗超时后发出的中断或复位方式。其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位。即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。

3.STM32中的看门狗系统
STM32F10xxx内置两个看门狗,一个是独立看门狗(IWDG),一个是窗口看门狗(WWDG),两个看门狗设备都可以用来检测和解决由软件或硬件错误引起的故障,提供了更高的安全性、时间的精确性和使用的灵活性。

3.1 IWDG 的使用方法
3.1.1 IWDG介绍
独立看门狗用通俗一点的话来解释就是一个12位的递减计数器,当计数器的值从某个值一直递减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号。看门狗功能由VDD电压域供电,在停止模式和待机模式下仍能工作。STM32的独立看门狗由内部专门的40Khz的低速时钟LSI驱动,即使主时钟发生故障,它也仍然有效。这里需要注意的是独立看门狗的时钟是一个内部RC时钟,在30~60Khz之间的一个可变化时钟,根据温度和工作场合会有一定的漂移,我们一般取40KHZ。在对看门狗时间要求不是很精确的场合,也就是精度较低的场合,时钟钟有些偏差可以接受。

3.1.2 IWDG 相关寄存器和功能框图
参考STM32英文参考手册(有些东西英文反而更容易理解),首先是键值寄存器IWDG_KR,该寄存器的各位描述如下:
在这里插入图片描述
在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗,此时计数器从其复位值0xFFF递减计数。当计数器数到末尾0x000时,会产生一个复位信号(IWDG_RESET) 。无论何时,只要键值寄存器 IWDG_KR中被写入0xAAAA,IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位 。
另一个寄存器是预分频寄存器IWDG_PR,该寄存器该寄存器用来设置看门狗时钟的分频系数,各位描述如下:
在这里插入图片描述
还有一个重装载寄存器IWDG_RLR,该寄存器用来保存重装载到计数器中的值,其各位描述如下:
在这里插入图片描述
注意:IWDG_PR和 IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555 。将其它值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作 (即写入0xAAAA)也会启动写保护功能。
注:这里还有一个状态寄存器IWDG_SR,无需配置,这里不做介绍。
下图是独立看门狗各个寄存器分布示意图:
在这里插入图片描述

3.1.3 IWDG 配置方法
对以上三个寄存器进行相应的配置,就可以启动STM32的独立看门狗(独立看门狗相关的库函数和定义分布在文件stm32f10x_iwdg.h和stm32f10x_iwdg.c中),具体步骤如下:

  1. 取消寄存器的写保护(向IWDG_KR写入0X5555)
    通过这步,我们取消IWDG_PR和 IWDG_RLR的写保护,使后面可以操作这两个寄存器,设置IWDG_PR和 IWDG_RLR的值。实现函数是:
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) //使能对寄存器IWDG_PR和IWDG_RLR的写操作
  2. 设置独立看门狗的与分频系数和重装载值
    设置看门狗的分频系数的函数是:
    void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) //设置IWDG预分频值
    设置看门狗重装载值的函数是:
    void IWDG_SetReload(uint16_t Reload) // 设置IWDG的重装载值
    设置好看门狗的分频系数 prer和重装载值就可以知道看门狗的喂时间Tout(也就是看门狗溢出时间),该时间的计算方式为:
    Tout=( ( 4 * 2 ^ prer ) * rlr ) / 40
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值