基于野火stm32F407开发板实现窗口看门狗
本文介绍了STM32F4窗口看门狗(WWDG)的实现方法。通过创建工程目录和三个关键文件(bsp_wwdg.c、bsp_wwdg.h、main.c),详细说明了WWDG的配置流程。代码实现了WWDG的中断配置、时钟使能、窗口值和计数器设置等功能,并在主程序中通过LED状态变化展示喂狗操作。编译成功后烧录到开发板验证功能,当计数器值低于窗口值时执行喂狗操作,确保系统正常运行。该实现包含了NVIC中断
1.创建工程目录如下:
2.创建bsp_wwdg.c,bsp_wwdg.h,main.c这三个文件
bsp_wwdg.c代码如下:
#include "./wwdg/bsp_wwdg.h"
static uint8_t wwdg_cnt;
static void WWDG_NVIC_Config(void)
{
//定义NVIC结构体
NVIC_InitTypeDef NVIC_InitStructure;
//给NVIC选择优先组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//编写NVIC结构体成员
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void WWDG_Config(uint8_t tr,uint8_t wr,uint32_t prv)
{
wwdg_cnt = tr;
//开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
//设置预分频器的值
WWDG_SetPrescaler(prv);
//设置窗口值
WWDG_SetWindowValue(wr);
//设置计数器的值,使能WWDG
WWDG_Enable(tr);
//清除提前唤醒中断标志位
WWDG_ClearFlag();
//配置WWDG中断优先级
WWDG_NVIC_Config();
//唤醒中断
WWDG_EnableIT();
}
void WWDG_Feed_Config(void)
{
WWDG_SetCounter(wwdg_cnt);
}
bsp_wwdg.h代码如下:
#ifndef __WWDG_H
#define __WWDG_H
#include "stm32f4xx.h"
void WWDG_Config(uint8_t tr,uint8_t wr,uint32_t prv);
void WWDG_Feed_Config(void);
#endif /* __WWDG_H */
main.c代码如下:
#include "stm32f4xx.h"
#include "./led/bsp_led.h"
#include "./wwdg/bsp_wwdg.h"
void Delay(__IO u32 nCount);
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
uint8_t wwdg_tr,wwdg_wr;
/* LED 端口初始化 */
LED_GPIO_Config();
LED3(ON);
Delay(0xFFFFFF);
//初始化WWDG
WWDG_Config(127,80,WWDG_Prescaler_8);
//设置窗口值为0x5f
wwdg_wr = WWDG->CFR & 0X7F;
/* 控制LED灯 */
while (1)
{
LED3(OFF);
wwdg_tr = WWDG->CR & 0X7F;
if(wwdg_tr<wwdg_wr)
{
WWDG_Feed_Config();
}
}
}
void Delay(__IO uint32_t nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}
3.编译工程成功,烧录进开发板,如图所示:
更多推荐
所有评论(0)