大家好,又见面了,我是你们的朋友全栈君。
看门狗的作用:防止单片机因未知原因死机或比我们预期的时间过长长时间不能响应,如果出现这种问题,看门狗就会把单片机复位
独立看门狗(IWDG):
时钟来源:内部低速时钟(LSI),所以用看门狗时不需要配置时钟
一般配置过程:
寄存器:
IWDG_KR:
32位寄存器,低16位有效,只写
写入 0xAAAA,喂狗
0x5555,取消IWDG_PR、IWDG_RLR的写保护
0xCCCC,启动看门狗
IWDG_PR:
32位寄存器,低3位有效
配置分频系数,4*2^prer
IWDG_RLR:
32位寄存器,低12位有效,每次对IWDG_KR写入0xAAAA,这个值会装载到看门狗计数器中(向下记数,记到0复位)
IWDG_SR:
32位寄存器,低2位有效
位0:PVU:看门狗预分频值更新状态位,1:指示预分频正在更新,预分频器值只有在 PVU 位为 0 时才可更新。
位1:RVU:看门狗重装载值更新状态位,1:指示重装载值正在更新,重载值只有在 RVU 位为 0 时才可更新。
代码:
代码语言:javascript复制void iwdg_init()
{
//IWDG_PR和IWDG_RLR有写保护,对其进行预分频和重装载值配置要先取消写保护
IWDG->KR=0X5555;
//配置预分频值
//预分频值 = 4*2^prer
IWDG->PR=0X04; //64分频
//配置重装载值
//12位
IWDG->RLR=500;
//喂狗
IWDG->KR=0XAAAA;
//启动看门狗
IWDG->KR=0XCCCC;
}
窗口看门狗(WWDG):
时钟来源:APB1时钟,使用时应先使能时钟,这一点与独立看门狗不一样
会先分频4096倍,再分2^WDGTB,所以WWDG超时公式如下: Tout=(4096 * 2^WDGTB * (窗口值低6位 1))/Fpclk1
窗口看门狗喂狗时间有上下限,上限就是上窗口值(寄存器可以进行配置,不固定),下窗口值(固定,0X3F),喂狗必须在上窗口与下窗口之间,大于上窗口喂狗或递减 寄存器到0X3F都将复位。WWDG还有一个中断(提前唤醒中断),作用是当递减寄存器到0X40时会进入中断
一般配置过程:
寄存器:
WWDG_CR:
32位,只用到低8位
位7:WDGA 激活位
位6:0 :这些位用来存储看门狗计数器的值。它每隔 (4096 x 2^WDGTB) PCLK1 个周期递减一次。当它 从 0x40 滚动到 0x3F(T6 清零)时会产生复位。
WWDG_CFR:
只用到低10位
位9: EWI(Early Wakeup Interrupt),提前唤醒中断,置1后计数器达到0x40会产生中断。
位8:7 :WDGTB(TIME Base ),用来分频
位6:0 :窗口置,要大于0x3f
WWDG_SR:
位0:EWIF(Early Weakeup Interrupt Flag),在中断服务程序中要置0
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132032.html原文链接:https://javaforall.cn