【北京迅为】《STM32MP157开发板使用手册》- 第三十一章Cortex-M4窗口看门狗实验

news2024/9/20 4:14:15

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等


第三十一章Cortex-M4窗口看门狗实验

本章节最终所完成的实验例程存放路径为“iTOP-STM32MP157开发板网盘资料汇总\06_Cortex-M4实验例程\07_WWDG.zip”。

31.1 WWDG 简介

“看门狗”就是一个计数器,由于位数是有限的,计数器能够装的数值是有限的(比如8位的最多装256个数、16位的最多装65536个数),从开启“看门狗”那刻起,它就开始不停的数机器周期,数一个机器周期就计数器加1,加到计数器盛不下了(术语叫溢出)就就产生一个复位信号,重启系统。”

我们在设计程序时,先根据看门狗计数器的位数和系统的时钟周期算一下计满数需要的时间,就是说在这个时间内“看门狗”计数器是不会装满的,然后在这个时间内告诉它重新开始计数,就是把计数器清零,这个过程叫“喂狗”,这样隔一段时间喂一次狗,只要程序正常运行他就永远计不满,一旦出现死循环之类的故障,没有及时来清零计数器,就会导致装满了溢出,他就重启系统。

STM32MP157总共有三个看门狗,两个独立看门狗 IWDG,一个窗口看门狗 WWDG。独立看门狗只能A7 使用。而窗口看门狗只能M4 使用。IWDG 看门狗有独立时钟,由 LSI 驱动,即使主时钟发生故障它也能保持活动状态,而 WWDG 的时钟由 APB1 时钟分频后得到时钟驱动,最大为 104.5MHz

STM32MP157 看门狗资源框图如下图所示:

31.2 看门狗原理讲解

WWDG 工作示意图如下图所示:

独立看门狗的工作原理就是一个递减计数器不断的往下递减计数,当减到 0 之前如果没有刷新递减计数器的值(即俗称的喂狗)的话,产生复位。窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值 0X40 时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。这个是跟独立看门狗类似的地方,不同的地方是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义。

WWDG 功能框图如下图所示:

 

首先我们注意到输入为pclk,输出为wwdg_out_rst和wwdg_it。其中pclk为计数器时钟,是由 PCLK1 提供的,最大可为 104.5MHz,后面的分频系数

由用户去配置,那么给 WWDG 时钟频率=PCLK1/(4096*

)。 wwdg_out_rst和wwdg_it分别代表WWDG1复位信号输出和WWDG1的中断输出。

T[6:0]

控制寄存器的低 7 位 WWDG_CR[6:0]用于递减计数,也就是图中的计数器 T[6:0],它的初始值用户可配置,可以配置这 7 位都为 1,这个就是最大的初始值(0X7F)。递减计数器每计数一次的时间间隔=(4096*2WDGTB)/ Fpclk,如果要计数 N 次,则要用的时间为:N*(4096*2WDGTB)/ Fpclk。递减计数器最低可以递减到 0X3F。

W[6:0]

配置寄存器的低 7 位 WWDG_CFR[6:0]也就是图中的 W[6:0],用于与控制寄存器的低 7 位的计数器(T[6:0])的值进行比较,WWDG_CFR[6:0]的值也就是我们说的上限值,由用户设置,不能设置为 0X40,最大可以设置等于递减计数器的初始值。

T6

就是控制寄存器的第 6 位,即递减计数器 T[6:0]的最高位,当递减计数器从 0X40 递减到0X3F 的时候就产生复位,而第 6 位从 1 变成 0。

其中:

:WWDG 超时时间(单位为 ms)

:APB1 的时钟频率(单位为 Khz)

:WWDG 的预分频系数,用户配置,可以选 0~7,如果选为 0,

 =1,如果选为7,则

为128。

T[5:0]:窗口看门狗的计数器的低 5 位,由用户配置,最小为 0x00,最大为 0x3F,配置的越大,超时时间越长。

一般情况下我们会将APB1 的时钟频率设置为104.5Mhz104.5MHz 时钟下 WWDG 的最小最大超时表如下图所示:

