首页 > 其他分享 >STM32 独立看门狗(IWDG)

STM32 独立看门狗(IWDG)

时间:2023-01-04 11:57:24浏览次数:37  
标签:BEGIN IWDG END 看门狗 STM32 CODE USER

1、定义:

看门狗,又叫 watchdog,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做喂狗,输出一般连接到另外一个部分的复位端,一般是连接到单片机。 看门狗的功能是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
在定时时间内,“看门狗”计数器是不会装满的,然后在这个时间内告诉它重新开始计数,就是把计数器清零,这个过程叫“喂狗”,这样隔一段时间喂一次狗,只要程序正常运行他就永远计不满,一旦出现死循环之类的故障,没有及时来清零计数器,就会导致装满了溢出,他就重启系统,复位。

2、CubeMX设置

STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然 有效。

定时时间:

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

其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值), 范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);

比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符 IWDG_PRESCALER_64)

当 prv 取 IWDG_ PRESCALER_64 ,rlv 取 625 时,Tout=64/40*625=1000ms。
即设置 1s 的超时溢出。

3、HAL库独立看门狗函数库讲解

看门狗初始化函数

HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)

喂狗函数

HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)

4、效果

 在配置看门狗后,DS0 将常亮,如果 KEY0 按键按下,就喂狗,只要 KEY0 不停的按,看门狗就一直不会产生复位,保持 DS0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 DS0 熄灭一次。

5、代码

iwdg.c

/* Includes ------------------------------------------------------------------*/
#include "iwdg.h"
IWDG_HandleTypeDef hiwdg;

/* IWDG init function */
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 */
}
/* USER CODE BEGIN 1 */
//喂独立看门狗
void IWDG_Feed(void)
{ 
 HAL_IWDG_Refresh(&hiwdg); //喂狗
}
/* USER CODE END 1 */

 main.c

#include "main.h"
#include "iwdg.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define     u8    unsigned char
#define     KEY0  HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) // 按键 PE4
#define     LED0  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //LED0 亮
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
u8 KEY_Scan2(void)
{
  static u8 key_up=1;
    if(key_up &&  KEY0==0)
    {
        HAL_Delay(10);//延时,防抖
        key_up=0;//标记这次key已经按下
        if(KEY0==0)
        {
         return 1;
        }
    }else if(KEY0!=0)  key_up=1;
    return 0;
}

/* USER CODE END 0 */

/**
  * @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 */ HAL_Delay(100);//延时 100ms 再初始化看门狗,LED0 的变化"可见" MX_GPIO_Init(); MX_IWDG_Init(); /* USER CODE BEGIN 2 */ LED0; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(KEY_Scan2()==1) //如果 KEY0 按下,喂狗 { IWDG_Feed(); //喂狗 } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }

6、下载认证

在编译成功之后,我们就可以下载代码到精英 STM32 V1 开发板上,实际验证一下,我们 的程序是否正确。下载代码后,可以看到 DS0 不停的闪烁,证明程序在不停的复位,否则只会 DS0 常亮。这时我们试试不停的按 KE0 按键,可以看到 DS0 就常亮了,不会再闪烁。

 

标签:BEGIN,IWDG,END,看门狗,STM32,CODE,USER
From: https://www.cnblogs.com/CC-C/p/17020045.html

相关文章

  • OpenOCD如何通过stlink直接下载程序到stm32板子(已解决)
    首先,关于OpenOCD的入门介绍,以及如何调试,看我这篇文章:​​嵌入式IDE原理OpenOCD介绍以及stlink如何连接stm32板子_标biao的博客-由于OpenOCD一旦连接上,会自动进入3种端口监......
  • stm32——时钟系统
    时钟系统知识总结(任何一个外设在使用前,都必须首先使能其相应的时钟)最高主频72Mstm32有五个时钟源(HSI、HSE、LSI、LSE、PLL)HSE时钟:高速外部时钟(外接晶振/其他时钟信号)来源......
  • stm32读写sd卡代码解析和调试总结
    一前言 做程序员真是来不得半点偷懒,假如你对经常使用的代码不熟悉,早晚会让你付出沉重的代价。像认识自己的灵魂一样认识每行用到的代码,这才是一个合格的程序员,才不......
  • STM32 窗口看门狗中的喂狗操作具体是指什么
    是指清空看门狗计数器,看门狗实际上就是一个定时计数器,用来防止程序发生意外而设置的一个监测装置,只要看门狗功能打开,看门狗计数器的计数值是会不停的增加,程序正常运行时,需......
  • MINIGPA103 USBHID评估板入门学习手册基于STM32HAL库
    序由于作者水平有限,文档和视频中难免有出错和讲得不好的地方,欢迎各位读者和观众善意地提出意见和建议,谢谢!第一部分、硬件概述1.1实物概图图1.1Gamepad实物概图如图1......
  • 基于STM32+ESP8266的奥运会奖牌榜设计之经典
    (一)实验目的和任务1、掌握esp8266模块的TCP协议,进行联网和服务器2、熟悉jscon库的移植和API的使用,对jscon格式的数据进行解析3、掌握LCD或串口屏显示东京奥运会奖牌榜(二)实验......
  • stm32cubeIDE,双通道ADC+DMA配置
    双通道配置ADC_IN1和ADC_IN3        写下开始函数可用adc采集      ......
  • STM32串口及printf
    1,开启串口相关的时钟,GPIO,USART的时钟2,配置GPIO,注TX引脚AF的(OD和PP试过都没啥问题),RX浮空输入3,配置USART的结构体,NVIC的分组和结构体成员,4,选择串口通信的中断触发信号;usart......
  • STM32 SPI DMA 源码解析及总结
    一前言最近在调试stm32的SPI时候i,遇到了一个非常诡异的问题。中间花费了不少时间才把问题搞定。这中间暴露的问题值得反思。借此机会,还是梳理一下stm32的SPI的代码做......
  • STM32L431 移植 LiteOS 时 _ebss _Min_Heap_Size _Min_Stack_Size 未找到或未定义问题
    如下图所示,移植过程中未出现配置遗漏的情况,也没有配置错误的地方,但依旧报以下错误:个人猜测可能是Keil本身的问题,一直识别你的东西没有,所以不给你通过。因为,我配置了很......