目录
WWDG简介
WWDG介绍
Window Watch Dog,窗口看门狗
WWDG是一个能产生 系统复位信号 和 提前唤醒中断 的计数器
WWDG的特性:
递减的计数器
1、当递减计数器的值从0x40减到0x3F时复位(即T6位跳变到0) 0x40=64 0x3f=63
2、计数器的值大于W[6:0]值时喂狗仍会复位 W[6:0]是窗口的上限值
3、当递减计数器等于0x40时可产生提前唤醒中断(EWI)
4、WWDG防止复位要在窗口期内喂狗
WWDG有什么作用
WWDG可用于监测单片机程序运行时效是否精准,主要检测软件异常
WWDG的时钟是来自于系统总线的时钟,与IWDG的LSI内部低速时钟信号相比更精确,适用于需要精确检测程序运行时间的场合
WWDG工作原理
WWDG其实就是可以设定一个窗口值,
这个窗口值范围在计数器初始值和约定的0x3F(=63)之间,0x3F又被称为窗口下限值
计数值在窗口值和窗口下限值之间喂狗才能防止复位,在窗口值之前喂狗就会导致立即复位
计数值减到0x40时可以产生提前唤醒EWI中断,减到0x3F时可产生复位
WWDG框图
WWDG的时钟源来自PCLK,PCLK全称Peripheral Clock,外设时钟,其实就是指APB时钟,CPLK1就是指APB1,其实也就是低速总线时钟,与HCLK:AHB高速总线时钟相区别
42MHz的总线时钟经过固定为4096的分频系数后,再根据用户设定的预分频器值再次分频,之后信号到达6位递减计数器,WWDG被称为激活位,用来使能WWDG工作。
WWDG位是1经过与门后才能与其他信号输出1
关于6位递减计数器的解释:
0x40是0x0100 0000
0x3F是0x0011 1111
当从0x40减到0x3F时,对应的就是T6位跳变到0,信号取反后输入或门
WWDG寄存器
窗口看门狗WWDG一共有3个寄存器,
控制寄存器WWDG_CR
配置寄存器WWDG_CFR
状态寄存器WWDG_SR
控制寄存器WWDG_ CR
WWDG_CR是16位寄存器,低8位有效,包括 1bit 的看门狗使能位WDGA 和T[6:0]这7位计数器
控制寄存器WWDG_CR用于
使能窗口看门狗,
设置重载计数器值
不管是给计数器初始值还是重装载值,直接对WWDG_CR的T[6:0]进行写操作就行
当计数器值从0x40减到0x3F,也就是T6位从1变到0时会产生复位
配置寄存器WWDG_CFR
配置寄存器WWDG_CFR是16位寄存器,低10位有效
WWDG_CFR配置寄存器用于
使能EWI提前唤醒中断
设置预分频系数
设置窗口上限值
位9是 EWI提前唤醒中断使能位。使能后WWDG计数到0x40就会产生EWI提前唤醒中断
位 8 : 7 是分频系数 对应1、2、4、8倍分频
位 [6:0] 是7位窗口值
注意"此中断只有在复位后才由硬件清零"是指EWI中断标志位只有复位后才能硬件清零,否则只能软件清零
状态寄存器WWDG_SR
WWDG_SR是16位寄存器,1个有效位,就是EWI提前唤醒中断的中断标志位
WWDG_SR寄存器用于判断是否发生了WWDG_EWI提前唤醒中断
如果发生了EWI提前唤醒中断,WWDG_SR的EWI中断标志位就会置1,除非复位,否则只能软件清零。不清零就不会产生该中断。
WWDG超时时间计算
WWDG溢出时间 = (4096*预分频系数*计数个数)/时钟源频率
4096*预分频系数/时钟源频率=1/WWDG工作频率 = 一个数的时间
T[5:0]代表一个范围,最大值是0x0011 1111 ,也就是63 ,+1就是64
由于WWDG_CR控制寄存器有7位用于装载计数值,
计数最大值就是0x7F,也就是127
而最小值是0x3F,也就是63
127-63=可用于计数的最大值=64
因此公式中T[5:0]+1其实代表了计数的个数
WWDG配置步骤
WWDG配置步骤介绍
/*******************************WWDG初始化*************************************/
1、工作参数初始化 HAL_WWDG_Init()
/*******************************WWDG中断函数初始化**************************/
2、WWDG Msp初始化 HAL_WWDG_MspInit() 配置NVIC、CLOCK等
3、设置优先级,使能中断 HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
4、编写中断服务函数 WWDG_IRQHandler() --- HAL_WWDG_IRQHandler()
5、重写提前唤醒回调函数 HAL_WWDG_EarlyWakeupCallback()
/********************************喂狗***************************************************/
6、在窗口期内喂狗 HAL_WWDG_Refresh()
相关HAL库函数介绍
HAL_WWDG_Init()
主要操作CR来使能WWDG并预设计数值,操作CFG来寄存器使能EWI中断,预设分频系数和窗口值
HAL_WWDG_Refresh()
主要操作WWDG_CR来重装载计数器
IWDG和WWDG的主要区别
IWDG有
键值寄存器IWDG_KR、
重装载寄存器IWDG_RLR、
预分频寄存器IWDG_PR、
状态寄存器IWDG_SR
键值寄存器写入0x5555来使能重装载寄存器RLR和预分频寄存器PR的写权限,写入时要求状态寄存器SR的相应状态位为0;
键值寄存器KR写入0xcccc来使能IWDG;键值寄存器KR写入0xaaaa来执行喂狗操作
WWDG有
控制寄存器WWDG_CR
配置寄存器WWDG_CFR
状态寄存器WWDG_SR
控制寄存器CR用来使能WWDG并装载计数值
配置寄存器设定预分频系数和窗口值
状态寄存器只有一位有效作为EWI中断的标志位
WWDG可以在计数到0x3F时触发EWI提前唤醒中断,中断回调函数里面可以写喂狗函数
IWDG就得自己找法子看喂狗函数放哪儿了