WDGTB

最小超时(us)T[5:0]=0x00

最大超时(ms)T[5:0]=0x3F

0

39.20

2.51

1

78.39

5.02

2

156.78

10.03

3

313.57

20.07

4

627.14

40.14

5

1254.28

80.27

6

2508.56

160.55

7

5017.11

321.10

我们来对WDGTB=0的时候进行一个计算,首先计算最小的超时时间,当T[5:0]六位都为0的时候时间最小,计算如下 

31.3 实验目的

1)串口看门狗的学习

2)STM32CubeIDE工具软件的使用与熟悉

实验要求,分别使用LED2和LED3来表示复位状态和喂狗的状态,在看门狗初始化之前默认LED2亮起并且延时500ms,而while循环之中设置LED2为熄灭状态,这样当我们不开启喂狗,且设置看门狗向下计数器的初值足够大,这样如果系统不断复位,就会造成LED2闪烁,而LED3放在看门狗中断,每当喂一次狗就会对LED3状态进行反转。

31.4 实验步骤

31.4.1建立WWDG工程

首先我们打开STM32CubeIDE软件,进入软件界面之后,我们点击File属性,选择NEW下的STM32 Project的选项,如下图所示:

然后我们会进入下图所示界面:在Part Number选择框输入STM32MP157A,然后在右边的选择界面选择STM32MP157AAA,然后点击Next选项 

在Project Name框中输入工程名字WWDG,然后点击Finish选项即可,如下图所示:

等待工程创建完毕,会询问我们是否要安装OpenSTLinux ,由于我们是在windows环境下,所以我们不需要安装,点击NO即可 

至此我们的工程创建完毕,进入工程界面如下图所示界面: 

31.4.2 GPIO功能引脚配置

首先我们在下面的搜索框之中输入我们要配置的引脚,我们在这里以PE1为例进行搜索,输入名称之后,对应的引脚在工程中会闪烁,如下图所示:

然后我们使用鼠标左键点击对应的引脚会弹出PE1的复用功能选择,我们在这里选择复用为GPIO_Output功能,如下图所示: 

配置完复用功能之后,我们还要配置 Pin Reserved 选项如果不配置此项,在生成工程代码的时候将不会看到有关这个 Pin 的初始化代码。继续选中 PE1,右键弹出设置项我们选择Pin ReservedàCortex-M4。如下图所示: 

第二个LED的控制管脚PE14按同样的方法进行配置。

配置完成之后打开左侧菜单的 System CoreàGPIO 进入 GPIO 模式配置界面:如下图所示:

 

点击对应的引脚配置之后会弹出右下方的管脚配置界面,如上图所示:

在下方会列出要配置选项的具体说明和我们要进行的配置。

1)选项 GPIO output level 用来设置IO口的输出电平的高低,这这里我们选择LOW

2)选项GPIO mode 用来设置 IO 口输出模式为 Output Push Pull(推挽)还是 Output Open Drain(开漏)。本实验我们设置为推挽输出 Output Push Pull。

3)选项 GPIO Pull-up/Pull-down 用来设置 IO 口是上拉/下拉/没有上下拉。本实验我们设置为上拉(Pull-up)。

4)选项 Mzximum ouput speed 用来设置 IO 口输出速度为低速(Low)/中速(Medium)/高速 (Hign)/快速(Very High)。我们设置为高速 High 。

5)选项 User Label 是用来设置初始化的 IO 口 Pin 值为我们自定义的宏,这里我们填写为 LED3。按照如上要求设置后的界面如下(由于PE14的配置相同,只是最后的Label值不同,也在下方列了出来):

31.4.3 时钟与看门狗的配置

然后在Clock Configuration里我们选择 HSI,作为锁相环 PLL3P 的时钟源,在 MCU 子系统时钟里输入 209 并回车,软件会自动设置相应的倍频和分频,如下图所示:

