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

news2025/1/29 14:12:31

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

第十四章 独立看门狗实验

本章介绍APM32F407独立看门狗(IWDT)的使用,独立看门狗能够帮助CPU在进入错误状态或程序跑飞时进行复位。通过本章的学习,读者将学习到IWDT的使用。
本章分为如下几个小节:
14.1 硬件设计
14.2 程序设计
14.3 下载验证

14.1 硬件设计
14.1.1 例程功能

  1. 程序运行后,开发板板载的LED0因不停的复位而闪烁,但如果按下KEY_UP按键进行喂狗,那么就不会产生复位,LED0也就保持常亮,一旦超过看门狗的溢出时间(Tout=1000毫秒)没有按下KEY_UP按键进行喂狗,那么就会进行复位,LED0也就会熄灭一次。
    14.1.2 硬件资源
  2. LED
    LED0 - PF9
  3. 按键
    KEY_UP - PA0
  4. 独立看门狗
    14.1.3 原理图
    本章实验使用的独立看门狗为APM32F407的片上资源,因此并没有相应的连接原理图。
    14.2 程序设计
    14.2.1 Geehy标准库的IWDT驱动
    在使用IWDT前,需要先对其进行初始化,在初始化操作中要开启IWDT并配置IWDT的预分频系数和重装载值,预分频系数和重装载值就决定了IWDT单次溢出的时间,因此这两个值应该根据实际的应用场景妥善进行设置,若IWDT的溢出时间太长,则对异常情况的反应将变得迟钝,但若设置地太短,则会误触发复位,因此需要妥善设置。使用IWDT的具体步骤如下:
    ①:启动IWDT
    ②:使能访问IWDT相关寄存器
    ③:配置预分频系数
    ④:配置重装载值
    ⑤:在IWDT溢出前不断地进行“喂狗”操作
    在Geehy标准库中对应的驱动函数如下:
    ①:使能IWDT
    该函数用于使能IWDT,其函数原型如下所示:
    void IWDT_Enable(void);
    该函数的形参描述,如下表所示:
    在这里插入图片描述

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

#include "apm32f4xx.h"
#include "apm32f4xx_iwdt.h"

void example_fun(void)
{
    /* 使能IWDT */
    IWDT_Enable();
}

②:使能访问IWDT相关寄存器
该函数用于使能访问IWDT相关寄存器,只有使能访问了IWDT相关的寄存器,才能配置其预分频系数和重装载值,其函数原型如下所示:
void IWDT_EnableWriteAccess(void);
该函数的形参描述,如下表所示:
形参 描述
无 无
表14.2.1.3 函数IWDT_EnableWriteAccess()形参描述
该函数的返回值描述,如下表所示:
在这里插入图片描述

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

#include "apm32f4xx.h"
#include "apm32f4xx_iwdt.h"

void example_fun(void)
{
    /* 使能访问IWDT相关寄存器 */
    IWDT_EnableWriteAccess();
}

③:配置IWDT预分频系数
该函数用于配置IWDT的预分频系数,预分频系数决定了IWDT计数的频率,其函数原型如下所示:
void IWDT_ConfigDivider(uint8_t div);
该函数的形参描述,如下表所示:
形参 描述
div IWDT的预分频系数
例如:IWDT_DIVIDER_4、IWDT_DIVIDER_8等(在apm32f4xx_iwdt.h文件中有定义)
表14.2.1.5 函数IWDT_ConfigDivider()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表14.2.1.6 函数IWDT_ConfigDivider()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_iwdt.h"

void example_fun(void)
{
    /* 配置IWDT的预分频系数为32 */
    IWDT_ConfigDivider(IWDT_DIVIDER_32);
}

④:配置IWDT的重装载值
该函数用于配置IWDT的重装载值,重装载值用于决定IWDT从“喂狗”到溢出时计数的个数,其函数原型如下所示:
void IWDT_ConfigReload(uint16_t reload);
该函数的形参描述,如下表所示:
在这里插入图片描述

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

#include "apm32f4xx.h"
#include "apm32f4xx_iwdt.h"

void example_fun(void)
{
    /* 配置IWDT的重装载值为875 */
    IWDT_ConfigReload(875);
}

⑤:重装载IWDT
该函数用于重装载IWDT,也就是所谓的“喂狗”,其函数原型如下所示:
void IWDT_Refresh(void);
该函数的形参描述,如下表所示:
形参 描述
无 无
表14.2.1.9 函数IWDT_Refresh()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表14.2.1.10 函数IWDT_Refresh()返回值描述
该函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "apm32f4xx_iwdt.h"

void example_fun(void)
{
    /* 重装载IWDT(喂狗) */
    IWDT_Refresh();
}

14.2.2 看门狗驱动
本章实验的看门狗驱动主要负责向应用层提供IWDT初始化和喂狗的操作函数,本章实验中,看门狗的驱动代码包括wdt.c和wdt.h两个文件。
看门狗驱动中,IWDT的初始化函数,如下所示:

/**
 * @brief	独立看门狗初始化
 * @param	prer: 独立看门狗定时器预分频系数,
 * 			IWDT_DIVIDER_4~IWDT_DIVIDER_256对应预分频系数为4~256
 * @param	rlr : 自动重装载值,范围:0~0xFFF
 * @note	时间计算(大概):Tout=((4 * 2^prer) * rlr) / 28 (ms)
 * 			28数值来自独立看门狗时钟源LSICLK的频率
 * @retval	无
 */
void iwdt_init(uint8_t prer, uint32_t rlr)
{
    IWDT_Enable();				/* 启动独立看门狗 */
    IWDT_EnableWriteAccess();	/* 使能访问独立看门狗相关寄存器 */
    IWDT_ConfigDivider(prer);	/* 配置预分频系数 */
    IWDT_ConfigReload(rlr);		/* 配置重装载值 */
    IWDT_Refresh();				/* 重装载独立看门狗计数器 */
}

IWDT的初始化函数中使能了IWDT并配置其预分频系数和重装载值,并进行了一次“喂狗”防止IWDT一使能就溢出引发复位。
看门狗驱动中,IWDT的“喂狗”函数,如下所示:

/**
 * @brief	喂独立看门狗
 * @param	无
 * @retval	无
 */
void iwdt_feed(void)
{   
    IWDT_Refresh();	/* 重装载独立看门狗计数器 */
}

该函数很简单,就是重装载IWDT的计数值。
14.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 */
    key_init();											/* 初始化按键 */
    delay_ms(100);
    iwdt_init(IWDT_DIVIDER_32, 875);			/* 独立看门狗初始化,溢出时间为1秒 */
    LED0(0);
    
    while (1)
    {
    		if (key_scan(0) == WKUP_PRES)
    		{
    			iwdt_feed();
    		}
    		
    		delay_ms(10);
    }
}

可以看到应用代码中,LED初始化后,LED0会处于默认的熄灭状态100毫秒,随后初始化IWDT并点亮LED0,接着在while循环中重复判断KEY_UP按键是否被按下,若按下则进行“喂狗”操作,若在IWDT溢出前都为按下KEY_UP按键,则IWDT会触发复位,复位会导致LED0熄灭大约100毫秒(便于观察)。
14.3 下载验证
在完成编译和烧录操作后,可以看到板子上的LED0每间隔一段时间(大约1秒)就闪烁一次,这是因为IWDT不断地溢出,导致的复位。接下来若以时间间隔小于1秒(大约)的速度频繁地按下KEY_UP按键,则可以在IWDT溢出前及时“喂狗”,具体的现象为LED0不再闪烁。

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

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

相关文章

gor工具http流量复制、流量回放,生产运维生气

gor是一款流量复制回放工具,gor工具的官网:https://goreplay.org/ 1、对某个端口的http流量进行打印 ./gor --input-raw :8000 --output-stdout 2、对流量实时转发,把81端口流量转发到192.168.3.221:80端口 ./gor --input-raw :81--output-ht…

自适应混沌蜣螂优化算法及其MALTAB实现

本文改进主要参考: S. Li and J. Li, “Chaotic dung beetle optimization algorithm based on adaptive t-Distribution,” 2023 IEEE 3rd International Conference on Information Technology, Big Data and Artificial Intelligence (ICIBA), Chongqing, China…

滑块验证2

滑块示例 介绍 滑块图片地址接口获取,两张(滑块图和背景缺口图)验证通过校验为接口校验,需要一个uuid和位移拼接成校验地址uuid能通过接口获取,位移需计算得到缺口位移计算 需将两张图片区分保存,然后通过特定工具包计算出位移 所需包 opencv-python 部分代码 def _t…

陪诊小程序|服务到家就医陪伴更不可少

随着科技的不断发展和医疗服务的日益完善,陪诊小程序成为了当下为炙手可热的医疗软件之一。无论是患者还是医护人员,陪诊小程序都为他们提供了全新的就医体验和便捷的服务。下面让我们一同探索一下陪诊小程序的软件开发功能。 一、陪诊小程序功能&#x…

2018年3月全国计算机等级考试真题(语言二级C)

2018年3月全国计算机等级考试真题(语言二级C) 第1题 设有定义:char s[81];int i0;以下不能将一行带有空格的字符串正确读入的语句或语句组是 A. while((s[i]getchar())!\n);s[i]\0; B. scanf("%s",s); C.…

数组累加器-reduce、reduceRight

数组累加器-reduce 一、基本语法1.reduce2.reduceRight 二、具体使用1.reduce2.reduceRight 三、使用场景1.数组求和2.数组求积3.计算数组中每个元素出现的次数 一、基本语法 1.reduce reduce() :对数组中的每个元素按序执行一个提供的 reducer 函数,每…

高效使用ChatGPT之ChatGPT客户端

