STM32学习笔记---独立看门狗

目录

一、什么是独立看门狗

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;
		}
	}
	
}

总结:在预设的时间内,正常喂狗一切正常运行;在预设时间外,则会触发复位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值