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份 ·

实验所需软件

  • MDK5 安装步骤

  • ST-LINK 驱动安装步骤

  • Git 软件下载(可选)

ST-Link下载器 & ST-Link下载器连接线

STLink下载器

STM32底座:HIVE PRO STM32是一种基于STM32F103C8T6芯片的蜂巢底座。

STM32底座

LED模块:LED模块共有四个按键,4个LED灯,可供完成流水灯、按键处理等相关实验。按键的触发为低电平,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();
}

常见问题

  1. 弹出警告窗口,不能下载程序。

    • 请确认STLink驱动、STM32F103C8的DFP包是否安装。
    • STLink仿真器是否正常接入。
  2. 下载代码后程序没观察到实验现象。

    • 请重新上电,或者按下底座上的复位按键。
    • 模块没有安装稳妥。

实验思考

  1. 实现代码自动喂狗,当按键S1按下后,停止喂狗。