ChatGPT客户端,支持Mac, Windows, and Linux 下载地址见文章结尾 软件截图 Windows: Mac: 说明 chatgpt桌面版,相比于网页版的chatgpt,最大的特色是支持历史聊天对话记录导出,且支持三种格式:PNG、PDF、…

i.MX6ULL开发板无法进入NFS挂载文件系统的解决办法

问题 使用NFS网络挂载文件系统后卡住无法进入系统。 解决办法 此处不详细讲述NFS安装流程 查看板卡挂载在/home/etc/rc.init下的自启动程序 进入到../../home/etc目录下,查看rc.init文件,首先从第一行排查,查看/home/etc/netcfg文件代码内容&…

AI版 PS AI beta 25.0的完整包

介绍: PS AI beta 25.0的完整包,还有一个神经网络滤镜,以及简体中文补丁。 离线完整包,直接安装就可以用,不需要国外注册登录,不需要国外网络做图,支持中文生成。安装文件目录: 3.安…

FinalShell SSH工具安装教程及编辑窗口修改背景颜色,自定义背景图片,修改字体,修改快捷键(详细图文教程)

FinalShell 在 Windows 上提供了一个方便、安全、功能完备的远程管理工具。它的中文支持和自定义功能让其适合国内 Linux 系统管理者使用。与 Xshell 等软件相比,FinalShell 更注重功能实用性。 目录 FinalShellFinalShell的安装教程FinalShell 的一些主要功能和特点…

破局!低代码直击智慧园区建设痛点!

从捷码官网获取的捷码产品体验账号,用浏览器打开下列地址即可(推荐电脑端哈),需要自取: http://dev.gemcoder.com/front/development/index.html#/officialLogin?jmcmVnaXN0ZXI9dHJ1ZQ%3D%3D 随着大数据、物联网、云计…

open suse 15.5(任意版本) 使用阿里云的repo

一、shell suse 的包管理工具叫 zypper. zypper addrepo -f http://mirrors.aliyun.com/opensuse/distribution/leap/15.5/repo/oss/ openSUSE-15.5-Oss zypper addrepo -f http://mirrors.aliyun.com/opensuse/distribution/leap/15.5/repo/non-oss/ openSUSE-15.5-Non-Oss …

CS5523 MIPI/DSI转EDP信号转换芯片|pin√pin替代龙迅LT8911方案

ASL新推出CS5523是一款MIPI DSI输入、DP/e DP输出转换芯片。MIPI DSI最多支持4个通道,每个通道的最大运行速度为1.5Gps。对于DP 1.2输出,它由4个数据通道组成,支持1.62Gbps和2.7Gbps的链路速率。它支持2560的最高分辨率*144060Hz.它只能使用单…

pdf怎么合并在一起?这几个合并方法了解一下

pdf怎么合并在一起?在日常工作、学习和生活中,我们常常会遇到需要将多个PDF文件合并成一个文件的情况。比如,在学术论文写作中,我们可能需要将多篇论文合并成一个文件进行打印和提交。在工作中,我们可能需要将多个报告…

2023年上半年软件设计师下午真题及答案解析

试题一(15分) 随着农业领域科学种植的发展,需要对农业基地及农事进行信息化管理,为租户和农户等人员提供种植相关服务,现欲开发农事管理服务平台,其主要功能是: (1)人员管理:平台管理员管理租户&#xff…

msvcp120.dll丢失的解决方法?哪种解决方法比较常用?

msvcp140.dll是Microsoft Visual C Redistributable的一部分,它是Windows操作系统中的一个动态链接库文件。这个文件包含了许多C标准库函数的实现,对于一些依赖C标准库的应用程序来说,msvcp140.dll是非常重要的。msvcp140.dll的主要用途是提供…

python编程中有哪些方便的调试方法

大家好,给大家分享一下一个有趣的事情,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 对于每个程序开发者来说,调试几乎是必备技能。常用Pycharm编辑器里的方法有Print大法、log大法,但缺少类似Matlab的…

2024浙大MBA/MEM/MPA四个月冲刺备考策略

近期收到很多考生的咨询:距离联考就仅剩四个多月的时间,这个管理类联考的难度如何?主要考些什么内容?现在才开始备考还有希望上岸浙大吗?是不是要等到明年在开始备考比较合适?那么今天在这里小立老师就跟大…

《凤凰架构》第二章——访问远程服务

前言 这章挺难的,感觉离我比较远,不太好懂,简单记录吧。 这章主要讲访问远程服务,主要对比了RPC和REST的区别,可以结合知乎上的文章《既然有 HTTP 请求,为什么还要用 RPC 调用?》 这篇文章进行…

电脑提示丢失(或找不到)msvcp120.dll解决办法

msvcp140.dll是Microsoft Visual C Redistributable的一部分,它是Windows操作系统中的一个动态链接库文件。这个文件包含了许多C标准库函数的实现,对于一些依赖C标准库的应用程序来说,msvcp140.dll是非常重要的。msvcp140.dll的主要用途是提供…