大家好,又见面了,我是你们的朋友全栈君。
Stm32看门狗?
1.概述:
- 独立看门狗:喂狗时间必须在0之前,否则计数器下降到0后,产生复位信号;
- 窗口看门狗:喂狗时间必须在CFR寄存器(我们设置的窗口上限),和0x3F(窗口下限)之间(即在CR寄存器的第7位b6*(T6)*减小到零之前),否则(上限之前,或以达下限)均会产生复位信号。
- 喂狗:即重新设置递减计数器CNT的值,也就是手册时序图中的”更新”(CNT).
- 上窗口比较触发: 当我们喂狗时,比较器会将当前(未写入时的)CNT的值与CFR低7位的值进行比较,查看是否超前喂狗.
2.独立看门狗:
1)原理简介及寄存器:
(1)框图:
(2)相关寄存器:
共四个寄存器:IWDG_KR*(Key Register)/ PR(Prescaler Register)* /RLR*(ReLoad Register)/SR(State Register)*
IWDG_KR:
IWDG_PR;WDG_RLR:
只有在KR写入0x5555取消写保护后才可以设置 PR[2:0] (预分频系数) ,RLR[11:0] (低十二位即重装载值)。
PR[2:0] 的预分频系数配置如下:
IWDG_SR:该位由硬件控制。
2)溢出时间计算:
-
IWDG的时钟来源:LSI*(内部低速时钟)*不精确,可大概认为40kHz
-
溢出时间( 即每次重装载(往KR中写0xAAAA喂狗)到复位的时间):
T i w d g = R L R L S I P R 预 分 频 因 子 = P R 预 分 频 因 子 ∗ R L R L S I Tiwdg = \cfrac{RLR}{\cfrac{LSI}{PR预分频因子}}= \cfrac{PR预分频因子*RLR}{LSI} Tiwdg=PR预分频因子LSIRLR=LSIPR预分频因子∗RLR
3)库函数操作:
3.窗口看门狗:
1)原理简介及寄存器:
(1)框图:
(2)相关寄存器介绍:
-
WWDG_CFR:
- 位9:提前唤醒中断使能;使能后在达到下窗口的最后一个周期前在进入看门狗唤醒中断函数用于提醒喂狗.
- 位8,7:决定预分频系数,但在分频前进入窗口看门狗的时间脉冲均是由APB1的36MHz/4096.
- 低7位[6:0]:用于设定上窗口值**(注意:上窗口值只有7位:最大为 0x7F , 最小必须大于 0x3F (系统设定的下窗口值))**
-
WWDG_CR:
- 位7:看门狗使能位;
- 低7位[6:0]:6位递减计算器CNT,开启看门狗后,对其进行写(刷新)即为喂狗。
-
WWDG_SR:
- 只有0位有效,为WWDG的提前唤醒中断的标志位,需由软件清零。
2)相关时间计算:
窗口下限超时时间计算:
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)
3)库函数操作:
详细解释见以下代码注释:
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(); //清除提前唤醒中断标志位
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139904.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...