美文网首页
STM32CubeMX学习笔记(11)——IWDG独立看门狗使用

STM32CubeMX学习笔记(11)——IWDG独立看门狗使用

作者: Leung_ManWah | 来源:发表于2021-01-28 14:31 被阅读0次

一、IWDG简介

看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统。

STM32 有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬。独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。

二、新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”

2. 选择 MCU 和封装

3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)


选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置

4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire

三、IWDG

3.1 参数配置

System Core 中选择 IWDG 设置,并勾选 Activated 激活


IWDG counter clock prescaler 预分频器值设为 64
IWDG down-counter reload value 重装载寄存器值设为 625

超时时间 Tout = (4*2^prv) / LSI * rlv (s) prv是预分频器寄存器的值,rlv是重装载寄存器的值



由图知 LSI 为 40 KHz,当 prv 取 IWDG_ PRESCALER_64 ,rlv 取 625 时,Tout=64/40*625=1s。
即设置 1s 的超时溢出。

3.2 生成代码

输入项目名和项目路径


选择应用的 IDE 开发环境 MDK-ARM V5

每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

点击 GENERATE CODE 生成代码

3.3 添加喂狗函数

因为设置超时溢出为 1 秒,所以这里每隔 800 毫秒喂狗一次 HAL_IWDG_Refresh(&hiwdg);

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_USART1_UART_Init();
  MX_IWDG_Init();
  /* USER CODE BEGIN 2 */
  printf("\n\r***** IWDG Test Start *****\n\r");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    printf("\n\r Refreshes the IWDG !!!\n\r");
    HAL_IWDG_Refresh(&hiwdg);
    HAL_Delay(800);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

3.4 查看打印

串口打印功能查看 STM32CubeMX学习笔记(6)——USART串口使用


当去掉 HAL_IWDG_Refresh(&hiwdg);,也就是不喂狗时,系统约 1 秒重启一次。

3.5 HAL库与标准库代码比较

STM32CubeMX 使用 HAL 库生成的代码:

/**
  * @brief IWDG Initialization Function
  * @param None
  * @retval None
  */
static void MX_IWDG_Init(void)
{
  /* USER CODE BEGIN IWDG_Init 0 */

  /* USER CODE END IWDG_Init 0 */

  /* USER CODE BEGIN IWDG_Init 1 */

  /* USER CODE END IWDG_Init 1 */
  hiwdg.Instance = IWDG;
  hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
  hiwdg.Init.Reload = 625;
  if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN IWDG_Init 2 */

  /* USER CODE END IWDG_Init 2 */
}

HAL_IWDG_Refresh(&hiwdg);

使用 STM32 标准库的代码:

IWDG_Config(IWDG_PRESCALER_64 ,625);

void IWDG_Config(uint8_t prv ,uint16_t rlv)
{   
    // 使能 预分频寄存器PR和重装载寄存器RLR可写
    IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
    
    // 设置预分频器值
    IWDG_SetPrescaler( prv );
    
    // 设置重装载寄存器值
    IWDG_SetReload( rlv );
    
    // 把重装载寄存器的值放到计数器中
    IWDG_ReloadCounter();
    
    // 使能 IWDG
    IWDG_Enable();  
}

// 喂狗
void IWDG_Feed(void)
{
    // 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
    // 当计数器的值减到0的时候会产生系统复位
    IWDG_ReloadCounter();
}

HAL_IWDG_Init(); 对应 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(prv);IWDG_SetReload(rlv);IWDG_Enable();
HAL_IWDG_Refresh(&hiwdg); 对应 IWDG_ReloadCounter();

六、注意事项

用户代码要加在 USER CODE BEGIN NUSER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。


• 由 Leung 写于 2021 年 1 月 28 日

• 参考:STM32CubeMX系列教程15:看门狗(WDG)
    【STM32】HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)

相关文章

  • STM32CubeMX学习笔记(11)——IWDG独立看门狗使用

    一、IWDG简介 看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候...

  • 10.11总结

    老师讲了看门狗的用法功能: 独立看门狗,在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此...

  • 2019-04-29 STM32_IWDG_独立看门狗

    1.IDWG介绍 STM32芯片内部有两个看门狗外设: ①:独立看门狗IWDG ②:窗口看门狗:WWDG 用途:均...

  • stm32---独立看门狗与窗口看门狗

    1.独立看门狗IWDG 独立看门狗实际上就是一个12位的递减计数器,软件设置一预装载值(不得大于2^12)然后递减...

  • 灵动微MM32F003硬件最小系统 --- 独立看门狗IWDG例

    独立看门狗(IWDG)由低速时钟(LSI)驱动,即使注视中发声故障它依然有效。当看门狗被激活后,则在计数器计数至0...

  • 2018.1.22

    今天是嵌入式学习第五周周一。 今天上午郭老师主要给我们讲解了独立看门狗IWDG。看门狗是为了防止程序跑飞而陷入死循...

  • 2018-01-22课后总结

    上午学习了独立看门狗IWDG,用于对时间要求不是特别精确的地方,主要是为了防止程序跑飞,或者打断强制复位,精髓在于...

  • STM32CubeMX学习笔记(12)——WWDG窗口看门狗使用

    一、WWDG简介 看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候...

  • 运动控制器37:STM32的看门狗功能

    IWDG IWDG由LSI驱动,就算外部高速时钟失效也能正常工作,用于程序以外,需要一个独立,对时间精度要求不太高...

  • 10.11

    今天上午讲了新的内容--独立看门狗:1.独立看门狗概述 2.常用寄存器和库函数配置 3.手把手写独立看门狗实验...

网友评论

      本文标题:STM32CubeMX学习笔记(11)——IWDG独立看门狗使用

      本文链接:https://www.haomeiwen.com/subject/rwettltx.html