教你手写窗口看门狗(看完这篇你就会手动写啦,保姆级讲解)---- 2020.4.30

关于窗口看门狗基础知识方面的文章:

嵌入式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部分的文章!敬请期待!!!

**我先休息去了~~╭(╯^╰)╮

原创文章 44 获赞 88 访问量 8899

猜你喜欢

转载自blog.csdn.net/qq_40544107/article/details/105857245