设置完成之后,如下图所示,然后再手动配置 APB1DIV、APB2DIV 和 APB3DIV的分频值为 2。当 APB1DIV 的分频数大于 1 的时候,基本定时器的倍频器倍频值始终为 2,所以基本定时器的时钟频率为 209MHz。 

配置完成之后打开左侧菜单的 System Core,选择WWDG1,进入WWDG1配置界面,由于我们是对M4核心进行实验,所以我们对Cortex-M4进行勾选,然后勾选Activated对WWDG进行使能,配置WWDG

分频值为 128,计时器初始值为 127,窗口值为 84,并使能提前唤醒中断。

配置完成如下图所示:

最后在相同界面下,进入NVIC Settings 中断优先级设置界面,勾选Enabled,使能窗口看门狗中断,设置完成如下图所示: 

最后我们需要在Project Manage下的Code Generator选项下勾选 Generate peripheral initialization as a pair of ".c/.h' files per peripheral 选项,这样可以独立生成对应外设的初始化.h 和.c 文件(方便配置的查看),如下图所示:

31.4.3工程的生成与完善

在上述的步骤完成之后,按下键盘的Ctrl+S组合键保存保存 WWDG.ioc 文件,系统开始生成初始化代码,工程生成之后如下图所示:

 

然后我们进行工程的完善,以及添加对应的逻辑代码。

31.4.3.1 对应文件与文件夹的添加

首先在左侧的工程浏览页之中通过鼠标右键在WWDG_CM4的Core目录下创建名字为BSP的文件,具体步骤如下图所示:

由于我们LED章节已经完善了LED对应的文件,所以我们将“iTOP-STM32MP157开发板网盘资料汇总\06_Cortex-M4实验例程\01_LED\LED\CM4\Core\BSP”目录下对应的.c、.h文件拷贝到当前工程的BSP目录下,拷贝完成如下下图所示:

31.4.3.2 main.c文件的完善

我们要修改的main.c文件路径如下图所示:

打开main.c文件,为了规范我们在/* USER CODE BEGIN Includes */和/* USER CODE END Includes */之间添加以下内容

#include "../BSP/Include/led.h"

添加完成如下图所示:

 

然后在 MX_WWDG1_Init()上方,添加以下内容:

   LED2(0);

  HAL_Delay(500);

WWDG初始化之前让LED2的状态为熄灭。添加完成如下图所示:

 

然后在/* USER CODE BEGIN 3 */下添加以下逻辑代码

  LED2(1);

添加完成如下图所示:

进入while循环之后。设置LED2状态为亮起。随后main.c文件中加入WWCG的中断回调函数HAL_WWDG_EarlyWakeupCallback,当递减计数器从初始值 127 递减到 0X40(10 进制为 64)的时候就发生提前唤醒中断,我们就在中断中喂狗

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg) {

 HAL_WWDG_Refresh(&hwwdg1);

 LED3_TOGGLE();

}

添加完成之后如下图所示:

 

31.4.4工程的编译

在完成以上步骤之后我们点击工具栏的小锤子进行编译,编译图标如下图所示:

编译完成会在下方的终端中显示打印信息,如下图所示: 

如果报错,需要自己根据错误的提示信息来进行问题的寻找和改正。

31.5.5工程的调试

由于STM32MP157的裸机部分和一般的单片机有些区别,他没有内部的存储,所以只能在程序编译成功之后,通过debug的方式来进行调试(将程序放在内存之中),调试过程如下:

首先,点击菜单栏中的小甲虫Debug调试按钮,弹出以下界面,

在弹出来的界面,按步骤,选择响应的属性(该步骤为Jlink的步骤,如果是STLink,调试探头选择对应的即可)。如下图所示:

选择完成之后,点击右下角的Debug按钮,点击之后,会进行再一次的编译,编译完成之后会弹出如下内容(作者用的是J-LinK),这里弹出的是J-link关于设备的选择,不同调试器的弹窗可能会不同

在弹出来的界面中,选择Accept接受,会弹出以下内容,继续点击下方的OK。 

之后会来到设备选择界面,我们选择Cortex-M4,如下图所示:

