STM32F103学习笔记(六) 独立看门狗and窗口看门狗
扫描二维码
随时随地手机看文章
首先,学习两种狗,就该看到它们两者之间的不同:
(1)独立看门狗由内部专门的 40Khz 低速时钟驱动,而窗口狗使用的是 PCLK1 的时钟,需要先使能时钟,而独立狗不需要使能。
(2)两者的作用不同:1.独立狗 避免单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,独立看门狗的作用就是在一定时间内(通过定时计数器实现) 没有接收喂狗信号
(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。2.窗口狗 窗口看门狗( WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
(3)独立狗不用中断,窗口狗要用中断
(4)独立狗需要外部的手动控制(eg按键触发),窗口狗自动控制。
(5)独立狗的寄存15:0有效,是12位递减的;窗口狗的寄存器低八位有效,是6位递减的。
独立狗 wdg.c 其中有两个函数:独立狗初始化函数和喂狗函数。
#include"wdg.h"
//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/40(ms).
voidIWDG_Init(u8prer,u16rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//①使能对寄存器I写操作
IWDG_SetPrescaler(prer);//②设置IWDG预分频值:设置IWDG预分频值
IWDG_SetReload(rlr);//②设置IWDG重装载值
IWDG_ReloadCounter();//③按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG_Enable();//④使能IWDG
}
//喂独立看门狗
voidIWDG_Feed(void)
{
IWDG_ReloadCounter();//reload
}
窗口狗 wdg.c 有四个函数,分别是初始化窗口狗;设置wwdg计时器并使能;中断初始化;中断服务函数。
//保存WWDG计数器的设置值,默认为最大.
u8WWDG_CNT=0x7f;
//初始化窗口看门狗
//tr:T[6:0],计数器值
//wr:W[6:0],窗口值
//fprer:分频系数(WDGTB),仅最低2位有效
//Fwwdg=PCLK1/(4096*2^fprer).
voidWWDG_Init(u8tr,u8wr,u32fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//WWDG时钟使能
WWDG_CNT=tr&WWDG_CNT;//初始化WWDG_CNT.
WWDG_SetPrescaler(fprer);//设置IWDG预分频值
WWDG_SetWindowValue(wr);//设置窗口值
WWDG_Enable(WWDG_CNT);//使能看门狗,设置counter
WWDG_ClearFlag();//清除提前唤醒中断标志位
WWDG_NVIC_Init();//初始化窗口看门狗NVIC
WWDG_EnableIT();//开启窗口看门狗中断
}
//重设置WWDG计数器的值
voidWWDG_Set_Counter(u8cnt)
{
WWDG_Enable(cnt);//使能看门狗,设置counter.
}
//窗口看门狗中断服务程序
voidWWDG_NVIC_Init()
{
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;//WWDG中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占2子优先级3组2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//抢占2,子优先级3,组2
NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}
voidWWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT);//当禁掉此句后,窗口看门狗将产生复位
191
WWDG_ClearFlag();//清除提前唤醒中断标志位
LED1=!LED1;//LED状态翻转
}
其实两个.c都记不住,先暂时记住怎么往里调用参数吧。