STM32F4 HAL库开发 -- 独立看门狗(IWDG)

Posted 聚优致成

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F4 HAL库开发 -- 独立看门狗(IWDG)相关的知识,希望对你有一定的参考价值。

之前讲过看门狗,参看:STM32开发 – 看门狗详解

一、HAL库配置独立看门狗步骤

1、取消寄存器写保护,设置看门狗预分频系数和重装载值。

首先我们必须取消 IWDG_PR和 IWDG_RLR寄存器的写保护,这样才可以设置寄存器IWDG_PR和 IWDG_RLR的值。取消写保护和设置预分频系数以及重装载值载HAL库中是通过函数HAL_IWDG_Init实现的。
该函数声明为:

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);

该函数只有一个入口参数hiwdg,该参数是HAL_StatusTypeDef 结构体指针类型。
接下来我们看看结构体HAL_StatusTypeDef 定义:

typedef struct
{
  IWDG_TypeDef                 *Instance;  /*!< Register base address    */

  IWDG_InitTypeDef             Init;       /*!< IWDG required parameters */
} IWDG_HandleTypeDef;

成员变量Instance用来设置看门狗寄存器基地址,实际上在HAL库中已经通过标识符定义了,这里对于独立看门狗直接设置为标识符IWDG即可。
成员变量Init是一个IWDG_InitTypeDef结构体类型,该结构体只有2个成员变量,分别用来设置独立看门狗的预分频系数和重装载值,定义如下:

typedef struct
{
  uint32_t Prescaler;  /*!< Select the prescaler of the IWDG.
                            This parameter can be a value of @ref IWDG_Prescaler */

  uint32_t Reload;     /*!< Specifies the IWDG down-counter reload value.
                            This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */

} IWDG_InitTypeDef;

HAL_IWDG_Init 函数使用的一般方法为:

IWDG_HandleTypeDef hiwdg; //独立看门狗句柄

void MX_IWDG_Init(void)
{

  hiwdg.Instance = IWDG;  //独立看门狗
  hiwdg.Init.Prescaler = IWDG_PRESCALER_64; //设置IWDG分频系数
  hiwdg.Init.Reload = 4095;	//重装载值
  if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  {
    Error_Handler();
  }
}

上面程序的作用是初始化IWDG,设置分频系数64,重装载值为4095。设置玩预分频系数和重装载值后,我们就可以知道看门狗的喂狗时间(也就是看门狗溢出时间),该时间的计算方式为:

Tout=((4×2^prer) ×rlr) /32

其中:

#define IWDG_PRESCALER_64               IWDG_PR_PR_2                                    /*!< IWDG prescaler set to 64  */
#define IWDG_PR_PR_2                        (0x4UL << IWDG_PR_PR_Pos)           /*!< 0x00000004 */

Tout 为看门狗溢出时间(单位为 ms); prer 为看门狗时钟预分频值( IWDG_PR 值),范围为 0~7; rlr 为看门狗的重装载值( IWDG_RLR 的值);
比如我们设定prer值为4(4 代表的是 64 分频, HAL 库中可以使用宏定义标识符IWDG_PRESCALER_64),rlr值为4095,那么就可以得到Tout=64×4095/32=8190ms。这样,看门狗的溢出时间就是8190ms。只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确
的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

下图为STM32F407的独立看门狗时钟 32KHz。

下图为STM32F105的独立看门狗时钟 40KHz。

2、重载计数值喂狗(向IWDG_KR 写入 0XAAAA)

在HAL中重载计数值得函数是HAL_IWDG_Refresh,该函数声明为:

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);

该函数有一个入口参数为前面讲解的HAL_StatusTypeDef 结构体类型指针,它的作用是把值0xAAAA写入到IWDG_KR 寄存器,从而触发计数器重载,即实现独立看门狗的喂狗操作。

//喂独立看门狗
void IWDG_Feed(void)
{   
  HAL_IWDG_Refresh(&hiwdg); 
}
#define __HAL_IWDG_RELOAD_COUNTER(__HANDLE__)       WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_RELOAD)
#define IWDG_KEY_RELOAD                 0x0000AAAAu  /*!< IWDG Reload Counter Enable   */

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
{
  /* Reload IWDG counter with value defined in the reload register */
  __HAL_IWDG_RELOAD_COUNTER(hiwdg);

  /* Return function status */
  return HAL_OK;
}

3、启动看门狗(向IWDG_KR写入0xCCCC)

HAL 库函数里面启动独立看门狗的函数是 HAL_IWDG_Start:

HAL_StatusTypeDef HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg);

通过上面3个步骤,我们就可以启动STM32F4的独立看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。

二、STM32CubeMX配置IWDG

在 Pinout 界面的 Peripherals 一栏选择 IWDG,然后勾选上 Activated 选项即可使能 IWDG。依次配置 IWDG 的预分频系数和自动装载值。

以上是关于STM32F4 HAL库开发 -- 独立看门狗(IWDG)的主要内容,如果未能解决你的问题,请参考以下文章

STM32F4 HAL库开发 -- 独立看门狗(IWDG)

STM32F4 HAL库开发 -- 独立看门狗(IWDG)

STM32F4 HAL库开发 -- 独立看门狗(IWDG)

06 STM32F4的窗口看门狗(WWDG)

STM32F4xx系列_独立看门口配置

STM32F4 HAL库开发 -- RTC