环球百事通!STM32入门学习笔记之看门狗实验(下)
2023-02-16 12:13:20 来源:滑小稽笔记
14.4.2 窗口看门狗实验
功能:程序一运行使得接在PB5上的LED1亮300ms后关闭,进入死循环。等待WWDG中断的到来,在中断里面,喂狗,并对PE5上的LED2进行翻转操作。可以看到LED2不停的闪烁,LED1只在刚启动的时候闪一下。
【资料图】
(1)在上一个实验的wdg.h文件的函数列表区域添加以下代码。
void WWDG_Init( u8 tr, u8 wr, u8 fprer ) ; //窗口看门狗初始化
(2)在上一个实验的wdg.c文件末尾添加以下代码。
/***************************************************Name :WWDG_IRQHandlerFunction :窗口看门狗中断服务程序Paramater :NoneReturn :None***************************************************/void WWDG_IRQHandler(){ WWDG->CR = 0x7F ; //重设置7位计数器 WWDG->SR = 0x00 ; //清除提前唤醒中断标志位 LED2 != LED2 ;}/***************************************************Name :WWDG_InitFunction :窗口看门狗初始化Paramater : tr:计数器值 wr:窗口值 fprer:分频系数Return :None***************************************************/void WWDG_Init( u8 tr, u8 wr, u8 fprer ){ RCC->APB1ENR |= 1<<11 ; //使能wwdg时钟 WWDG->CFR |= fprer<<7 ; //PCLK1/4096再除2^fprer WWDG->CFR &= 0xFF80 ; WWDG->CFR |= wr ; //设定窗口值 WWDG->CR |= tr&0x7F ; //设定计数器值 WWDG->CR |= 1<<7 ; //开启看门狗 NVIC_Init( 2, 3, WWDG_IRQn, 2 ) ; //抢占2,子优先级3,组2 WWDG->SR = 0x00 ; //清除提前唤醒中断标志位 WWDG->CFR |= 1<<9 ; //使能提前唤醒中断}
注:由于在中断服务函数中引用了LED2,所以需要添加头文件#include “led.h”。
(3)创建led.h文件,并输入以下代码。
#ifndef _LED_H_#define _LED_H_#include "sys.h"/********************************************************************************************************* 硬 件 端 口*********************************************************************************************************/#define LED1 PBout( 5 ) //定义LED1端口#define LED2 PEout( 5 ) //定义LED2端口/********************************************************************************************************* 函 数 列 表*********************************************************************************************************/void LED_Init( void ) ; //LED初始化#endif
(4)创建led.c文件,并输入以下代码。
#include "led.h"/***************************************************Name :LED_InitFunction :LED初始化Paramater :NoneReturn :None***************************************************/void LED_Init(){ RCC->APB2ENR |= 1<<3 ; GPIOB->CRL &= 0xFF0FFFFF ; GPIOB->CRL |= 0x00300000 ; RCC->APB2ENR |= 1<<6 ; GPIOE->CRL &= 0xFF0FFFFF ; GPIOE->CRL |= 0x00300000 ; LED1 = 1 ; LED2 = 1 ;}
(5)在1.c文件中输入以下代码。
#include "sys.h"#include "delay.h"#include "usart1.h"#include "led.h"#include "wdg.h"/***************************************************Name :mainFunction :主函数Parameter :NoneReturn :None***************************************************/int main(){ STM32_Clock_Init( 9 ) ; //STM32时钟初始化 SysTick_Init( 72 ) ; //SysTick初始化 USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200 LED_Init() ; //LED初始化 LED1 = 0 ; //点亮DS0 delay_ms( 300 ) ; //延时300ms,让人可以看到DS0亮的状态 WWDG_Init( 0x7F, 0x5F, 3 ) ; //计数器值为7f,窗口寄存器为5f,分频数为8 while( 1 ) { LED1 = 1 ; //熄灭LED1 }}
14.5 为何STM32要同时存在窗口看门狗与独立看门狗
14.5.1 独立看门狗的使用条件
(1)程序跑飞
(2)出现死循环
(3)睡眠与休眠不合理
(4)外部主晶振损坏
(5)需要重新复位,且不保留任何数据
14.5.2 窗口看门狗使用条件
(1)软件逻辑出现错误
(2)死机或者死循环
(3)软件执行不按预期效果执行
(4)软件需要重新复位,但是保留所有数据
14.5.3 两者的区别
(1)独立看门狗使用内部专用40kHz低速时钟
窗口看门狗则使用PCLK1的时钟
(2)独立看门狗没有中断,超时直接复位
窗口看门狗有中断,超时可以在中断服务函数中操作或者喂狗
(3)独立看门狗一般用于避免程序跑飞或者死循环
窗口看门狗则是为了避免程序不按照预先设定的逻辑执行
(4)独立看门狗是12位递减操作
窗口看门狗则是6位递减操作
互联网
在单片机构成的微型计算机系统中,单片机的工作可能会受到外界的电磁干扰或者程序运行的BUG导致程序指针错误,或者其他错误导致的死循环,引发
2023-02-16 12:13:20
环球热推荐:步行者24分大逆转117-113胜公牛,德罗赞缺阵、拉文空砍35+11+7
今日NBA常规赛,芝加哥公牛客场挑战印第安纳步行者。两队一个东部第11、一个东部第12,都在争夺东部附加赛名额,是名副其实的“卡位战”。但公
2023-02-16 11:42:33
迁客骚人多会于此的会是什么意思
迁客骚人多会于此的会是什么意思,1、迁客骚人多会于此的会的意思是集中,聚集和会集的意思,句子中的会有两种聚集形式,第一种聚集的形式是有
2023-02-16 11:27:17