单片机学习小组
直播中

宜家

8年用户 1077经验值
私信 关注

窗口看门狗的寄存器和HAL库函数该怎样去配置呢

怎样去设置IWDG独立看门狗的喂狗时间呢?

窗口看门狗的寄存器和HAL库函数该怎样去配置呢?

回帖(1)

刘恩彤

2022-2-11 15:23:01
1. IWDG独立看门狗概述




  • 用于检测由外部干扰或不可预见的逻辑条件件造成的应用程序背离正常的运行序列而产生的软件故障。
  • 喂狗时间有上下限的范围。下限固定,通过设定相关的寄存器,设定上限时间。喂狗的时间不能过早也不能过晚。

  • 时钟来源于APB1总线时钟,经过预分频器产生时钟给递减计数器。
  • 看门狗复位:


    • 喂狗的时候,计数器的值 > 设定值W[6:0]
    • 计数器的数值从0x40减到0x3F(下限)(T6位跳变为0)
      若启动了看门狗并且允许中断,当递减计数器 = 0x40,产生早起唤醒中断(EWI),它可以用于启动喂狗,以避免WWDG复位。


  • 窗口看门狗超时时间
    Twwdg=(40962^WDGTB(T[5:0]+1))/Fpclk1;
    Fpclk1: APB1的时钟频率(KHz)
    WDGTB:WWDG的预分频系数
    T[5:0]:窗口看门狗的计数器低6位
  • 注意



    • 上限窗口值W[6:0]必须大于下限窗口值0x40。
    • 窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。


2. 寄存器和HAL库函数配置



  • 寄存器


    • 控制寄存器WWDG_CR
    • 配置寄存器 WWDG_CFR

    • 状态寄存器WWDG_SR


  • 一般配置步骤


    • 使能窗口看门狗时钟HAL_WWDG_Msplnit
    • 初始化窗口看门狗:设置分频系数,窗口值,技术值等HAL_WWDG_Init,此函数还能使能窗口看门狗提前唤醒中断
    • 设置提前唤醒中断优先级HAL_WWDG_MspInit
    • 编写提前唤醒中断处理函数,喂狗;HAL_WWDG_EarlyWakeuoCallback(); HAL_WWDG_Refresh();


  • WWDG操作HAL库函数


HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);//初始化函数,分频系数等
void HAL_WWDG_MspInit(WWDG_HandleTypeDef*hwwdg);//初始化回调函数
HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef*hwwdg);//启动看门狗
HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef*hwwdg);//开启提前唤醒中断
HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef*hwwdg);//喂狗,配置CR寄存器
void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef*hwwdg);//初始化回调函数,中断处理
void HAL_WWDG_EarlyWakeuoCallback(WWDG_HandleTypeDef*hwwdg);//初始化提前唤醒回调函数


3. 实例

#include "sys.h"
#include "lcd.h"
#include "delay.h"
#include "key.h"
#include "uart.h"
#include "wkup.h"






/***************************************
使能窗口看门狗时钟
***************************************/
void HAL_WWDG_MspInit(WWDG_HandleTypeDef*hwwdg)
{
        __HAL_RCC_WWDG_CLK_ENABLE();
        //设置中断优先级
        HAL_NVIC_EnableIRQ(WWDG_IRQn);
        HAL_NVIC_SetPriority(WWDG_IRQn,3,3);
}


WWDG_HandleTypeDef wwdg_handler;
/***************************************
中断服务函数
***************************************/
void HAL_WWDG_IRQHandler(void)
{
        HAL_WWDG_IRQHandler(wwdg_handler);
}
/***************************************
唤醒回调函数,喂狗
***************************************/
void HAL_WWDG_EarlyWakeuoCallback(WWDG_HandleTypeDef*hwwdg)
{
        HAL_StatusTypeDef HAL_WWDG_Refresh(&wwdg_handler, 0x7f);
        LED1=!LED1;
}


/***************************************
主函数
***************************************/
int main(void)
{
        HAL_Init();//初始化HAL库
        Stm32_CLock_Init(360,25,2,8);//设置时钟180MHz
        delay_init(180);//初始化延时函数
        uart_init(115200);//初始化USART
        LED_Init();//初始化LED
        KEY_Init();//初始化KEY
        LED0=0;//点亮LED0
        delay_ms(300);//初始化延时函数
/***************************************
1. 初始化看门狗
***************************************/
        wwdg_handler.Instance=WWDG;
        wwdg_handler.Init.Prescaler=WWDG_PRESCALER_8;
        wwdg_handler.Init.Window=0x5f;
        wwdg_handler.Init.Counter=0x7f;
        HAL_WWDG_Init(&wwdg_handler);


/***************************************
2. 使能窗口看门狗并且开启中断
***************************************/
        //HAL_IWDG_Start(&iwdg_handler);
        HAL_WWDG_Start_IT(&wwdg_handler);


        LED0=0;
        while(1)
        {
                LED0=1;
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分