大家好,又见面了,我是你们的朋友全栈君。
共四个寄存器:IWDG_KR*(Key Register)/ PR(Prescaler Register)* /RLR*(ReLoad Register)/SR(State Register)*
只有在KR写入0x5555取消写保护后才可以设置 PR[2:0] (预分频系数) ,RLR[11:0] (低十二位即重装载值)。
PR[2:0] 的预分频系数配置如下:
IWDG_SR:该位由硬件控制。
窗口下限超时时间计算: T w w d g = T [ 5 : 0 ] + 1 F p c l k 1 4096 ∗ 2 分 频 系 数 = 4096 ∗ 2 分 频 系 数 ∗ T [ 5 : 0 ] + 1 F p c l k 1 ( 通 常 是 36 M H z ) = ( = 4096 ∗ 2 分 频 系 数 ∗ 0 x 40 F p c l k 1 ( 通 常 是 36 M H z ) ) Twwdg = \cfrac{T[5:0]+1}{\cfrac{Fpclk1}{4096* 2^{分频系数} }} =\frac{ {4096* 2^{分频系数} }*{T[5:0]+1}}{Fpclk1(通常是36MHz)}=(=\frac{ {4096* 2^{分频系数} }*{0x40}}{Fpclk1(通常是36MHz)}) Twwdg=4096∗2分频系数Fpclk1T[5:0]+1=Fpclk1(通常是36MHz)4096∗2分频系数∗T[5:0]+1=(=Fpclk1(通常是36MHz)4096∗2分频系数∗0x40)
详细解释见以下代码注释:
void WWDG_Init(……)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
// WWDG时钟使能,APB2总线下
WWDG_SetPrescaler(fprer);//设置IWDG预分频值
WWDG_SetWindowValue(u8 );//设置窗口上限值
WWDG_Enable(WWDG_CNT);
//使能看门狗,注意有参数,同时设置 counter ,从哪儿开始递减.
WWDG_ClearFlag();//清除提前唤醒中断标志位 ,使能中断前常见步骤
WWDG_NVIC_Init();//初始化窗口看门狗 NVIC(自己写的函数)
WWDG_EnableIT(); //开启窗口看门狗中断
}
喂狗函数:
WWDG_Enable(WWDG_CNT);
//与使能看门狗一致,即设置 counter的值从哪儿开始递减(刷新).
//上图的WWDG_Set_Counter(u8 cnt)喂狗实际上封装了这个函数而已
唤醒中断服务函数:
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT);
//当禁掉此句后,窗口看门狗将产生复位
//不可以间隔太久才久才喂狗,必须在一个时间周期内,即0x40变为0x39之前。
WWDG_ClearFlag(); //清除提前唤醒中断标志位
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139904.html原文链接:https://javaforall.cn