STM32 独立看门狗实验
- 编写一个程序,实现LED闪烁一次后常亮,然后给这个程序添加独立看门狗。
实验目的
- 了解STM32独立看门狗的工作原理。
- 了解看门狗的作用。
- 学会给自己的程序添加看门狗。
实验环境
实验所需硬件
序号 | 名称 | 数量 | 备注 |
---|---|---|---|
1 | 电脑 | 1台 | 电脑安装有Keil 5和ST-Link驱动 |
2 | STM32底座模块 | 1个 | · |
3 | LED模块 | 1个 | · |
4 | ST-Link下载器 | 1个 | · |
5 | ST-Link下载器连接线 | 1根 | · |
6 | 配套独立看门狗实验代码 | 1份 | · |
实验所需软件
ST-Link下载器 & ST-Link下载器连接线
STM32底座:HIVE PRO STM32是一种基于STM32F103C8T6芯片的蜂巢底座。
LED模块:LED模块共有四个按键,4个LED灯,可供完成流水灯、按键处理等相关实验。按键的触发为低电平,LED灯低电平点亮。
实验要求
Duration:3
- 理解STM32片上独立看门狗的工作流程;
- 掌握独立看门狗相关寄存器的功能以及配置方法;
- 能够给自己的程序添加看门狗。
实验原理
0
看门狗介绍
STM32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG,提供了更高的安全性、时间的精确性和使用的灵活性。看门狗主要用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
独立看门狗的特点是:由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。但40K低速时钟并不是一个精确的,而是在30~60Khz之间变化的。它的优点是:即使CPU主晶振停止工作,即使CPU进入了休眠模式,看门狗也可以生效。当CPU进入休眠模式并且是深度休眠的时候,看门狗可以作为一个CPU的定时唤醒闹钟,以达到超低功耗的同时还能定时醒来。看门狗由于最大可以分频到256,看门狗定时器最大可以设置到0xfff,所以最长的喂狗时间是26秒。独立看门狗限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。
独立看门狗工作原理:往键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗,此时计数器开始从其复位值0xFFF递减计数,当计数器计数到末尾0x000的时候,会产生一个复位信号(IWDG_RESET).无论何时,只要寄存器IWDG_KR中被写入0xAAAA,重装载寄存器IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。
独立看门狗启动过程如下:
- 向IWDG_KR中写入0X5555,取消寄存器写保护。
这一步取消了IWDG_PR和IWDG_RLR的写保护,下一步设置它们的初值: 计算看门狗的喂狗时间(看门狗溢出时间)计算公式:
Tout=((42^prer)rlr)/40
其中Tout就是看门狗溢出时间(单位ms),prer是看门狗时钟预分频值(IWDG_PR值),范围为0~7,rlr为看门狗重载值(IWDG_RLR)。
比如设置prer为4,rlr的值为625,就可以计算得到Tout=64*625/40=1000ms,这样,看门狗的溢出时间就是1S,只要在这一秒钟内,有一次写入0xAAAA到IWDG_KR,就不会导致看门狗复位(写入多次也是可以的)(由于看门狗的时钟不是准确40Khz,所以喂狗不要太迟,以免发生看门狗复位)。
- 向IWDG_KR中写入0xAAAA,重载计数值喂狗。
通过这句可以将重载寄存器(IWDG_RLR)中的计数初值载入到看门狗计数器中(也可以使用该命令喂狗)。
- 向IWDG_KR中写入0XCCCC,启动看门狗。
通过这句代码就启动了STM32的看门狗了,使能了看门狗,在程序里面就必须间隔一定的时间喂狗,否则导致程序复位。
实验步骤
① LED模块安装于STM32底座上,ST-Link连接底座与计算机。如下图:
② 访问github,进入github界面后点击Code,Clone HTTPS安全链接,如下图所示:
③ 打开电脑终端,进入工作目录workspace (workspace 为工程文件夹所在目录):
cd workspace
④ 运行clone
命令:
git clone https://github.com/aiotcom/eps.git
下载目录至指定文件夹下。
如果提示“command not found”表示电脑没有安装Git,请至Git官网下载。
如果电脑没有安装 Git 软件,也可以进入Github,点击 Code
-> DownLoad ZIP
下载所有工程代码。如下图所示:
如果电脑没有公网,可以进:D盘\实验教程与代码选择相应的代码。
⑤ 打开 Keil 5 工程软件,点击工具栏: ` Project ->
Open Project,选择工程文件:
STM32基础实验\6.独立看门狗实验\USER\IWDG.uvprojx` 并打开。
如果没有安装该软件,请至Keil官网下载。
⑥ 工程启动后,点击 Rebuild
重新编译。如下图:
⑦ 编译成功,如下图:
⑧ 点击 Download
按钮下载程序,如下图所示:
⑨ 下载完成后,将USB线进行重连操作(即:将STLink的USB线从底座上取下,再重新接上)。
⑩ 程序开始运行时,如果没有按下按键S1,LED功能模块上的四个LED会整体间隔1秒闪烁,这是因为看门狗复位了。
⑪ 快速按下按键S1进行喂狗操作,单片机不会复位,LED会保持常亮效果。如果停止按下按键S1,单片机1秒内会发生复位。
代码讲解
① 程序目录结构,如下图。CORE文件夹为STM32内核代码,HALLIB文件文件夹为底层HAL库文件。我们主要关心main.c及HARDWARE中的代码。
② main.c中进行硬件(LED、按键)的初始化、初始化看门狗设置看门狗复位时间1s。
int main(void)
{
HAL_Init();//初始化HAL库
LED_Init();//初始化LED
KEY_Init();//初始化按键
IWDG_Init(IWDG_PRESCALER_64,500);//分频数为64,重载值为500,溢出时间为1s
HAL_Delay(500);
while(1)
{
LED_ON();//四个LED全部保持常亮
if(KEY_Scan(1)==S1_PRES){//如果按下按键S1按下,执行喂狗操作
IWDG_Feed();//喂狗
}
}
}
③ LED.c为LED驱动代码,代码实现对LED3灯控制的IO进行初始化设置IO口为推挽上拉模式。重点不要忘记使用能IO接口的时钟及设置输出的速度。
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE();//开启GPIOA时钟
GPIO_Initure.Pin=LED1_PIN|LED2_PIN|LED3_PIN|LED4_PIN;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;//推挽输出
GPIO_Initure.Pull=GPIO_PULLUP;//上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH;//高速
HAL_GPIO_Init(LED_PORT,&GPIO_Initure);
LED_OFF();
}
常见问题
-
弹出警告窗口,不能下载程序。
- 请确认STLink驱动、STM32F103C8的DFP包是否安装。
- STLink仿真器是否正常接入。
-
下载代码后程序没观察到实验现象。
- 请重新上电,或者按下底座上的复位按键。
- 模块没有安装稳妥。
实验思考
- 实现代码自动喂狗,当按键S1按下后,停止喂狗。