【正点原子STM32连载】第十五章 窗口看门狗实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html#

第十五章 窗口看门狗实验

本章介绍APM32F407窗口看门狗(WWDT)的使用,窗口看门狗与独立看门狗一样能够帮助CPU在进入错误状态或程序跑飞时进行复位,不过窗口看门狗相对于独立看门狗限制了“喂狗”的最小间隔,若两次“喂狗”的间隔太短,一样会产生复位。通过本章的学习,读者将学习到WWDT的使用。
本章分为如下几个小节:
15.1 硬件设计
15.2 程序设计
15.3 下载验证

15.1 硬件设计
15.1.1 例程功能

  1. 程序运行后,点亮LED0等待300毫秒后开启窗口看门狗,后进入死循环等待窗口看门狗的中断在窗口看门狗的中断服务函数中执行喂狗和翻转LED1状态的操作,能观察到的现象为LED0在程序启动时闪烁一下,随后LED1不停闪烁
    15.1.2 硬件资源
  2. LED
    LED0 - PF9
    LED1 - PF10
  3. 窗口看门狗
    15.1.3 原理图
    本章实验使用的窗口看门狗为APM32F407的片上资源,因此并没有相应的连接原理图。
    15.2 程序设计
    15.2.1 Geehy标准库的WWDT驱动
    本章实验使用到了WWDT的提前唤醒中断,提前唤醒中断指的是WWDT在“喂狗”超时即将进行复位前由WWDT产生的中断,本章实验就在WWDT的提前唤醒中断服务函数中进行“喂狗”。在使用WWDT前,需要先对其进行初始化,在初始化中,需要使能WWDT并配置WWDT的预分频系数和窗口值,还要进行使能WWDT中断的相关操作,具体的步骤如下:
    ①:使能WWDT
    ②:配置WWDT预分频系数
    ③:配置WWDT窗口值
    ④:使能WWDT的提前唤醒中断
    ⑤:使能WWDT中断,并配置其相关的中断优先级
    ⑥:在WWDT提前唤醒中对其进行“喂狗”
    在Geehy标准库中对应的驱动函数如下:
    ①:使能WWDT
    该函数用于使能WWDT,其函数原型如下所示:
    void WWDT_Enable(uint8_t counter);
    该函数的形参描述,如下表所示:
    在这里插入图片描述

表15.2.1.1 函数WWDT_Enable()形参描述
该函数的返回值描述,如下表所示:
在这里插入图片描述

表15.2.1.2 函数WWDT_Enable()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"void example_fun(void)
{/* 使能WWDT */WWDT_Enable(0x7F);
}

②:配置WWDT预分频系数
该函数用于配置WWDT的预分频系数,预分频系数决定了WWDT计数的快慢,其函数原型如下所示:
void WWDT_ConfigTimebase(WWDT_TIME_BASE_T timeBase);
该函数的形参描述,如下表所示:
在这里插入图片描述

表15.2.1.3 函数WWDT_ConfigTimebase()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表15.2.1.4 函数WWDT_ConfigTimebase()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"void example_fun(void)
{/* 配置WWDT的预分频系数* WWDT的计数时钟为(PCLK1/4096)/8*/WWDT_ConfigTimebase(WWDT_TIME_BASE_8);
}

③:配置WWDT窗口值
该函数用于配置WWDT的窗口值,在WWDT的计数值减少到窗口值之前进行“喂狗”,将为导致WWDT复位,其函数原型如下所示:
void WWDT_ConfigWindowData(uint8_t windowData);
该函数的形参描述,如下表所示:
形参 描述
windowData WWDT的窗口值
表15.2.1.5 函数WWDT_ConfigWindowData()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表15.2.1.6 函数WWDT_ConfigWindowData()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"void example_fun(void)
{/* 配置WWDT窗口值 */WWDT_ConfigWindowData(0x5F);
}

④:使能WWDT提前唤醒中断
该函数用于使能WWDT的提前唤醒中断,其函数原型如下所示:
void WWDT_EnableEWI(void);
该函数的形参描述,如下表所示:
形参 描述
无 无
表15.2.1.7 函数WWDT_EnableEWI()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表15.2.1.8 函数WWDT_EnableEWI()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"void example_fun(void)
{/* 使能WWDT提前唤醒中断 */WWDT_EnableEWI();
}

⑤:配置WWDT中断
请见第12.2.3小节中配置中断的相关内容。
⑥:配置WWDT的计数值
该函数用于配置WWDT的计数值,也就是所谓的“喂狗”,其函数原型如下:
void WWDT_ConfigCounter(uint8_t counter);
该函数的形参描述,如下表所示:
形参 描述
counter WWDT的计数值
表15.2.1.9 函数WWDT_ConfigCounter()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表15.2.1.10 函数WWDT_ConfigCounter()返回值描述
该函数的使用示例,如下表所示:

#include "apm32f4xx.h"
#include "apm32f4xx_wwdt.h"void example_fun(void)
{/* 配置WWDT的计数值(喂狗) */WWDT_ConfigCounter(0x7F);
}