选择Cortex-M4之后,点击右下角的OK,会弹出以下界面,选择右下角Switch. 

然后会弹出一个新的页面,选择菜单栏的 resume,按钮开始调试。 

此时,LED3在持续闪烁。

如果想关闭调试,则点击菜单栏的终止按钮即可。

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

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

相关文章

国外SIM卡有信号无法连接,如何解决?

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

[Java]SpringBoot能力进阶

配置优先级 SpringBoot中支持三种格式的配置文件 优先级: application.properties文件 > application.yml文件 > application.yaml文件 SpringBoot除了通过配置文件配置属性, 还支持Java系统属性和命令行参数的方式 进行属性配置 1.在IDEA中配置java系统属性和命令行参…

19、Python如何读写excel文件

在数据处理和分析时,经常使用Excel,而手动操作Excel可能非常繁琐和耗时。Python提供了许多强大的库和工具,可以方便地操作Excel文件。 在Python标准库中是不支持Excel读写的,我们要安装第三方库来实现。 在Python中操作Excel有多…

设计一个高质量的API接口:提升应用性能的关键步骤

在当今的软件开发世界中,API(应用程序编程接口)接口扮演着至关重要的角色。一个设计精良的API不仅能够提高开发效率,还能提升用户体验,并确保系统的可扩展性和安全性。本文将探讨如何设计一个高质量的API接口&#xff…

Golang | Leetcode Golang题解之第412题Fizz Buzz

题目&#xff1a; 题解&#xff1a; func fizzBuzz(n int) (ans []string) {for i : 1; i < n; i {sb : &strings.Builder{}if i%3 0 {sb.WriteString("Fizz")}if i%5 0 {sb.WriteString("Buzz")}if sb.Len() 0 {sb.WriteString(strconv.Itoa(i…

Davinci 大数据可视化分析

Davinci 大数据可视化分析 一、Davinci 架构设计1.1 Davinci定义1.2 Davinci 应用场景 二、Davinci 安装部署2.1 部署规划2.2 前置环境准备2.3 Davinci部署2.3.1 物料准备2.3.2 安装配置 2.4 环境变量配置2.5 初始化数据库2.5.1 创建数据库及用户 2.5.2 建表2.6 初始化配置 三、…

开源免费的NAS系统-TrueNAS CORE搭建和使用(保姆级教程)

TrueNAS CORE说明 TrueNASCORE(以前称为 FreeNAS)是世界上最受欢迎的存储操作系统,因为它使您能够构建自己的专业级存储系统,用于各种数据密集型应用程序,而无需任何软件成本。只需将其安装到硬件或虚拟机上,即可体验开源存储的真正存储自由。 TrueNAS提供了CORE和Ente…

如何用python构建简单神经网络?

今天&#xff0c;我们将运用Python来搭建一个简单的神经网络模型&#xff01;并深入浅出地探索其背后的运作原理。 多输入 提及神经网络时&#xff0c;我们可以将其视为一个高度灵活的函数来理解和应用。 为了做出准确的预测&#xff0c;我们需要构建能够同时组合多个输入的…

吸浮毛宠物空气净化器推荐,希喂、小米、有哈宠物空气净化器测评

养猫需谨慎&#xff0c;不然就要做猫奴一辈子啦&#xff01;上次堂妹来我家住几天&#xff0c;刚开始还担心和猫处不来&#xff0c;不敢去摸它&#xff0c;走的时候已经约好下次来看它的时间&#xff0c;笑死我了。毕竟猫咪这么可爱&#xff0c;很少有人可以抵抗它的魅力。 这不…

Zabbix 2024 中国峰会在上海举办,Databuff 携最业界领先研发成果重磅亮相

9月13日&#xff0c;Zabbix中国峰会在上海圆满结束。会上共进行了18场技术演讲&#xff0c;共有超过500人参加了本次盛会。 大会开始&#xff0c;Zabbix创始人Alexei Vladishev介绍了Zabbix7.0新功能以及未来的发展蓝图。 随后&#xff0c;乘云数字CEO向成钢分享了《如何打造开…

