关于窗口看门狗基础知识方面的文章:
嵌入式stm32 复习(工作用)— 窗口看门狗知识 2020.4.30
添加链接描述
先上完整窗口看门狗部分代码!!!
#include "wwdg.h"
u8 WWDG_T = 0;
void WWDG_Init(u8 tr, u8 wr, u8 psc) {
WWDG_T = tr & 0x7F;
RCC->APB1ENR |= 1 << 11;
WWDG->CFR |= psc << 7;
WWDG->CFR |= 1 << 9;
WWDG->CFR |= wr & 0x7F;
NVIC_SetPriorityGrouping(5);
NVIC_EnableIRQ(WWDG_IRQn);
NVIC_SetPriority(WWDG_IRQn, 10);
WWDG->CR |= WWDG_T;
WWDG->CR |= 1 << 7;
}
void WWDG_IRQHandler(void) {
WWDG->CR |= WWDG_T;
WWDG->SR = 0;
}
好!按照老样子,接下来开始详细讲解每行代码的用处,以及为什么这样写!
窗口看门狗初始化部分
WWDG_T = tr & 0x7F;
////由上图可知,该寄存器的[6:0]位位计数器,用户来存放看门狗的计数器值,也就相当于我们在上一篇关于讲解窗口看门狗的文章中提到的MAX。
RCC->APB1ENR |= 1 << 11;
//由上一篇文章中得知,窗口看门狗是位于APB1总线下的,所以我们需要开启APB1时钟。
//所以1需要左移11位,并且进行或运算。
WWDG->CFR |= psc << 7;
////并且将psc定义为u8类型。
WWDG->CFR |= 1 << 9;
//唤醒中断。
WWDG->CFR |= wr & 0x7F;
//这里wr是作为比较值,是与当前计数值进行比较,如果小于该比较值,则进行喂狗是有效的,反之无效。
NVIC_SetPriorityGrouping(5);
NVIC_EnableIRQ(WWDG_IRQn);
NVIC_SetPriority(WWDG_IRQn, 10);
//因为该计数值如果小于0x40,也就是下一次计数值为0x3F,那么此时就产生一次中断,如果能够在这个中断里面进行喂狗的话,那么程序还是会正常运行的,但是不能进行喂狗的话,那么会进行复位操作。
//具体怎样设置NVIC中断嵌套向量控制器,可以参考之前讲解NVIC的文章,这里就不再赘述了。
WWDG->CR |= WWDG_T;
//设置计数器。
WWDG->CR |= 1 << 7;
//使能WWDG
窗口看门狗中断服务函数部分
WWDG->CR |= WWDG_T;
//进行喂狗操作。
WWDG->SR = 0;
////由上图可知,我们需要进行软件清零,
结束语
个人认为大家如果细心看完这篇文章,并且结合上一篇文章一起看(在文章的刚开始会将前几篇关于窗口看门狗部分的文章链接发出来),我相信大家会彻底掌握窗口看门狗了!!!如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!
以后我会继续推出关于嵌入式(stm32)的协议方面的讲解,下一讲会推出FSMC部分的文章!敬请期待!!!
**我先休息去了~~╭(╯^╰)╮