看门狗中断的问题

2019-07-20 12:23发布

  以下程序不知道为什么LED1的灯一直亮!!!我用的是窗口看门狗!!

#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#include "io_bit.h"
#include "systick.h"
#include "usart.h"
#include "string.h"
#include "stdio.h"
#include "exti.h"
#include "sw_exti.h"
#include "iwdg.h"
#include "wwdg.h"



void delay(u32 n)
{
        while(n--)
        {
                ;
        }
}


int main(void)
{       
        char data[100] = {0};
        led_init();          //初始化led
        //beep_init();       //初始化蜂鸣器
        key_init();                        //初始化key
        //systick_init_1us();   //滴答定时器启动,为1us
        //systick_init_nus(200);       //任意us系统滴答定时
        //systick_init_nms(200);      //任意ms系统滴答定时
        usart_1_init(84,9600);                //使能串口
        exti_init();                    //初始化外部中断
        sw_exti_init();           //初始化软件中断
        //iwdg_init(000,666);    //初始化独立看门狗
        wwdg_init(0,0x66,0x53);
        delay(100000);
        LED1 = 0 ;
        while(1)
        {       
                delay(1000000);
                LED1 = 0;
        }
}



#include "wwdg.h"
#include "led.h"


//该函数为窗口看门狗函数
/*
函数功能:实现窗口看门狗函数
形参: pr为分频值,win为窗口值,cnt为计数值
备注:我这里没有使用重新写入计数器的方法使其复位
*/
void wwdg_init(u8 pr,u8 win,u8 cnt)
{       
        uint32_t priority = 0;
        //初始化PCLK1的时钟
        RCC->APB1ENR |= 1 << 11;
       
        //配置WWDG相关的寄存器
       
        //配置看门狗计数器的值 -> 这个值是用来判断什么时候产生变化的

        //设置窗口值   必须大于0x40   小于0x7f   这里是7位
        WWDG->CFR &= (win);
       
        //设置分频
        WWDG->CFR |= (pr << 7);
       
        //设置计数值
        WWDG->CR &= (cnt);
       
        WWDG->CR |= 1 << 7;  //使能看门狗
       
        //中断使能
        WWDG->CFR |= 1 << 9;
       
        //设置NVIC
        NVIC_SetPriorityGrouping(7-2);//设置优先级分组
        priority = NVIC_EncodePriority(7-2,1,3);//设置优先级编码
        NVIC_SetPriority(WWDG_IRQn,priority); //优先级设置
        NVIC_EnableIRQ(WWDG_IRQn);
}
/*
函数功能:重新设置WWDG计数器的值
函数形参:计数器的值
*/
void wwdg_set_count(u8 cnt)
{
        WWDG->CR = (cnt & 0X7F);
}

/*
函数功能:WWDG看门狗中断服务函数
*/
void WWDG_IRQHandler(void)
{       
        wwdg_set_count(0x53);
        WWDG->SR &=~(1 << 0); //清除中断标志
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。