15.2.2 看门狗驱动
本章实验的看门狗驱动主要负责向应用层提供WWDT的初始化函数,并实现WWDT的提前唤醒中断服务函数,在WWDT的提前唤醒中断服务函数中执行“喂狗”操作。本章实验中,看门狗的驱动代码包括wdt.c和wdt.h两个文件。
看门狗驱动中WWDT的初始化函数,如下所示:

/*** @brief	窗口看门狗初始化* @param	tr: 计数器数值* @param	tw: 窗口值* @param	fprer: 时基预分频系数,WWDT_TIME_BASE_1~WWDT_TIME_BASE_8* 			Fwwdt = (PCLK1 / 4096) / (2^fprer)* @retval	无*/
void wwdt_init(uint8_t tr, uint8_t wr, uint32_t fprer)
{RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_WWDT);	/* 使能WWDT时钟 */WWDT_Enable(tr);								/* 使能窗口看门狗并设置计数器数值 */WWDT_ConfigTimebase((WWDT_TIME_BASE_T)fprer);		/* 配置时基预分频系数 */WWDT_ConfigWindowData(wr);							/* 设置窗口值 */wwdt_counter = tr;WWDT_EnableEWI();									/* 使能提前唤醒中断 */NVIC_EnableIRQRequest(WWDT_IRQn, 2, 0);				/* 使能中断 */
}

从上面的代码中可以看出,WWDT的初始化函数中除了使能了WWDT的时钟外,还分别执行了使能WWDT、配置WWDT的预分频系数和窗口值、使能WWDT的提前唤醒中断和使能WWDT中断的操作。随后,在WWDT计数值减少到0x40时,将会产生提前唤醒中断。
看门狗驱动中,WWDT提前唤醒中断的中断服务函数,如下所示:

/*** @brief	窗口看门狗提前唤醒中断服务函数* @param	无* @retval	无*/
void WWDT_IRQHandler(void)
{if (WWDT_ReadFlag() == SET)				/* 判断提前唤醒中断标志 */{WWDT_ConfigCounter(wwdt_counter);	/* 重新配置窗口看门狗计数器数值 */LED1_TOGGLE();						/* 翻转LED1状态 */WWDT_ClearFlag();					/* 清除提前唤醒中断标志 */}
}

可以看到,在窗口看门狗的提前唤醒中断服务函数中,对WWDT进行了喂狗操作,同时还对LED1的状态进行了以此翻转(方便观察)。
15.2.3 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3);	/* 设置中断优先级分组为组3 */sys_apm32_clock_init(336, 8, 2, 7);					/* 配置系统时钟 */delay_init(168);										/* 初始化延时功能 */usart_init(115200);									/* 初始化串口 */led_init();											/* 初始化LED */LED0(0);												/* LED0点亮 */delay_ms(300);wwdt_init(0x7F, 0x5F, WWDT_TIME_BASE_8);while (1){LED0(1);	/* LED0熄灭 */}
}

可以看到应用代码中,LED初始化后,LED0会被点亮300毫秒,随后初始化窗口看门狗并熄灭LED0,若窗口看门狗没有正常被“喂狗”,那么程序复位,可以看到LED0再次亮起和熄灭,若窗口看门狗正常被“喂狗”,则可以看到LED1闪烁。
15.3 下载验证
在完成编译和烧录操作后,可以看到板子上的LED0在上电时,亮起并熄灭一次,随后LED1不断闪烁,说明WWDT“喂狗”正常。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Apache Kafka 和 Go 将数据引入 OpenSearch

需要编写自定义集成层来满足数据管道中的特定要求?了解如何使用 Go 通过 Kafka 和 OpenSearch 实现此目的。 可扩展的数据摄取是OpenSearch等大规模分布式搜索和分析引擎的一个关键方面。构建实时数据摄取管道的方法之一是使用Apache Kafka。它是一个开源事件流平台…

无涯教程-Perl - unshift函数

描述 此函数按顺序将LIST中的元素放在ARRAY的开头。这与shift()相反。 语法 以下是此函数的简单语法- unshift ARRAY, LIST返回值 此函数返回ARRAY中新元素的数量。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl -warray ( 1, 2, 3, 4);print "Value of a…

30.Netty源码服务端启动主要流程

highlight: arduino-light 服务端启动主要流程 •创建 selector •创建 server socket channel •初始化 server socket channel •给 server socket channel 从 boss group 中选择一个 NioEventLoop •将 server socket channel 注册到选择的 NioEventLoop 的 selector •…

SSH远程直连--------------Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试 在某些特殊需求下,我们想ssh直接远程连接docker 容器,下面我们介绍结合cpolar工具实现ssh远程直接连接docker容器…

SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程

首先,如果在某个类或某个方法被标记为Transactional时,Spring boot底层会在创建这个bean时生成代理对象(默认使用cglib) 示例: 当调用studentService的addStudent方法时,会直接跳到CglibAopProxy类去执行intercept方…

AWS WAF实战、优势对比和缺陷解决

