【STM32开发之寄存器版】(五)-窗口看门狗WWDG

news2024/11/30 14:33:50

一、前言

窗口看门狗简介:

窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

窗口看门狗主要特性:

● 可编程的自由运行递减计数器
● 条件复位
─ 当递减计数器的值小于0x40,(若看门狗被启动)则产生复位。
─ 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。
● 如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可 以被用于重装载计数器以避免WWDG复位。

窗口看门狗适用场景:

WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。

本次DEMO的目标:

在本次DEMO中将使用窗口看门狗的中断功能来喂狗,通过STM32F103ZET6开发板的DS0和DS1来提示程序的运行状态。

二、时钟树解析

窗口看门狗WWDG是AHB-APB1总线下的外设,其时钟来源于APB1下的PCLK1时钟,本次实验中,将外部高速时钟HSE(8MHz)用锁相环PLL倍频9倍至72MHz作为系统时钟SYSCLK,AHB1分频系数为1(不分频,仍为72MHz),APB1分频系数为2(2分频,达到PCLK1最大频率36MHz),最后供给WWDG外设的基础时钟为36MHz。具体流程如下所示:

三、窗口看门狗功能介绍

窗口看门狗的时序图如下所示:

其中:

  • T[6:0]:控制寄存器(WWDG_CR)的低7位。
  • W[6:0]:配置寄存器(WWDG_CFR)的低7位,为窗口看门狗的上窗口。
  • 3Fh:下窗口0X40的边界。

当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。

窗口看门狗的超时公式如下:

其中:

  • Twwdg:WWDG超时时间(单位ms)
  • Fpclk1:APB1的时钟频率(单位KHz)
  • WDGTB:WWDG的预分频系数
  • T[5:0]:窗口看门狗的计数器低6位

根据第二节时钟树解析,设置Fpclk=36MHz,那么可以得到最大-最小超时时间表如下所示:

WDGTB最小超时值最大超时值
0113μs7.28ms
1227μs14.56ms
2455μs29.12ms
3910μs58.25ms

四、寄存器介绍

对WWDG的程序设计主要涉及3个寄存器:

寄存器作用
WWDG_CR控制寄存器
WWDG_CFR配置寄存器
WWDG_SR状态寄存器

下面将对这几个寄存器进行一一介绍。

4.1 WWDG_CR控制寄存器

《STM32中文参考手册》对WWDG_CR寄存器的描述如下:

  • WWDG_CR控制寄存器只有低8位有效。其中T[6:0]存储的是看门狗的计数器值,当计数器值从40h变为3FH时(T6变为0),产生看门狗复位。
  • WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该位一旦设置,就只能在硬件复位后才能清零了。

4.2 WWDG_CFR配置寄存器

《STM32中文参考手册》对WWDG_CFR寄存器的描述如下:

该位中的 EWI 是提前唤醒中断,也就是在快要产生复位的前一段时间(T[6:0]=0X40)来提醒我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗 的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。注意这里在进入中断后,必须在不大于 1 个窗口看门狗计数周期的时间(在 PCLK1 频率为 36M 且 WDGTB 为 0 的条件下,该时间为 113us)内重新写 WWDG_CR,否则,看门狗将产生复位!

4.3 WWDG_SR状态寄存器

《STM32中文参考手册》对WWDG_SR寄存器的描述如下:

该寄存器用来记录当前是否有提前唤醒的标志。该寄存器仅有位 0 有效,其他都是保留位。当计数器值达到 40h 时,此位由硬件置 1。它必须通过软件写 0 来清除。对此位写 1 无效。即使中断未被使能,在计数器的值达到 0X40的时候,此位也会被置 1。

五、程序设计

对于窗口看门狗的程序设计主要分为3个部分:窗口看门狗初始化、重置WWDG计数器的值、窗口看门狗中断服务程序。

5.1 窗口看门狗初始化

该部分程序位于HARDWARE/wdg.c/WWDG_Init(),主要功能是使能APB1下wwdg时钟、通过WWDG_CFR寄存器设置窗口值,通过WWDG_CR寄存器设置计数器值并开启看门狗,注册WWDG中断(中断号0),软件清除提前唤醒标志位并使能提前唤醒中断。具体程序如下所示:

//初始化窗口看门狗 	
//tr   :T[6:0],计数器值 
//wr   :W[6:0],窗口值 
//fprer:分频系数(WDGTB),仅最低2位有效 
//Fwwdg=PCLK1/(4096*2^fprer). 
void WWDG_Init(u8 tr,u8 wr,u8 fprer) 
{    
	RCC->APB1ENR|=1<<11; 	//使能wwdg时钟 
	WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.     
	WWDG->CFR|=fprer<<7;    //PCLK1/4096再除2^fprer 
	WWDG->CFR&=0XFF80;      
	WWDG->CFR|=wr;     		//设定窗口值      
	WWDG->CR|=WWDG_CNT; 	//设定计数器值 
	WWDG->CR|=1<<7;  		//开启看门狗      
	MY_NVIC_Init(2,3,WWDG_IRQn,2);//抢占2,子优先级3,组2     
	WWDG->SR=0X00; 			//清除提前唤醒中断标志位 
	WWDG->CFR|=1<<9;        //使能提前唤醒中断 
} 

5.2 重置WWDG计数器的值

该部分程序位于HARDWARE/wdg.c/WWDG_Set_Counter(),主要功能是通过WWDG_CR寄存器重置7位计数器,相当于喂狗。具体程序如下所示:

//重设置WWDG计数器的值 
void WWDG_Set_Counter(u8 cnt) 
{ 
	WWDG->CR =(cnt&0x7F);//重设置7位计数器 
} 

5.3 窗口看门狗中断服务程序

该部分程序位于HARDWARE/wdg.c/WWDG_IRQHandler(),主要功能是在中断中喂狗(重置WWDG计数器的值),软件清除提前唤醒中断标志位,并控制DS1翻转(提示信息)。具体代码如下所示:

//窗口看门狗中断服务程序 
void WWDG_IRQHandler(void) 
{      
	WWDG_Set_Counter(WWDG_CNT);//重设窗口看门狗的值!         
	WWDG->SR=0X00;//清除提前唤醒中断标志位 
	LED1=!LED1; 
}

六、上机实验

