一、WWDG简介(了解)
WWDG有什么作用?
二、WWDG工作原理(熟悉)
三、WWDG框图(熟悉)
四、WWDG寄存器(熟悉)
控制寄存器 (WWDG_CR)
配置寄存器 (WWDG_CFR)
状态寄存器 (WWDG_SR)
五、WWDG超时时间计算(掌握)
WWDG最短最长超时时间(F1为例)
六、WWDG配置步骤(掌握)
HAL_WWDG_Init()
HAL_WWDG_MspInit() //配置NVIC、CLOCK等
HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
WWDG_IRQHandler() 、HAL_WWDG_IRQHandler
HAL_WWDG_EarlyWakeupCallback()
HAL_WWDG_Refresh()
相关HAL库函数介绍
七、编程实战:验证窗口看门狗功能(掌握)
wdg.c
#include "./BSP/WDG/wdg.h"
#include "./BSP/LED/led.h"
/************************以下是窗口看门狗代码********************************/
WWDG_HandleTypeDef g_wwdg_handle; /* WWDG句柄 */
/**
* @brief 初始化窗口看门狗
* @param tr: T[6:0],计数器值
* @param tw: W[6:0],窗口值
* @param fprer:分频系数(WDGTB),范围:WWDG_PRESCALER_1~WWDG_PRESCALER_8,表示2^WDGTB分频
* Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=36Mhz
最大-最小超时时间参考 RM0008或者《STM32F10xxx参考手册》P321
* @retval 无
*/
void wwdg_init(uint8_t tr, uint8_t wr, uint32_t fprer)
{
g_wwdg_handle.Instance = WWDG;
g_wwdg_handle.Init.Prescaler = fprer; /* 设置分频系数 */
g_wwdg_handle.Init.Window = wr; /* 设置窗口值 */
g_wwdg_handle.Init.Counter = tr; /* 设置计数器值 */
g_wwdg_handle.Init.EWIMode = WWDG_EWI_ENABLE; /* 使能窗口看门狗提前唤醒中断 */
HAL_WWDG_Init(&g_wwdg_handle); /* 初始化WWDG */
}
/**
* @brief WWDG MSP回调
* @param WWDG句柄
* @note 此函数会被HAL_WWDG_Init()调用
* @retval 无
*/
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
__HAL_RCC_WWDG_CLK_ENABLE(); /* 使能窗口看门狗时钟 */
HAL_NVIC_SetPriority(WWDG_IRQn, 2, 3); /* 抢占优先级2,子优先级为3 */
HAL_NVIC_EnableIRQ(WWDG_IRQn); /* 使能窗口看门狗中断 */
}
/**
* @brief 窗口看门狗中断服务程序
* @param 无
* @retval 无
*/
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&g_wwdg_handle); /* 调用WWDG共用中断处理函数 */
}
/**
* @brief 窗口看门狗喂狗提醒中断服务回调函数
* @param wwdg句柄
* @note 此函数会被HAL_WWDG_IRQHandler()调用
* @retval 无
*/
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(&g_wwdg_handle); /* 更新窗口看门狗值 */
LED1_TOGGLE(); /* LED1闪烁 */
}
wdg.h文章来源:https://www.toymoban.com/news/detail-834853.html
#ifndef __WDG_H
#define __WDG_H
#include "./SYSTEM/sys/sys.h"
void wwdg_init(uint8_t tr, uint8_t wr, uint32_t fprer);
#endif
main.c文章来源地址https://www.toymoban.com/news/detail-834853.html
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/WDG/wdg.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
LED0(0); /* 点亮LED0 红灯 */
delay_ms(300); /* 延时300ms再初始化看门狗,LED0的变化"可见" */
wwdg_init(0X7F, 0X5F, WWDG_PRESCALER_8);/* 计数器值为7f,窗口寄存器为5f,分频数为8 */
while (1)
{
LED0(1); /* 关闭红灯 */
}
}
八、IWDG和WWDG的主要区别(熟悉)
到了这里,关于stm32——hal库学习笔记(WWDG)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!