文章目录 挑战和目标AWS WAF的优势AWS WAF的不足我是怎么做的?什么是比较好的AWS WAF设计? 笔者为了解决公司Web站点防御性问题,较为深入的研究AWS WAF的相关规则。面对上千万的冲突,笔者不得设计出一种能漂亮处理冲突数据WAF规则。 AWS WAF开发人员在…

汽车后视镜反射率测定仪

后视镜是驾驶员坐在驾驶室座位上直接获取汽车后方、侧方和下方等外部信息的工具。它起着“第三只眼睛”的作用。后视镜按安装位置划分通常分为车外后视镜、监视镜和内后视镜。外后视镜观察汽车后侧方监视镜观察汽车前下方内后视镜观察汽车后方及车内情况。用途不一样镜面结构也…

计算机网络-物理层(三)-信道的极限容量

计算机网络-物理层(三)-信道的极限容量 当信号在信道中传输失真不严重时,在信道的输出端,这些信号可以被识别 当信号在信道中,传输失真严重时,在信道的输出端就难以识别 造成失真的因素 码元传输速率信号传输距离噪声干扰传输媒…

excel条件格式:不同组对应位置对比标记

问题描述 下图中有两组数据,想要对比两个对应位置的数据并标记 条件格式 选中其中一个单元格,条件格式->新建规则 使用公式确定要设置格式的单元格,自定义需求 格式化剩余同样标准的单元格

docker项目实战

1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘 1)拉取mysql:5.6和owncloud镜像 [rootmaster ~]# docker pull mysql:5.6 5.6: Pulling from library/mysql 35b2232c987e: Pull complete fc55c00e48f2: Pull complete 0030405130e3: Pull compl…

设置Windows主机的浏览器为wls2的默认浏览器

1. 准备工作 wsl是可以使用Windows主机上安装的exe程序,出于安全考虑,默认情况下改功能是无法使用。要使用的话,终端需要以管理员权限启动。 我这里以Windows Terminal为例,介绍如何默认使用管理员权限打开终端,具体…

SQLite数据库实现数据增删改查

当前文章介绍的设计的主要功能是利用 SQLite 数据库实现宠物投喂器上传数据的存储,并且支持数据的增删改查操作。其中,宠物投喂器上传的数据包括投喂间隔时间、水温、剩余重量等参数。 实现功能: 创建 SQLite 数据库表,用于存储宠…

实例040 限制窗体大小

实例说明 Windows窗体是可以随意改变大小的,然而对于一些要求严格的窗体,开发人员不希望用户随意的改变其大小,例如,定位准确的地图和游戏软件等。遇到这种情况必须对窗口的大小进行一些限制。本例设计一个限制了大小的窗体&#…

vue2+Spring Boot2.7 大文件分片上传

之前我们文章 手把手带大家实现 vue2Spring Boot2.7 文件上传功能 将了上传文件 但如果文件很大 就不太好处理了 按正常情况甚至因为超量而报错 这里 我弄了个足够大的文件 我们先搭建 Spring Boot2.7 环境 首先 application.yml 代码编写如下 server:port: 80 upload:path:…

漏洞指呗-VluFocus靶场专栏-番外篇

漏洞指呗-VluFocus靶场专栏-番外篇奇技淫巧 🌸struts2漏洞扫描工具🌸step1 修改ip和端口step2 验证漏洞是否存在step3 执行cmd命令,获取flag 🌸Goby插件工具headshot🌸step1 输入ip和端口 检测step2 cmd 输入指令 &…

漏洞指北-VulFocus靶场专栏-初级01

漏洞指北-VulFocus靶场专栏-初级 初级001 🌸海洋CMS代码执行(CNVD-2020-22721🌸step1:进入后台页面 账号密码:admin amdinstep2:点击系统,点击后台IP安全设置,关闭step3 启动burpsuite&#xff…

Visual Studio 2022 你必须知道的实用调试技巧

目录 1、什么是bug? 2.调试是什么?有多重要? 2.1我们是如何写代码的? 2.2又是如何排查出现的问题的呢? ​编辑 2.3 调试是什么? 2.4调试的基本步骤 2.5Debug和Release的介绍 3.Windows环境调试介绍…

设计模式——接口隔离原则

文章目录 基本介绍应用实例应传统方法的问题和使用接口隔离原则改进 基本介绍 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上先看一张图: 类 A 通过接口 Interface1 依赖类 B,类 C 通过接口 Interface1 依赖类 D&…

python rtsp 硬件解码 二

上次使用了python的opencv模块 述说了使用PyNvCodec 模块,这个模块本身并没有rtsp的读写,那么读写rtsp是可以使用很多方法的,我们为了输出到pytorch直接使用AI程序,简化rtsp 输入,可以直接使用ffmpeg的子进程 方法一 …

Python 处理 Excel 表格的 14 个常用操作

目录 1. 安装依赖库 2. 导入库 3. 读取Excel文件 4. 写入Excel文件 5. 创建工作表 6. 访问工作表 7. 读取单元格数据 8. 写入单元格数据 9. 获取行数和列数 10. 过滤数据 11. 排序数据 12. 添加新行 13. 删除行或列 14. 计算汇总统计 总结 无论是数据分析师、财…