天天看点

ARM开发(8)基于STM32的窗口看门狗

基于STM32的窗口看门狗
           

一 窗口看门狗原理:

1.1 本实验实现STM32的窗口看门狗
1.2 实验思路:理解STM32窗口看门狗原理,根据其原理写驱动。
1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真 
           

二 实验步骤:

2.1 wwdg.h代码:

#ifndef __WWDG_H
#define __WWDG_H
#include "sys.h"
void WWDG_Init(u8 tr,u8 wr,u32 fprer);//初始化WWDG
void WWDG_Set_Counter(u8 cnt);       //设置WWDG的计数器
void WWDG_NVIC_Init(void); //中断
#endif
           

2.2 wwdg.c代码(窗口看门狗初始化):

#include "wwdg.h"
#include "beep.h"
//保存WWDG计数器的设置值,默认为最大. 
u8 WWDG_CNT=0x7f; 
//初始化窗口看门狗  
//tr   :T[6:0],计数器值 
//wr   :W[6:0],窗口值 
//fprer:分频系数(WDGTB),仅最低2位有效 
//Fwwdg=PCLK1/(4096*2^fprer). 
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{ 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);  //   WWDG时钟使能

    WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.   
    WWDG_SetPrescaler(fprer);设置IWDG预分频值
    WWDG_SetWindowValue(wr);//设置窗口值
    WWDG_Enable(WWDG_CNT);   //使能看门狗 ,  设置 counter .                  
    WWDG_ClearFlag();//清除提前唤醒中断标志位 
    WWDG_NVIC_Init();//初始化窗口看门狗 NVIC
    WWDG_EnableIT(); //开启窗口看门狗中断
} 
//重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{
    WWDG_Enable(cnt);//使能看门狗 ,  设置 counter .     
}
//窗口看门狗中断服务程序
void WWDG_NVIC_Init()
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;    //WWDG中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   //抢占2,子优先级3,组2  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   //抢占2,子优先级3,组2 
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 
    NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}

void WWDG_IRQHandler(void)
    {

    WWDG_SetCounter(WWDG_CNT);    //当禁掉此句后,窗口看门狗将产生复位

    WWDG_ClearFlag();     //清除提前唤醒中断标志位

    BEEP =!BEEP ;

    }
           

2.2 main.c代码(实现窗口看门狗,蜂鸣器,TM1629A led灯检测效果):

#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "wwdg.h"
#include "keyled.h"
#include "beep.h"
 int main(void)
 {  

    u8   seg88Code[16]={0x3f, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0X7C, 0x39, 0x5E, 0x79, 0x71};
    delay_init();            //延时函数初始化    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    uart_init(115200);   //串口初始化为115200

    KEY_Init();
    Initial_LED();   //按键初始化     
     BEEP_Init();
    DisplayOn(1);
    Display(seg88Code);                                              
    delay_ms(200);    
    WWDG_Init (0X7F,0X5F,WWDG_Prescaler_8);//计数器值为7f,窗口寄存器为5f,分频数为8    
    while(1)
    {
    DisplayOn(0);          
   }   
}
           

三 接线测试:

3.1 与板子接线测试效果良好,独立看门狗效果良好,tm1629数码管显示,然后熄灭,蜂鸣器间隔鸣叫。