14.1 STM32看门狗简介
在单片机构成的微型计算机系统中,单片机的工作可能会受到外界的电磁干扰或者程序运行的BUG导致程序指针错误,或者其他错误导致的死循环,引发整个系统陷入停滞状态,所以需要一个与系统独立的定时器来监控单片机的运行状态,这个定时器在系统正常运转的时候,不停的刷新定时器的计数器,例如隔一段时间给这个定时器的计数器写100,然后在定时器减运算到0之前再一次写入100,这样,就保证了定时器不计数到0,也就意味着通过判断这个定时器是否计数到0来判断系统是否陷入死机状态,实现这种功能的定时器就称为看门狗,不停的刷新计数器值的行为就称为“喂狗”,一般计数器计数到0后会直接对单片机进行复位,用于避免系统陷入死循环。
STM32内部有两种看门狗模块,一种是窗口看门狗WWDG,另一种是独立看门狗IWDG,STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。
独立看门狗的时钟是一个内部RC时钟,所以并不是准确的40Khz,而是在30~60Khz之间的一个可变化的时钟,只是我们在估算的时候,以40Khz的频率来计算。
窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。
在递减计数器达到窗口配置寄存器数值之前,如果7位的递减计数器数值在控制寄存器中被刷新,那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。
14.2 独立看门狗相关寄存器
14.2.1 键值寄存器IWDG_KR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
KEY[15:0] |
该寄存器属于只写寄存器,读取的值为0x0000,软件必须以一定间隔写入0xAAAA,否则,当计数器为0时,看门狗会产生复位;
写入0x5555表示允许访问IWDG_PR和IWDG_RLR寄存器;
写入0xCCCC表示启动看门狗工作,如果选择了硬件看门狗则不受此命令字限制。
14.2.2 预分频寄存器IWDG_PR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | PR[2:0] |
Bit 2~Bit 0:预分频因子
000:预分频因子=4
001:预分频因子=8
010:预分频因子=16
011:预分频因子=32
100:预分频因子=64
101:预分频因子=128
110:预分频因子=256
111:预分频因子=256
14.2.3 重装载寄存器IWDG_RLR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | RLR[11:0] |
Bit 11~Bit 0:看门狗计数器重装载值:每当向IWDG_KR寄存器写入0xAAAA时,重装载值会被传送到计数器中,随后计数器从这个值开始递减计数。
14.3 窗口看门狗相关寄存器
14.3.1 控制寄存器WWDG_CR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | WDGA | T6 | T5 | T4 | T3 | T2 | T1 | T0 |
Bit 7:激活位:,此位由软件置1,但仅能由硬件在复位后清0。当WDGA=1时,看门狗可以产生复位
0:禁止看门狗
1:启用看门狗
Bit 6~Bit 0:7位计数器,存储看门狗的计数器值。每(4096x2 ^WDGTB^ )个PCLK1周期减1。当T6变成0产生看门狗复位
14.3.2 配置寄存器WWDG_CFR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | EWI | TB1 | TB0 | W6 | W5 | W4 | W3 | W2 | W1 | W0 |
Bit 9:提前唤醒中断,此位若置1,则当计数器值达到40h,即产生中断,此中断只能由硬件在复位后清除
Bit 8:预分频器时基
00:CK计时器时钟不分频
01:CK计时器时钟2分频
10:CK计时器时钟4分频
11:CK计时器时钟8分频
Bit6~Bit 5:7位窗口值,用来与递减计数器进行比较用的窗口值
14.3.3 状态寄存器WWDG_SR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | EWIF |
Bit 0:提前唤醒中断标志,当计数器值达到40h时,此位由硬件置1。它必须通过软件写0来清除。若中断未被使能,此位也会被置1
14.4 实验例程
14.4.1 独立看门狗实验
功能:如果看门狗没有复位,接在PB5上的LED常亮,如果PA0的按键按下,就喂狗,只要按键不停的按,看门狗就一直不会产生复位,保持DS0的常亮,一旦超过看门狗定溢出时间,那么将导致程序重启,这将导致DS0熄灭一次。
(1)创建wdg.h文件输入以下代码。
#ifndef _WDG_H_
#define _WDG_H_
#include 'sys.h'
/*********************************************************************************************************
函 数 列 表
*********************************************************************************************************/
void IWDG_Init( u8 prer, u16 rlr ) ; //独立看门狗初始化
#endif
(2)创建wdg.c文件输入以下代码。
#include 'wdg.h'
/***************************************************
Name :IWDG_Init
Function :独立看门狗初始化
Paramater :
prer:分频数:0~7
rlr:重装载寄存器值
Return :None
***************************************************/
void IWDG_Init( u8 prer, u16 rlr )
{
IWDG->KR = 0x5555 ; //使能对IWDG->PR和IWDG->RLR的写
IWDG->PR = prer ; //设置分频系数
IWDG->RLR = rlr ; //从加载寄存器 IWDG->RLR
IWDG->KR = 0xAAAA ; //更新计数器
IWDG->KR = 0xCCCC ; //使能看门狗
}
(3)在1.c文件中输入以下代码。
#include 'sys.h'
#include 'delay.h'
#include 'usart1.h'
#include 'wdg.h'
/***************************************************
Name :LED_Init
Function :LED初始化
Parameter :None
Return :None
***************************************************/
#define LED PBout( 5 ) //定义LED端口
void LED_Init()
{
RCC->APB2ENR |= 1<<3 ;
GPIOB->CRL &= 0xFF0FFFFF ;
GPIOB->CRL |= 0x00300000 ;
LED = 1 ;
}
/***************************************************
Name :KEY_Init
Function :KEY初始化
Parameter :None
Return :None
***************************************************/
#define KEY PAin( 0 ) //定义按键端口
void KEY_Init()
{
RCC->APB2ENR |= 1<<2 ;
GPIOA->CRL &= 0xFFFFFFF0 ;
GPIOA->CRL |= 0x00000008;
}
/***************************************************
Name :main
Function :主函数
Parameter :None
Return :None
***************************************************/
int main()
{
STM32_Clock_Init( 9 ) ; //STM32时钟初始化
SysTick_Init( 72 ) ; //SysTick初始化
USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200
LED_Init() ; //LED初始化
KEY_Init() ; //按键初始化
delay_ms( 500 ) ; //延时500ms,让人可以看到DS0灭的状态
IWDG_Init( 4, 625 ) ; //与分频数为64,重载值为625,溢出时间为1s
LED = 0 ; //点亮DS0
while( 1 )
{
if( KEY==1 )
{
delay_ms( 10 ) ;
if( KEY==1 )
{
IWDG->KR = 0xAAAA ; //喂狗
}
}
delay_ms( 20 ) ;
}
}
上一篇:STM32入门学习笔记之EEPROM存储实验2
下一篇:STM32入门学习笔记之RTC实验(下)
推荐阅读最新更新时间:2024-11-16 16:16
设计资源 培训 开发板 精华推荐
- WISE-DK1520-TB00E,使用 WISE-1520 低功耗 802.11 无线局域网的开发套件
- ADR445BR 2.048 Vout 超低噪声、LDO XFET 电压基准的典型应用,具有电流吸收器和电流源
- R_110_V10基于IPS2电机换向传感器的设计
- 160W、35V 交流转直流单路输出电源
- EV-ADF4159EB1Z,用于评估 ADF4159 锁相环频率合成器的评估板
- 使用 RECOM Power GmbH 的 RSO-483.3DZ 的参考设计
- esp32核心板,实物已验证
- LTC6990CS6#TRMPBF 全范围 VCO 振荡器的典型应用,具有任何 NDIV 设置(fMAX 至 fMIN,VIN = 0V 至 VSET)
- MIC4682 的典型应用:精密限流 SO-8 超级开关降压稳压器
- 使用 Analog Devices 的 LT1506IR-SYNC 的参考设计
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况
- 看是德科技汽车电子精彩专题,为你的出行安全打call, 下载赢好礼!
- 有奖直播报名:大联大世平集团&恩智浦 | AI 无所不在,单板电脑也可以
- 有奖活动|下载资料、预约视频 泰克 HDMI 2.1 测试方案
- 学C2000精品课程,低价抢购 C2000 LaunchPad!
- LPC4370重磅来袭 有奖问答赢好礼!
- #Micropython大作战#第一弹:动起来,大家一起来DIY
- 极简主义,足不出户,看东芝在线展会,安心答题送好礼!
- 希望一月 爱上EEWORLD——论坛推广月(恩智浦全程赞助)
- 【TI.com线上采购专场——智能楼宇篇】畅聊火爆的智能电子锁、可视化门铃、智能传感器和网络摄像头方案