前言:
眼前大家对“独立看门狗的应用”都比较关心,咱们都想要学习一些“独立看门狗的应用”的相关资讯。那么小编在网摘上搜集了一些关于“独立看门狗的应用””的相关知识,希望你们能喜欢,大家一起来学习一下吧!IWDG独立看门狗
实验目的掌握STM32独立看门狗(IWDG)原理及配置。掌握启动IWDG后防系统复位的程序设计。实验内容编写程序观察开启IWDG及时喂狗系统正常运行的现象。编写程序观察开启IWDG未及时喂狗系统复位的现象。独立看门狗原理单片机看门狗简介
在工业控制/汽车电子/航空肮天等需要高可靠性的系统中,为了防止“系统在异常情况下,受到干扰,MCU/CPU程序跑飞,导致系统长时间异常工作”的情况发生,而设计了一种用于检测程序运行状态的芯片或电路,俗称看门狗(即Watchdog)。
看门狗有一个输入信号和一个输出信号。输入信号也称“喂狗”,输出信号关联MCU的复位端。系统运行后启动看门狗计数器,看门狗开始计数,当计数满后未收到清零信号(喂狗),看门狗计数器溢出,触发看门狗中断,输出控制MCU复位。
看门狗可分为独立于单片机芯片外的看门狗芯片和集成于单片机芯片内的看门狗外设两种。按照工作原理,独立看门狗和窗口看门狗是最为常见的两种看门狗类型。
注:以上描述是针对看门狗的通用性描述,不同型号的单片机看门狗可能会有差异。STM32独立看门狗原理介绍
STM32F103系列MCU内置两个看门狗外设(独立看门狗和窗口看门狗),提供了更高的安全性、时间的精确性和使用的灵活性。
独立看门狗IWDG(全称是Independent watchdog)最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。
STM32F103系列MCU独立看门狗原理框图如下图:
图1:独立看门狗原理框图
注:在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要在键寄存器IWDG_KR中写入0xAAAA, IWDG_RLR中的值就会被重新加载到计数器,从而避免产生看门狗复位。IWDG独立看门狗超时时间计算
图2:独立看门狗超时计算公式
注:RLR表示重装载值(低11位有效),PRER表示预分频系数值(范围是0~6)。例如,按RLR为625、PRER为4来计算可得IWDG看门狗超时时间为1000ms即1s。IWDG独立看门狗配置步骤
图3:独立看门狗配置步骤
软件设计IWDG寄存器汇集
STM32F103提供了4个用于操作IWDG的寄存器,如下表所示:
表1:IWDG相关寄存器
序号
寄存器名
读/写
功能描述
1
IWDG_KR
只写
键寄存器。
2
IWDG_PR
读/写
预分频寄存器。
3
IWDG_RLR
读/写
重装载寄存器。
4
IWDG_SR
只读
状态寄存器。
每一种寄存器详细的描述在这里不做具体的介绍,大家可以参考目录:“第1部分:开发板硬件资料”“2 - 芯片资料”中“STM32英文参考手册_V15”或“STM32中文参考手册_V10”对应的IWDG章节的寄存器部分认真研读。
IWDG库函数汇集
ST官方提供的最终库函数版本是V3.5版本,该版本库函数提供了6个与IWDG操作有关的库函数,如下表所示:
表2:IWDG相关库函数汇集
序号
函数名
功能描述
1
IWDG_WriteAccessCmd
使能或者失能对寄存器IWDG_PR和IWDG_RLR的写操作。
2
IWDG_SetPrescaler
设置IWDG预分频值。
3
IWDG_SetReload
设置IWDG重装载值。
4
IWDG_ReloadCounter
按照IWDG重装载寄存器的值重装载IWDG计数器。
5
IWDG_Enable
使能IWDG。
6
IWDG_GetFlagStatus
检查指定的IWDG标志位被设置与否。
注:关于IWDG预分频值和IWDG超时时间计算公式的预分频系数值PRER是两个不同的概念。
关于函数void IWDG_SetPrescaler(u8 IWDG_Prescaler)的入参取值决定了IWDG预分频系数值,它们之间有一个对应关系,如下表所示。
表3:函数IWDG_SetPrescaler入参 IWDG_Prescaler取值
序号
IWDG_Prescaler值
功能描述
对应PRER值
1
IWDG_Prescaler_4
设置IWDG预分频值为4。
IWDG预分频系数值为0。
2
IWDG_Prescaler_8
设置IWDG预分频值为8。
IWDG预分频系数值为1。
3
IWDG_Prescaler_16
设置IWDG预分频值为16。
IWDG预分频系数值为2。
4
IWDG_Prescaler_32
设置IWDG预分频值为32。
IWDG预分频系数值为3。
5
IWDG_Prescaler_64
设置IWDG预分频值为64。
IWDG预分频系数值为4。
6
IWDG_Prescaler_128
设置IWDG预分频值为128。
IWDG预分频系数值为5。
7
IWDG_Prescaler_256
设置IWDG预分频值为256。
IWDG预分频系数值为6。
注:关于预分频寄存器(IWDG_PR)的低3位PR[2:0]为111和110时对应的预分频值都是256。
其他库函数详细的描述在这里不做具体的介绍,大家可以参考目录:“第1部分:开发板硬件资料”--->“2 - 芯片资料”中“STM32固件库使用手册的中文翻译版”对应的IWDG章节的库函数部分认真研读。
IWDG独立看门狗实验(及时喂狗)注:本节对应的实验源码是:“实验2-7-1:IWDG独立看门狗(及时喂狗)”。新建工程可以参阅《1-5:使用标准库新建工程模板》工程需要用到的库文件
本例需要用到的c文件如下表所示,工程需要添加下表中的c文件。
表4:实验需要用到的c文件
序号
文件名
后缀
功能描述
1
stm32f10x_rcc
.c
复位与时钟控制器。
2
stm32f10x_gpio
.c
通用输入输出。
3
stm32f10x_iwdg
.c
独立看门狗。
按下图所示将需要的c文件添加到工程。
图4:在新建工程中添加所需库函数c文件
头文件引用和路径设置需要引用的头文件
因为在“main.c”文件中使用了标准库和我们自己建的软件延时函数,所以需要引用下面的头文件。
#include "stm32f10x.h"//delay这里报错的原因是:delay函数用汇编实现的,导致了MDK误报。#include "delay.h"需要包含的头文件路径
本例需要包含的头文件路径如下表:
表5: 头文件包含路径
序号
路径
描述
1
..\Lib\F10x_FWLIB\inc
标准库头文件路径。
2
..\User
stm32f10x_conf.h头文件在该路径,所以要包含。
3
..\User\bsp
自建的板卡相关的驱动文件路径。
MDK中点击魔术棒,打开工程配置窗口,按照下图所示添加头文件包含路径。
图5:添加头文件包含路径
编写代码
首先是调用库函数完成独立看门狗IWDG的初始化配置,即使能对寄存器IWDG_PR和IWDG_RLR的写操作,配置IWDG重装载值,配置IWDG预分频值,重装载计数值喂狗,启动开门狗。IWDG预分频值为64,则由表3可知IWDG预分频系数值为4,再由IWDG超时计算公式可计算出超时时间为1s。
代码清单:初始化配置独立看门狗IWDG
/****************************************************************************** 描 述 : 初始化独立看门狗IWDG* 入 参 : 无* 返回值 : 无*****************************************************************************/void IWDG_Init(void){IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作IWDG_SetReload(625); //配置IWDG重装载值为625IWDG_SetPrescaler(IWDG_Prescaler_64); //配置IWDG预分频值为64IWDG_Feed(); //重装载计数值喂狗IWDG_Enable(); //启动开门狗}
然后需要知道喂狗是通过重装载计数器实现的,喂狗函数如下:
代码清单:喂狗函数
/******************************************************************************** 描 述 : 喂狗* 入 参 : 无* 返回值 : 无******************************************************************************/void IWDG_Feed(void){IWDG_ReloadCounter(); //重装载计数值喂狗}
最后,在主函数中加入延时以模拟代码运行时间,观察在小于1s的时间间隔内喂狗,会不会出现指示灯D1不停闪烁的现象。
代码清单:主函数
int main(void){/*一旦没有在配置的独立看门狗超时时间内喂狗,则系统会复位,会重新执行下面的语句*///初始化用于驱动指示灯D1、D2、D3、D4的引脚,并熄灭4个用户LEDleds_init();//初始化独立看门狗IWDG,配置独立看门狗超时时间为1sIWDG_Init();
//软件延时500ms,该500ms已经占用了独立看门狗超时时间1s中的500mssw_delay_ms(500);//点亮开发板指示灯D1led_on(LED_1);
//主循环while(1){//软件延时400ms,该延时是模拟喂狗前实际执行用户应用代码所用时长sw_delay_ms(400);//喂狗IWDG_Feed();//软件延时400ms,该延时是模拟喂狗后实际执行用户应用代码所用时长sw_delay_ms(400);}}实验步骤解压“…\第3部分:标准库教程和实验源码\ 1 - 基础实验程序\”目录下的压缩文件“实验2-7-1:IWDG独立看门狗(及时喂狗)”,将解压后得到的文件夹拷贝到合适的目录,如“D\STM32F103ZET6”。启动MDK5.23。在MDK5中执行“Project→Open Project”打开“…\IWDG\projec”目录下的工程“IWDG.uvproj”。点击编译按钮编译工程。注意查看编译输出栏,观察编译的结果,如果有错误,修改程序,直到编译成功为止。编译后生成的HEX文件“IWDG.hex”位于工程目录下的“Objects”文件夹中。点击下载按钮下载程序 。如果需要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。程序运行后,可以观察到D1指示灯常亮。(说明单片机没有复位重启)IWDG独立看门狗实验(未及时喂狗)注:本节的实验源码是在“实验2-7-1:IWDG独立看门狗(及时喂狗)”的基础上修改。本节对应的实验源码是:“实验2-7-2:IWDG独立看门狗(未及时喂狗)”。工程需要用到的库文件
本实验需要用到的c文件以及添加头文件包含路径的方法与介绍“实验2-7-1:IWDG独立看门狗(及时喂狗)”完全一样,在此不再赘述。
编写代码
关于独立看门狗IWDG的初始化配置和喂狗的函数设计与“实验2-7-1:IWDG独立看门狗(及时喂狗)”完全一样,在此不再赘述。
下面介绍下主函数部分,使用延时函数实现的延时时间不一样,观察在大于1s的时间间隔内喂狗,指示灯D1会出现什么实验现象。
代码清单:主函数
int main(void){/*一旦没有在配置的独立看门狗超时时间内喂狗,则系统会复位,会重新执行下面的语句*///初始化用于驱动指示灯D1、D2、D3、D4的引脚,并熄灭4个用户LEDleds_init();//初始化独立看门狗IWDG,配置独立看门狗超时时间为1sIWDG_Init();
//软件延时500ms,该500ms已经占用了独立看门狗超时时间1s中的500mssw_delay_ms(500);//点亮开发板指示灯D1,该语句也会占用独立看门狗的超时时间led_on(LED_1);
//主循环while(1){//软件延时510ms,该延时是模拟喂狗前实际执行用户应用代码所用时长sw_delay_ms(510);//喂狗IWDG_Feed();//软件延时510ms,该延时是模拟喂狗后实际执行用户应用代码所用时长sw_delay_ms(510);}}实验步骤解压“…\第3部分:标准库教程和实验源码\ 1 - 基础实验程序\”目录下的压缩文件“实验2-7-1:IWDG独立看门狗(及时喂狗)”,将解压后得到的文件夹拷贝到合适的目录,如“D\STM32F103ZET6”。启动MDK5.23。在MDK5中执行“Project→Open Project”打开“…\IWDG\projec”目录下的工程“IWDG.uvproj”。点击编译按钮编译工程。注意查看编译输出栏,观察编译的结果,如果有错误,修改程序,直到编译成功为止。编译后生成的HEX文件“IWDG.hex”位于工程目录下的“Objects”文件夹中。点击下载按钮下载程序 。如果需要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。程序运行后,可以观察到D1指示灯闪烁。(说明单片机不断在复位重启)
标签: #独立看门狗的应用