背景:
STM32的看门狗有2个:独立看门狗IWDG和窗口看门狗WWDG本文主要介绍STM32的IWDG。
内容:
IWDG主要性能
(1)自由运行的递减计数器;
(2)时钟由独立的RC振荡器提供(可在停止和待机模式下工作),LSI为其时钟源,STOP和SLEEP模式仍可运行;
(3)看门狗被激活后,在计数器计数至0x000的的时产生复位。
下图为看门狗的框图。
上图中,IWDG由4个寄存器控制,PR,SR,RLR和KR。下面继续分析STM32的HAL库中IWDG的使用。
IWDG_HandleTypeDef hiwdg;定义一个IWDG_HandleTypeDef类型的结构体,查看其结构体,如下
typedef struct
{
IWDG_TypeDef * Instance; / *!
IWDG_InitTypeDef Init; / *!
} IWDG_HandleTypeDef;
继续查看其内部的两个结构体,如下
typedef struct
{
__IO uint32_t KR; / *!
__IO uint32_t PR; / *!
__IO uint32_t RLR; / *!
__IO uint32_t SR; / *!
} IWDG_TypeDef;
typedef struct
{
uint32_t Prescaler; / *!
此参数可以是@ref的值IWDG_Prescaler * /
uint32_t Reload; / *!
此参数必须是介于Min_Data = 0和Max_Data = 0x0FFF之间的数字* /
} IWDG_InitTypeDef;
下面继续分析看门狗的初始化函数:
static void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG; //传入IWDG的基地址;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32预分频
hiwdg.Init.Reload = 3000;
if(HAL_IWDG_Init(&hiwdg)!= HAL_OK)
{
_Error_Handler(__ FILE__,__LINE__);
}
}
继续查看HAL_IWDG_Init函数:
HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef * hiwdg)
{
uint32_t tickstart;
/ *检查IWDG句柄分配* /
if(hiwdg == NULL)
{
return HAL_ERROR;
}
/ *检查参数* /
assert_param(IS_IWDG_ALL_INSTANCE(hiwdg-> Instance));
assert_param(IS_IWDG_PRESCALER(hiwdg-> Init.Prescaler));
assert_param(IS_IWDG_RELOAD(hiwdg-> Init.Reload));
/ *启用IWDG。LSI开启automaticaly * /
__HAL_IWDG_START(hiwdg);
/ *通过在KR * /
IWDG_ENABLE_WRITE_ACCESS(hiwdg)中写入0x5555来启用对IWDG_PR和IWDG_RLR寄存器的写入访问;
/ *写入IWDG寄存器Prescaler&Reload值与* /
hiwdg-> Instance-> PR = hiwdg-> Init.Prescaler;
hiwdg-> Instance-> RLR = hiwdg-> Init.Reload;
/ *检查未决的标志,如果以前的更新没有完成,则返回超时* /
tickstart = HAL_GetTick();
/ *等待寄存器更新* /
while(hiwdg-> Instance-> SR!= RESET)
{
if((HAL_GetTick() - tickstart)> HAL_IWDG_DEFAULT_TIMEOUT)
{
return HAL_TIMEOUT;
}
}
/ *在重装载寄存器* /定义的值重新加载IWDG计数器
__HAL_IWDG_RELOAD_COUNTER(hiwdg);
/ *返回函数状态* /
return HAL_OK;
}
当实际程序中使用看门狗后,需要在计数时间内不停地喂狗,以防止程序重启。若程序较为复杂,也可通过开启的一个定时器来不停地喂狗,喂狗即让看门狗复位从新计数,调用 __HAL_IWDG_RELOAD_COUNTER(hiwdg)函数来喂狗。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』