目录
1.判断是由RCC上电或者复位键导致的复位 还是有看门狗导致的复位
WWDG(窗口看门狗)
1.判断是由RCC上电或者复位键导致的复位 还是有看门狗导致的复位;
RCC_GetFlagStatus();(查看标志位)
RCC_ClearFlag();(清除标志位)
2.RCC开启时钟(APB1);
(rcc.h文件)
RCC_AHBPeriphClockCmd(); AHB对应的外设
RCC_APB1PeriphClockCmd(); APB1对应的外设
RCC_APB2PeriphClockCmd(); APB2对应的外设
3.设置预分频和窗口值;
WWDG_SetPrescaler();(写预分频器)
WWDG_SetWindowValue();(设置窗口值)
超时时间:
T(wwdg) = T(pclk1) × 4096 × WDGTB预分频系数 × (T[5:0] + 1)
窗口时间:
T(win) = T(pclk1) × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])
其中:T(pclk1) = 1 / (pclk1) (1/36M(36000))
4.启动窗口看门狗;
WWDG_Enable();(启动窗口看门狗)
5.主循环中不断执行喂狗;
WWDG_SetCounter();
代码示例
窗口看门狗
主函数
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
int main(void)
{
/*模块初始化*/
OLED_Init(); //OLED初始化
Key_Init(); //按键初始化
/*显示静态字符串*/
OLED_ShowString(1, 1, "WWDG TEST");
/*判断复位信号来源*/
if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET) //如果是窗口看门狗复位
{
OLED_ShowString(2, 1, "WWDGRST"); //OLED闪烁WWDGRST字符串
Delay_ms(500);
OLED_ShowString(2, 1, " ");
Delay_ms(100);
RCC_ClearFlag(); //清除标志位
}
else //否则,即为其他复位
{
OLED_ShowString(3, 1, "RST"); //OLED闪烁RST字符串
Delay_ms(500);
OLED_ShowString(3, 1, " ");
Delay_ms(100);
}
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); //开启WWDG的时钟
/*WWDG初始化*/
WWDG_SetPrescaler(WWDG_Prescaler_8); //设置预分频为8
WWDG_SetWindowValue(0x40 | 21); //设置窗口值,窗口时间为30ms
WWDG_Enable(0x40 | 54); //使能并第一次喂狗,超时时间为50ms
while (1)
{
Key_GetNum(); //调用阻塞式的按键扫描函数,模拟主循环卡死
OLED_ShowString(4, 1, "FEED"); //OLED闪烁FEED字符串
Delay_ms(20); //喂狗间隔为20+20=40ms
OLED_ShowString(4, 1, " ");
Delay_ms(20);
WWDG_SetCounter(0x40 | 54); //重装计数器,喂狗
}
}