这一章介绍如何使用
STM32F429
的独立看门狗(以下简称
IWDG
)。
一、STM32F4 独立看门狗简介
STM32F4
的独立看门狗由内部专门的 32Khz
低速时钟(LSI
)驱动,即使主时钟发生故障,
它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC
时钟,所以并不是准确的 32Khz
,而是在 15~47Khz
之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz
的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
下面介绍独立看门狗的几个寄存器
-
关键字寄存器
IWDG_KR
寄存器的各位描述如下:
在关键字寄存器(IWDG_KR
)中写入0xCCCC
,开始启用独立看门狗;此时计数器开始从其复位值0xFFF
递减计数。当计数器计数到末尾0x000
时,会产生一个复位信号(IWDG_RESET
)。无论何时,只要关键字寄存器IWDG_KR
中被写入0xAAAA
,IWDG_RLR
中的值就会被重新加载到计数器中从而避免产生看门狗复位 。
IWDG_PR
和IWDG_RLR
寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR
寄存器中写入0x5555
。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA
)也会启动写保护功能。 -
预分频寄存器
IWDG_PR
该寄存器用来设置看门狗时钟的分频系数,最低为 4,最高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是保留位。预分频寄存器各位定义如图所示:
-
重装载寄存器
IWDG_RLR
该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的,该寄存器的各位描述如图所示:
只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32F4
的独立看门狗。独立看门狗相关的HAL
库操作函数在文件 stm32f4xx_hal_iwdg.c
和头文件 stm32f4xx_hal_iwdg.h
中。接下来我们讲解一下通过 HAL
库配置独立看门狗的步骤:
-
取消寄存器写保护,设置看门狗预分频系数和重装载值
首先我们必须取消IWDG_PR
和IWDG_RLR
寄存器的写保护,这样才可以设置寄存器IWDG_PR
和IWDG_RLR
的值。取消写保护和设置预分频系数以及重装载值在HAL
库中是通过函数HAL_IWDG_Init
实现的。该函数声明为:HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);
该函数只有一个入口参数
hiwdg
,该参数是IWDG_HandleTypeDef
结构体指针类型。接下来我们看看结构体IWDG_HandleTypeDef
定义:typedef struct { IWDG_TypeDef *Instance; IWDG_InitTypeDef Init; HAL_LockTypeDef Lock; __IO HAL_IWDG_StateTypeDef State; }IWDG_HandleTypeDef;
- 成员变量
Instance
用来设置看门狗寄存器基地址,实际上在HAL
库中已经通过标识符定义了,这里对于独立看门狗直接设置为标识符IWDG
即可。 - 成员变量
Init
是一个IWDG_InitTypeDef
结构体类型,该结构体只有 2 个成员变量,分别用来设置独立看门狗的预分频系数和重装载值,定义如下:typedef struct { uint32_t Prescaler; uint32_t Reload; }IWDG_InitTypeDef;
- 成员变量
Lock
是一个锁存变量,该变量在HAL
库中当操作配置IWDG
之前设置为锁住LOCK
,当配置操作完成之后设置为UNLOCK
,实际上是一个操作状态标识符。 - 成员变量
State
也是HAL
定义的一个过程标识符,用来记录IWDG
处理状态。
HAL_IWDG_Init
函数使用的一般方法为:IWDG_HandleTypeDef IWDG_Handler; //独立看门狗句柄 IWDG_Handler.Instance=IWDG; //独立看门狗 IWDG_Handler.Init.Prescaler=IWDG_PRESCALER_64; //设置 IWDG 分频系数 IWDG_Handler.Init.Reload=500; //重装载值 HAL_IWDG_Init(&IWDG_Handler);
< - 成员变量