主页 > 互联网 > 内容页

环球百事通!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位递减操作

标签: 使用条件 中断服务程序 预期效果

上一篇:
下一篇: