STM32入门学习笔记之看门狗实验(下)

发布时间:2024-03-25  

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_IRQHandler

Function  :窗口看门狗中断服务程序

Paramater  :None

Return    :None

***************************************************/

void WWDG_IRQHandler()

{

  WWDG->CR = 0x7F ;                                          //重设置7位计数器

  WWDG->SR = 0x00 ;                                          //清除提前唤醒中断标志位

  LED2 != LED2 ;

}

/***************************************************

Name    :WWDG_Init

Function  :窗口看门狗初始化

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_Init

Function  :LED初始化

Paramater  :None

Return    :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    :main

Function  :主函数

Parameter  :None

Return    :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位递减操作


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>