STM32开发(11)----CubeMX配置独立看门狗(IWDG)


前言

本章介绍使用STM32CubeMX对独立看门狗定时器进行配置的方法。门狗本质上是一个定时器,提供了更高的安全性、时间的精确性和使用的灵活性。STM32F1xx提供两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的障,重点掌握超时时间的计算,理解LSI温漂较大的使用场景,以及独立定时器的使用;

一、独立看门狗的介绍

独立看门狗IWDG有一个输出端,可以输出复位信号。该定时器是一个 12 位的递减计数器,当计数器的值减到 0 的时候,就会产生一个复位信号。如果在计数没减到 0 之前,重置计数器的值的话,那么就不会产生复位信号,这个动作我们称为喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍然可以工作。

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。

独立看门狗框图
在这里插入图片描述
从上图我们可以看到独立看门狗主要由下面几个部分组成:
独立看门狗时钟
独立看门狗的时钟由独立的 RC 振荡器 LSI 提供,即使主时钟发生故障它仍然有效,非常独立。LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,我们一般取 40KHZ,所以独立看门狗的定时时间并不一定非常精确,只适用于对时间精度要求比较低的场合。
计数器时钟
递减计数器的时钟由 LSI 经过一个 8 位的预分频器得到,我们可以操作预分频器寄存器IWDG_PR 来设置分频因子,分频因子可以是: [4,8,16,32,64,128,256,256],计数器时钟 CK_CNT=40/ 42^PRV,一个计数器时钟计数器就减一。
计数器
独立看门狗的计数器是一个 12 位的递减计数器,最大值为 0XFFF,当计数器减到 0 时,会产生一个复位信号:IWDG_RESET,让程序重新启动运行,如果在计数器减到 0 之前刷新了计数器的值的话,就不会产生复位信号,重新刷新计数器值的这个动作我们俗称喂狗。
重装载寄存器
重装载寄存器是一个 12 位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。超时时间 Tout = (4
2^prv) / 40 * rlv (s) , prv 是预分频器寄存器的值, rlv 是重装载寄存器的值。
键寄存器
键寄存器 IWDG_KR 可以说是独立看门狗的一个控制寄存器,主要有三种控制方式,往这个寄存器写入下面三个不同的值有不同的效果。
在这里插入图片描述

二、实验过程

1.STM32CubeMX配置独立看门狗

选择芯片stm32f103c6t6,新建工程

在这里插入图片描述

设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。

在这里插入图片描述

配置时钟树,这里使用官方推荐的配置

在这里插入图片描述

在这里插入图片描述
IWDG的时钟为40kHz,此时设置计数器时钟为64分频,递减基础器重载值(down-counter reload value)配置为625,当计数器的值大于窗口值时,如果执行重载操作,则会产生复位。
超出(溢出)时间计算:

                                               Tout=((4×2^PRER) ×RLR)/LSI时钟频率=(64 * 625)/40 000 =  1s

在这里插入图片描述

在这里插入图片描述

Code Generator中设置只拷贝使用到的库,分离.c和.h文件

在这里插入图片描述

设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。

在这里插入图片描述

2.代码实现

在usart.c文件后面添加如下代码,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数。

/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
    
    
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 0 */

这里通过打印来查看iwdg的情况,注意喂狗时间不要太接近临界值,因为rc的温漂很大,所以如果很接近临界值可能导致复位

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_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_IWDG_Init();
  /* USER CODE BEGIN 2 */
	printf("IWDG start\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		printf("\n\r Refreshes the IWDG !!!\n\r");

    /* Refresh IWDG: reload counter */

    HAL_IWDG_Refresh(&hiwdg);

    HAL_Delay(800);
  }
  /* USER CODE END 3 */
}

3.硬件连接

烧录器ST-LINK V2和最小系统板的连接如图所示: 四线连接 SWDIO,GND,SWCLK,和3.3V电源

在这里插入图片描述

4.实验结果

每经过800ms喂一次狗,喂狗成功,程序不会重启
在这里插入图片描述
为了体现喂狗失败的复位现象,这里修改下代码

  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		printf("\n\r Refreshes the IWDG !!!\n\r");

    /* Refresh IWDG: reload counter */

    HAL_IWDG_Refresh(&hiwdg);

    HAL_Delay(1100);
  }

可以看到喂狗失败,程序不停的重启
在这里插入图片描述

总结

本章介绍了STM32F103系列设备中独立看门狗,并通过实验验证了前面所讲的理论,这里要注意,LSI的温漂比较大,使用时不可用于精准定时的场景。

猜你喜欢

转载自blog.csdn.net/bin_zhang1/article/details/129021585