将代码烧录至STM32F103ZET6,窗口看门狗不断触发中断,DS1灯不停闪烁,如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; bool kmp(char* query, char* pattern) {int n strlen(query);int m strlen(pattern);int fail[m];memset(fail, -1, sizeof(fail));for (int i 1; i < m; i) {int j fail[i - 1];while (j ! -1 && pattern[j 1] ! pattern…

Pikachu-PHP反序列化

从后端代码可以看出&#xff0c;拿到序列化后的字符串&#xff0c;直接做反序列化&#xff1b;并且在前端做了展示&#xff1b; 如果虚拟化后的字符串&#xff0c;包含alert 内容&#xff0c;反序列化后&#xff0c;就会弹出窗口 O:1:"S":1:{s:4:"test";s…

佑航科技Pre-A+轮融资成功:加速车载超声波芯片研发与量产

近日,超声波芯片领域的领先企业珠海佑航科技有限公司(简称“佑航科技”)宣布成功完成数千万元的Pre-A+轮战略融资。本轮融资由上市公司思瑞浦微电子旗下的芯阳基金进行战略投资,标志着佑航科技在车载超声波芯片及传感器领域的研发与量产能力迈上了新台阶。此次融资不仅为佑…

《Linux从小白到高手》理论篇:深入理解Linux的网络管理

今天继续宅家&#xff0c;闲来无事接着写。本篇详细深入介绍Linux的网络管理。 如你所知&#xff0c;在Linux中一切皆文件。网卡在 Linux 操作系统中用 ethX,是由 0 开始的正整数&#xff0c;比如 eth0、eth1… ethX。而普通猫和ADSL 的接口是 pppX&#xff0c;比如 ppp0 等。 …

Golang | Leetcode Golang题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; func repeatedSubstringPattern(s string) bool {return kmp(s s, s) }func kmp(query, pattern string) bool {n, m : len(query), len(pattern)fail : make([]int, m)for i : 0; i < m; i {fail[i] -1}for i : 1; i < m; i {j : …

【Python游戏开发】贪吃蛇游戏demo

准备步骤 项目开发使用【Mu 编辑器】 1.新建项目&#xff0c;并导入游戏图片 游戏编写 1.创建场景 SIZE 15 # 每个格子的大小 WIDTH SIZE * 30 # 游戏场景总宽度 HEIGHT SIZE * 30 # 游戏场景总高度def draw():screen…

Spring源码-依赖注入

核心方法是&#xff1a;populateBean 整体流程&#xff1a;首先进行Spring自带的依赖注入&#xff0c;包括byName和byType&#xff0c;然后进行注解Autowired的注入 1.Spring自带依赖注入byName和byType 核心代码&#xff1a; int resolvedAutowireMode mbd.getResolvedAu…

C++ | Leetcode C++题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; class Solution { public:bool kmp(const string& query, const string& pattern) {int n query.size();int m pattern.size();vector<int> fail(m, -1);for (int i 1; i < m; i) {int j fail[i - 1];while (j ! -1 &…

【星汇极客】手把手教学STM32 HAL库+FreeRTOS之任务管理(2)

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括但不限于&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三。 后面会经常写一下博客&…

Spring Boot与iTextPdf:高效生成PDF文件预览

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在现代应用程序开发中&#xff0c;生成PDF文件是一个常见的需求。PDF文件因其跨平台性和易读性&#xff0c;被广泛应用于文档交换、报告生成和打印预览等场景。Spring Boot作为一个用于简化Spring应用开发的框…

华为OD机试 - 几何平均值最大子数(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

uniapp固定document.title标题

由于业务中需要将h5的标题固定 但是uniapp没有对应的接口 所以使用Object.defineProperty拦截set方法来实现 代码也很简单 在App.vue的onLaunch加上就行了 onLaunch: function() {document.title 固定标题;Object.defineProperty(document, title, {set() {return false;}});…

USB 3.0?USB 3.1?USB 3.2?怎么区分?

还记得小白刚接触电脑的时候&#xff0c;电脑普及的USB接口大部分是USB 2.0&#xff0c;还有少部分USB 1.0的&#xff08;现在基本上找不到了&#xff09;。 当时的电脑显示器&#xff0c;可能00后的小伙伴都没见过&#xff0c;它们大概长这样&#xff1a; 当时小白以为电脑最…

C++ 算法学习——1.6 差分算法与二维差分算法

一维差分算法概述&#xff1a; 差分算法是一种用于计算序列中相邻元素之间差值的技术。在C中&#xff0c;STL&#xff08;标准模板库&#xff09;提供了std::adjacent_difference函数来实现差分算法。 std::adjacent_difference函数&#xff1a; std::adjacent_difference函数位…

基于MindSpore实现CycleGAN壁画修复

基于MindSpore实现CycleGAN壁画修复_哔哩哔哩_bilibili 本案例运行需要较大内存&#xff0c;建议在Ascend/GPU上运行。 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation us…

指针赋值or常数赋值

int main (){int a 10;int b ;b a;int *c &a;int *d c; } 常数 a,b赋值&#xff1a; 都是将存储的值&#xff08;10&#xff09;赋值给别人。 指针赋值也是类似的&#xff1a; 指针存储的值&#xff08;&a&#xff09;为地址&#xff0c;就是把c指向的地址赋值给…

C语言 | Leetcode C语言题解之第458题可怜的小猪

题目&#xff1a; 题解&#xff1a; int poorPigs(int buckets, int minutesToDie, int minutesToTest){int base minutesToTest / minutesToDie 1;int pigs ceil(log(buckets)/log(base));return pigs; }

24-10-2-读书笔记(二十二)-《契诃夫文集》(一)上([俄] 契诃夫 [译] 汝龙)啊!真想生活。

文章目录 《契诃夫文集》&#xff08;一&#xff09;上&#xff08;[俄] 契诃夫 [译] 汝龙 &#xff09;早期生活——塔甘罗格&#xff08;人物家庭简介&#xff09;学生时期——莫斯科&#xff08;写作与学习&#xff09;流浪时期——哈萨林&#xff08;游历与流浪&#xff09…

VCSEL驱动电路

1.1 驱动电路 发射端可用MOS管控制VCSEL二极管负极方式发出脉冲光(正极对地)&#xff0c;具体作用过程如下&#xff1a; Step 1: MOS管断开, C2 电容充电(左侧HV)&#xff1b; Step 2: 信号控制MOS管打开&#xff1b; Step 3: MOS管打开后, C2电容左侧电压降为0V, 右侧变为…

当你系统有多个模块的时候,要设计统一入口页了。

本次给大家带来一批系统统一入口页的界面&#xff0c;这次都是科技感十足的界面。入口页将所有系统集中展示出来&#xff0c;并辅以其他设计元素进行氛围烘托&#xff0c;别看简单&#xff0c;但真的不好设计。