目录
一、实验目的
本实验旨在通过使用STM32F103ZET6单片机实现独立看门狗(Independent Watchdog,IWDG)功能,加深对STM32单片机看门狗原理及操作的理解,并掌握看门狗在嵌入式系统中的应用。
二、实验原理
2.1独立看门狗(IWDG)简介
首先我们得讲解一下看门狗的原理。这个百度百科里面有很详细的解释。我们总结一下:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。
STM32F103ZET6的独立看门狗(IWDG)是由内部LSI(内部约40KHZ低速时钟)时钟驱动的。由于IWDG是由内部低速时钟驱动,所以就算主时钟发生故障,IWDG依然能够工作。
由于LSI是一个内部RC时钟,所以时钟不是很准确的40KHZ,而是在30KHZ~60KHZ之间变化的时钟,所以IWDG时间的计算并不是很准确,只能是一个大概的值。一般用40KHZ来估算。
IWDG的计数器是一个递减计数器,当IWDG被激活后,计数器开始向下递减计数,当计数器计数至0x0000时产生复位信号,使芯片复位。
当芯片处于停止和待机模式下工作时,IWDG依然继续工作。
2.2独立看门狗应用场合
由于独立看门狗时钟源由LSI时钟提供,并不精确,所以IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。
2.3独立看门狗时钟
三、独立看门狗相关寄存器
3.1独立看门狗框图
3.2键寄存器(IWDG_KR)
①IWDR_KR寄存器是只写寄存器
②IWDR_KR写入0XAAAA,才算“喂狗”,且一定时间间隔必须写入,否则程序复位
③IWDR_KR写入0X5555表示允许访问IWDG_PR和IWDG_RLR寄存器,未写入时这两个寄存器处于保护状态,无法进行写操作
④IWDR_KR写入0XCCCC,启动看门狗
3.3预分频寄存器(IWDG_PR)
该寄存器是只有低3位有效的32位寄存器,之前的IWDG_KR寄存器中也强调过,要对IWDG_PR寄存器操作,必须先对IWDG_KR写入0x5555。
我们知道,独立看门狗的时钟是40KHZ的LSI,经过本寄存器设置预分频系数后,独立看门狗的时钟会变为40KHZ/预分频因子。
3.4重装载寄存器(IWDG_RLR)
该寄存器并不像SysTick定时器的重装载寄存器一样,该寄存器不需要手动装载初值,只需设置好装载值后,每次给IWDG_KR寄存器写入0xAAAA,即可装载初值。
3.5状态寄存器(IWDG_SR)
该寄存器只有位0和位1有效,位0指示预分频值更新、位1指示重装载值更新;置1时表示正在更新,置0时表示更新完成。
四、代码展示
4.1 main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "wdg.h"
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //按键初始化
delay_ms(500); //让人看得到灭
IWDG_Init(4,625); //与分频数为64,重载值为625,溢出时间为1s
LED0=0; //点亮LED0
while(1)
{
if(KEY_Scan(0)==WKUP_PRES)
{
IWDG_Feed();//如果WK_UP按下,则喂狗
}
delay_ms(10);
};
}
4.2 wdg.c
#include "wdg.h"
//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作
IWDG_SetPrescaler(prer); //设置IWDG预分频值:设置IWDG预分频值为64
IWDG_SetReload(rlr); //设置IWDG重装载值
IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG_Enable(); //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//reload
}
4.3 wdg.h
#ifndef __WDG_H
#define __WDG_H
#include "sys.h"
void IWDG_Init(u8 prer,u16 rlr);
void IWDG_Feed(void);
#endif
五、实验结果
实验效果如下面视频所示:
不按键时led灯闪烁;当WK_UP按下,则喂狗。
独立看门狗
六、心得体会
通过本次实验,我深入了解了STM32F103ZET6单片机的独立看门狗(IWDG)功能及其应用原理。掌握了独立看门狗的配置方法和使用技巧,对于提高嵌入式系统的稳定性和可靠性有了更深入的认识。通过实验,我意识到了独立看门狗在嵌入式系统中的重要性,以及如何在实际项目中合理地应用独立看门狗功能。在以后的实际开发中,我将更加注重系统的稳定性设计,充分利用独立看门狗等硬件保护机制,确保系统的可靠运行。