1.前言
上一篇文章介绍了通用定时器产生PWM,这篇文章我们来介绍一下STM32单片机中的独立看门狗。同样地,我们所使用的硬件设备仍然是STM32RCT6单片机等基础设备,关于单片机的原理图以及LED灯的引脚在前文均已详细介绍,这里我们就不再赘述。
2.看门狗详解
看门狗是什么
单片机STM32的看门狗(Watchdog)是一种硬件定时器,用于监控系统的运行状态并在出现故障或死锁时采取措施以恢复正常操作。看门狗的主要功能是定期检查系统是否正常运行,并在系统出现问题时触发复位操作。
STM32系列单片机通常配备了内置的看门狗定时器(通常称为独立看门狗,IWDG)和窗口看门狗定时器(WWDG),以提供更可靠的系统保护。
看门狗主要分为:1.独立看门狗;2.窗口看门狗
独立看门狗
独立工作,对时间精度要求较低,这里独立工作指的是独立看门狗的时钟是专用的LSI(内部低速时钟),即使主时钟出现问题,看门狗也能正常工作。
框图
独立看门狗的框图如下:
工作原理:在键寄存器中写入0xCCC,开启独立看门狗,此时计数器开始从复位值0xFFF递减计数。当计数到0时产生一个复位信号。无论何时向键寄存器中写入0xAAAA(喂狗),重载寄存器中的值就会被重新加载到计数器,从而避免看门狗复位。
值得注意的是看门狗功能处于VDD供电区,即在停机和待机模式时仍能正常工作。
超时时间
超时时间:T_IWDG = T_LSI × PR × (RL + 1);
其中: T_LSI=1/F_LSI,PR是预分频系数;
RL+1是重装值 对应的预分频系数PR,如PR=0为4分频,PR=1为8分频,以此类推。
下表为看门狗超时时间 (40kHz的输入时钟(LSI))
IWDG寄存器
键寄存器(IWDG_KR)
预分频寄存器(IWDG_PR)
预分频的算法公式是:PSC = 4 * 2 PRER; 其中PRER就是IWDG_PR的值。
状态寄存器(IWDG_SR)
3.软件设计
看门狗初始化
看门狗初始化主要用到初始化配置函数:
IWDG_Config();
该函数包含以下内容:
void IWDG_Config(uint8_t prv ,uint16_t rlv)
{
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
IWDG_SetPrescaler( prv );
IWDG_SetReload( rlv );
IWDG_ReloadCounter();
IWDG_Enable();
}
首先使能预分频寄存器PR和重装载寄存器RLR,然后设置预分频器值和设置重装载寄存器值,并把重装载寄存器的值放到计数器中,最后使能看门狗。
main函数中进行了灯反复闪烁的操作
灯的闪烁
LED1_ON;
Delay(100);
LED1_OFF;
Delay(100);
LED1_ON;
Delay(100);
LED1_OFF;
Delay(100);
LED1_ON;
Delay(100);
LED1_OFF;
Delay(100);
LED1_ON;
while(1)中对按键按下进行判断,如果按下就喂狗,此时系统就复位。
while(1)
{
LED1_OFF;
if( KEY1_StateRead() == KEY_DOWN)
{
IWDG_Feed();
}
}
这里使用了喂狗函数
IWDG_Feed();
喂狗函数
void IWDG_Feed(void)
{
IWDG_ReloadCounter();
}
这里把重装载寄存器的值放到计数器中,喂狗从而防止IWDG复位,当计数器的值减到0的时候系统就会产生复位。
4.完整代码
main.c
#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"
#include "bsp/key/bsp_key.h"
#include "bsp/wdg/bsp_iwdg.h"
int main(void)
{
LED_GPIO_Init();
KEY_GPIO_Init();
Delay(1000);
IWDG_Config(IWDG_Prescaler_64 ,625);
LED1_ON;
Delay(100);
LED1_OFF;
Delay(100);
LED1_ON;
Delay(100);
LED1_OFF;
Delay(100);
LED1_ON;
Delay(100);
LED1_OFF;
Delay(100);
LED1_ON;
while(1)
{
LED1_OFF;
if( KEY1_StateRead() == KEY_DOWN)
{
IWDG_Feed();
}
}
}
static void Delay(uint32_t time)
{
uint32_t i,j;
for(i=0;i<time;++i)
{
for(j=0;j<10000;++j)
{
//¿ÕÑ»·£¬Ê²Ã´¶¼²»×ö
}
}
}
iwdg.c
#include "bsp/wdg/bsp_iwdg.h"
void IWDG_Config(uint8_t prv ,uint16_t rlv)
{
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
IWDG_SetPrescaler( prv );
IWDG_SetReload( rlv );
IWDG_ReloadCounter();
IWDG_Enable();
}
void IWDG_Feed(void)
{
IWDG_ReloadCounter();
}
5.实验效果
看门狗
6.结束语
本次实验讲解了使用Stm32的独立看门狗,这也是STM32单片机比较基础的一部分内容,希望以上内容对各位朋友有所帮助。
最后,欢迎大家在评论区留言批评指正。谢谢!