JVM 调优篇7 调优案例4- 线程溢出

一 线程溢出 1.1 报错信息 每个 Java 线程都需要占用一定的内存空间&#xff0c;当 JVM 向底层操作系统请求创建一个新的 native 线程时&#xff0c;如果没有足够的资源分配就会报此类错误。报错信息&#xff1a;java.lang.outofmemoryError:unable to create new Native Thr…

集群软件在linux上的安装

前置准备 为了保证各个服务器之间的正常通信&#xff0c;要完成集群化环境的前置准备&#xff0c;包括创建多台虚拟机&#xff0c;配置主机名映射&#xff0c;SSH免密登录等等。 配置多个虚拟机 配置多台Linux虚拟机 安装集群化软件&#xff0c;首要条件就是要有多台Linux服务…

web基础—dvwa靶场(四)​File Inclusion

File Inclusion(文件包含) 有些 web 应用程序允许用户指定直接文件流的输入&#xff0c;或允许用户将文件上载到服务器。稍后 web 应用程序访问 web 应用程序上下文中用户提供的输入。通过这样种操作&#xff0c;web 应用程序允许恶意文件执行。 如果选择要包含的文件是目标计…

【系统方案】智慧园区数字园区整体解决全套方案(PPT,Word原件等)

智慧园区建设要点可归纳为以下几点&#xff1a; 基础设施建设&#xff1a;构建高速、稳定的网络基础设施&#xff0c;部署物联网设备&#xff0c;实现园区内设备的互联互通&#xff0c;为智慧化应用提供基础支撑。 数据平台建设&#xff1a;建立统一的数据中心&#xff0c;整合…

Linux中安装maven

Linux中安装maven 1.下载2.安装3.配置环境变量4.maven相关配置 1.下载 下载地址&#xff1a;https://maven.apache.org/download.cgi 2.安装 指定位置上传压缩包&#xff1a; 解压&#xff1a; tar -zxvf apache-maven-3.9.5-bin.tar.gz修改解压缩后的文件名: mv apac…

c++刷题

17.电话号码的组合 来源于题解思路&#xff1a; 继承 CC14 KiKi设计类继承 #include <iostream> #include <memory> using namespace std; class Shape{ private:int x;int y; };class Rectangle:public Shape { public:Rectangle(int length,int width):Shape…

从AI应用排行榜选择AI产品(9月)

2024年9月13日&#xff0c;OpenAI公司宣布推出其全新的AI模型&#xff1a;o1&#xff0c;在数学、编程和科学问题的解决处理能力上取得了显著进步。该模型通过自我对弈强化学习&#xff08;Self-play RL&#xff09;和思维链&#xff08;Chain of Thought, CoT&#xff09;技术…

[C语言]连子棋游戏

文章目录 一、前言二、游戏思路三、游戏方法1、初始化2、判断胜利3、交互4、电脑下棋 四、核心方法说明1、初始化游戏2、销毁棋盘3、显示游戏4、电脑下棋5、用户下棋6、判断游戏状态7、游戏交互 五、游戏效果展示与源码分享1、游戏效果2、源代码 一、前言 对于指针和数组理解尚…

Qt:智能指针QScopedPointer 的使用(以及如何写一个QScopedPointer )

前言 本文讲述QScopedPointer 的使用&#xff0c;以及自己如何写一个QScopedPointer . 正文 QScopedPointer 的常用方法 以下是 QScopedPointer 的一些常用方法及其详细说明&#xff1a; 构造函数&#xff1a; QScopedPointer<T> ptr(new T);用于创建一个 QScopedPoi…

【C/C++】涉及string类的经典OJ编程题

【C/C】涉及string类的经典OJ编程题 一. 把字符串转化成整数&#xff08;atoi&#xff09;解法一&#xff1a;&#xff08;不用long&#xff09;完整代码&#xff1a;解法二&#xff1a;&#xff08;用long&#xff09; 二.字符串相加代码实现&#xff08;含注释&#xff09;&a…