STM 32 窗口看门狗

窗口看门狗:
之所以称为窗口是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。
独立看门狗限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。

窗口看门狗框图:

STM 32 窗口看门狗_第1张图片

在图中,我们可以观察到,有两种情况可以导致系统复位。第一种情况就是,当计数器的值大于配置寄存器设置的窗口上限值时进行了喂狗操作;第二种情况就是,看门狗控制寄存器的T6位变成了低电平(也就是计数值由0x40变为了0x3F)

窗口看门狗工作示意图:

STM 32 窗口看门狗_第2张图片

另外,如果开启了看门狗并且允许了中断,当计数器等于0x40时产生早起唤醒中断EWI,它可以用于喂狗以避免WWDG复位。

窗口看门狗超时时间的计算:

STM 32 窗口看门狗_第3张图片

STM 32 窗口看门狗_第4张图片

(窗口看门狗其他注意事项:)
1. 上窗口值W[6:0]必须大于下窗口值0x40。否则就无窗口了。
2. 窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。

接下来介绍对应的寄存器:

1.控制寄存器WWDG_CR

STM 32 窗口看门狗_第5张图片

2.配置寄存器WWDG_CFR

STM 32 窗口看门狗_第6张图片

3.状态寄存器WWDG_SR

STM 32 窗口看门狗_第7张图片

WWDG操作的HAL库函数:
1. HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);
2. void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg);
3. HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg);
4. HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg);
5. HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg);
6. void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg);
7. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg);

窗口看门狗配置过程:

1.使能窗口看门狗时钟:在HAL_WWDG_MspInit函数中。
2.初始化窗口看门狗:设置分频系数,窗口值,计数值等。
HAL_WWDG_Init(); 该函数还可以使能窗口看门狗提前唤醒中断 。
3.设置提前唤醒中断优先级:HAL_WWDG_MspInit
4.编写提前唤醒中断处理函数: HAL_WWDG_EarlyWakeupCallback();
喂狗: HAL_WWDG_Refresh();

例程:

WWDG_HandleTypeDef WWDG_Handler;     
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
    WWDG_Handler.Instance=WWDG;
    WWDG_Handler.Init.Prescaler=fprer; 
    WWDG_Handler.Init.Window=wr;        
    WWDG_Handler.Init.Counter=tr;       
    WWDG_Handler.Init.EWIMode=WWDG_EWI_ENABLE ;
    HAL_WWDG_Init(&WWDG_Handler);      
}

void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
    HAL_RCC_WWDG_CLK_ENABLE();                 
    HAL_NVIC_SetPriority(WWDG_IRQn,2,3);     
    HAL_NVIC_EnableIRQ(WWDG_IRQn);          
}


void WWDG_IRQHandler(void)
{
    HAL_WWDG_IRQHandler(&WWDG_Handler);
}

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
    HAL_WWDG_Refresh(&WWDG_Handler);
    LED1_Toggle; 
}

你可能感兴趣的:(stm32)