1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > STM32学习笔记:独立看门狗和窗口看门狗

STM32学习笔记:独立看门狗和窗口看门狗

时间:2023-03-29 02:02:00

相关推荐

STM32学习笔记:独立看门狗和窗口看门狗

STM32的独立看门狗是由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,但它仍然有效。

看门狗原理:单片机系统在外界干扰情况下会出现程序跑飞的现象会导致出现死循环,看门狗电路在一定时间内如果没用接收到喂狗信号,则会自动复位重启。

在键值寄存器(IWDG_KR)写入0XCCCC开启独立看门狗,此时计时器开始从复位值0XFFF依次递减到0X000,此时会产生一个复位信号(IWDG_RESET),当键值寄存器IWDG_KR被写入0XAAAA的时候,IWDG_RLR的值的重新加载到计数器从而避免看门狗的复位。

Tout = (4*2^(prer) * rlr)/40

Tout的单位是(ms),prer是看门狗时钟的预分频值(IWDG_PR值)范围0-7,rlr是看门狗重装载值(IWDG_RLR的值)

IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改这两个寄存器的数值,必须先想IWDG_KR写入0X5555,将其他值写入这个寄存器则会打乱操作顺序,寄存器将会被重新保护,重装载操作(即写入0XAAAA)也会被重新保护起来。

注意:独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是 在 30~60Khz 之间的一个可变化的时钟,所以喂狗的时间不要太迟,以防出现问题。

窗口看门狗

窗口看门狗不同于独立看门狗,它借助的是plck1的时钟,所以在使用前需要使能时钟,窗口看门狗区别于独立看门狗的不同在于,独立看门狗的喂狗时间是个0-x,但是窗口看门狗会更加的灵活,它采用了上下窗口的方式,下窗口是个固定值0X40,当计数器的数值从0X40(64)变为0X3f(63),便会产生中断,而上窗口的数值是由自己决定,但是必须在0X7F(因为使用寄存器WWDG_CR的低七位来存储计数器的数值)和0x40之间。

喂狗时间必须在上下窗口之间进行,否则则会复位。

当产生中断的时候,必须在不大于一个看门狗计数周期内重新写入计数值,否则将复位!!!

WDGTB的预分频系数【0,1,2,3】,借助公式的计算可以算出计数值减少1的最短周期,当T[5:0]全为1的时候,则会由最大超过周期用最小值*64。

void WWDG_Init(u8 tr,u8 wr,u8 fprer) { RCC->APB1ENR|=1<<11; //使能wwdg时钟 使用的是plck1时钟WWDG_CNT=tr&WWDG_CNT; //初始化WWDG_CNT.WWDG->CFR|=fprer<<7; //PCLK1/4096再除2^fprer 得到CFR对应的分频数WWDG->CFR&=0XFF80;//后七位为0WWDG->CFR|=wr;//设定窗口值WWDG->CR|=WWDG_CNT; //设定计数器值 WWDG->CR|=1<<7; //开启看门狗MY_NVIC_Init(2,3,WWDG_IRQn,2);//抢占2,子优先级3,组2WWDG->SR=0X00; //清除提前唤醒中断标志位 (若没有进入中断函数,也需要清除,防止进入中断)WWDG->CFR|=1<<9; //使能提前唤醒中断 } //重设置WWDG计数器的值 void WWDG_Set_Counter(u8 cnt) { WWDG->CR =(cnt&0x7F);//重设置7位计数器 } //窗口看门狗中断服务程序 void WWDG_IRQHandler(void) {WWDG_Set_Counter(WWDG_CNT);//重设窗口看门狗的值! WWDG->SR=0X00;//清除提前唤醒中断标志位 LED1=!LED1; }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。