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.5Mhz,104.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在持续闪烁。
如果想关闭调试,则点击菜单栏的终止按钮即可。