目录
一、什么是独立看门狗
1、什么是看门狗
2、看门狗的原理
3、看门狗的作用
4、看门狗的分类
二、如何配置独立看门狗
1、独立看门狗框图
2、独立看门狗的相关寄存器
2.1 关键字寄存器
2.2 分频寄存器
2.3 重载值寄存器
2.4 状态寄存器
3、程序设计
4、独立看门狗的应用
三、具体使用看门狗
一、什么是独立看门狗
1、什么是看门狗
看门狗,又叫watchdog timer,从本质上来说就是一个12bit的递减计数器。看门狗定时器是单片机的一个组成部分,在单片机程序的调试和运行中都有着重要的意义。看门狗电路一般会有一个输入和一个输出,其中的输入叫做喂狗,输出一般连接到另外一个部分的复位端。
2、看门狗的原理
看门狗的一个输出到MCU的RST端(复位电路),MCU正常工作的时候,每隔一端时间输入一个信号到喂狗端,给WDT(Watch Dog Timer,看门狗定时器)清零;如果超过规定的时间(事先给看门狗一个约定的时间,即计数上限值)不喂狗(一般在程序跑飞时),WDT定时超时,就会给出一个复位信号到MCU,使MCU复位,从而防止MCU死机。
3、看门狗的作用
程序运行的保障措施。在程序中定期喂狗,在程序卡死的情况下,自动帮我们复位,看门狗就是一个自动复位电路,防止程序长时间卡死。其本质就是一个定时器,定时器溢出,产生复位信号。
4、看门狗的分类
独立看门狗和窗口看门狗
二、如何配置独立看门狗
1、独立看门狗框图
独立看门狗的工作流程:
1.内部低速时钟LSI通过预分频后得到了分频后的时钟信号(橙色箭头);
2.该时钟信号驱动递减计数器,每来一个时钟,自减一个数,当自减到0后产生IWDG复位(绿色箭头);
3.正常运行时,为了避免复位,可提前在重装寄存器写一个值,IWDG_RLR与定时器的ARR是一样的,当预先写好值之后,在运行过程中,在关键字寄存器里,写入一个特定的关键字,控制电路进行喂狗,这时重装值就会加载到递减计数器中,重新自减运行了(红色箭头)。
2、独立看门狗的相关寄存器
2.1 关键字寄存器
0xAAAA 每次喂狗的写入值(更新重装载)--------狗粮
0x5555 解除寄存器的写保护
0xCCCC 启动计数器
0x5555以外的数值 激活寄存器的写保护
注意:独立看门狗一旦启动就不能关闭
2.2 分频寄存器
就是对内部低速时钟(LSI 32K)进行分频的
32000/s 32分频 1000/s
2.3 重载值寄存器
2.4 状态寄存器
3、程序设计
独立看门狗初始化配置函数
{
/*时钟源配置*/
RCC控制和状态寄存器:
//使能内低速振荡器 0位
//等待内部低速振荡器就绪 1位
/*解除写保护*/
//等待PVU清零
//设置分频
//等待RVU清零
//设置重载
//第一次喂狗,目的是将重载值加载到计数器内
/*使能看门狗(也算激活写保护)*/
}
4、独立看门狗的应用
场景:工业自动化控制器
要求: 在一个工业自动化控制器中,需要确保周期性任务能够按时完成。在这个场景中,如果周期性任务在规定的时间内没有完成,可能会导致系统的不稳定。
实现: 你可以使用独立看门狗,设置一个固定的超时时间。系统在每个周期内开始计数,如果在超时时间内没有完成,独立看门狗就会触发复位。这确保了系统不会因为周期性任务的失败而进入不稳定状态。
三、具体使用看门狗
独立看门狗初始化函数:
/*
函数名: iwdg_init
函数功能:独立看门狗初始化
返回值:void
形参:u16 ms
函数说明:*/
void iwdg_init(u16 ms)
{/*时钟源配置*///RCC控制和状态寄存器:RCC->CSR |= (1 << 0);//使能内低速振荡器 0位while(!(RCC->CSR & (1 << 1)));//等待内部低速振荡器就绪 1位/*解除写保护*/IWDG->KR = 0x5555;while(IWDG->SR & (1 << 0));/*设置分频*/IWDG->PR |= (3 << 0);while(IWDG->SR & (1 << 1));/*设置重载*/IWDG->RLR = 1 * ms - 1;IWDG->KR = 0xAAAA;//喂狗/*使能看门狗(相当于激活写保护)*/IWDG->KR = 0xCCCC;}
主程序:
int main(void)
{NVIC_SetPriorityGrouping(5); //设置优先级分组Usart1_init(115200);//串口初始化Key_init();LED_init();Beep_init();iwdg_init(1000);timer7_Interrupt_ms_init(1);printf("重启\r\n");while(1){LED_flash(1);if(Tim7_cnt[9] >= 900){IWDG->KR = 0xAAAA;//喂狗Tim7_cnt[9] = 0;}}}
总结:在预设的时间内,正常喂狗一切正常运行;在预设时间外,则会触发复位。