STM32中使用看門狗實現(xiàn)系統(tǒng)自動復(fù)位

STM32中的看門狗(Watchdog)是一種用于監(jiān)控系統(tǒng)運行狀態(tài)并在系統(tǒng)故障或死鎖時執(zhí)行自動復(fù)位的硬件功能。在本文中,我將介紹如何在STM32微控制器中使用看門狗來實現(xiàn)系統(tǒng)的自動復(fù)位。下面是詳細的解釋:

一、看門狗原理簡介
看門狗是一種獨立的硬件計時器,在啟動看門狗計時器之后,系統(tǒng)需要在一定的時間內(nèi)喂狗(即清除計時器計數(shù)值),否則看門狗將會超時,觸發(fā)系統(tǒng)自動復(fù)位。這是一種預(yù)防系統(tǒng)死鎖或異常情況的安全機制。

二、看門狗的配置
在STM32中,看門狗的配置主要涉及以下幾個方面:時鐘源、預(yù)分頻系數(shù)、重載值和使能位。

1. 時鐘源:通常可以選擇LSI(低速內(nèi)部時鐘)或LSI的2倍作為看門狗的時鐘源。

2. 預(yù)分頻系數(shù):預(yù)分頻系數(shù)用于控制看門狗計時器的時鐘頻率,根據(jù)系統(tǒng)需求選擇合適的預(yù)分頻系數(shù)。

3. 重載值:重載值決定了看門狗計時器的定時時長,當看門狗計時器達到重載值時,將會觸發(fā)系統(tǒng)復(fù)位。

4. 使能位:使能位用于啟用或禁用看門狗功能。

下面是一個使用STM32Cube HAL庫配置看門狗的示例代碼:

```c
#include "main.h"
#include "stm32f4xx_hal.h"
 
WWDG_HandleTypeDef hwwdg;
 
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_WWDG_Init(void);
 
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_WWDG_Init();
 
  while (1)
  {
    // 喂狗
    HAL_WWDG_Refresh(&hwwdg);
  }
}
 
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
 
static void MX_WWDG_Init(void)
{
  hwwdg.Instance = WWDG;
  hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
  hwwdg.Init.Window = 127;
  hwwdg.Init.Counter = 127;
 
  if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
  {
    Error_Handl?er();
  }
}
```
以上代碼中,我們首先初始化系統(tǒng)時鐘(System Clock),然后初始化GPIO和看門狗計時器。在main函數(shù)中,在一個無限循環(huán)中,我們通過調(diào)

用HAL_WWDG_Refresh函數(shù)來喂狗,確保看門狗計時器的計數(shù)值不會超時,從而防止系統(tǒng)自動復(fù)位。

在以上代碼中,我們配置了一個預(yù)分頻系數(shù)為8,重載值為127的看門狗計時器,并在無限循環(huán)中調(diào)用HAL_WWDG_Refresh函數(shù)來喂狗,以保證系統(tǒng)的正常運行。如果系統(tǒng)中出現(xiàn)了死鎖或其他異常情況導(dǎo)致程序未能及時喂狗,導(dǎo)致計數(shù)器超時,看門狗將會觸發(fā)系統(tǒng)復(fù)位,從而實現(xiàn)系統(tǒng)自動復(fù)位的功能。

三、注意事項
在使用STM32中的看門狗功能時,需要注意以下幾點:

1. 重載值的選擇:重載值的選擇需要根據(jù)系統(tǒng)運行時間和所需的復(fù)位間隔來確定。如果重載值太小,可能會導(dǎo)致看門狗頻繁觸發(fā)復(fù)位,影響系統(tǒng)的穩(wěn)定性;如果重載值太大,可能會導(dǎo)致看門狗計數(shù)器無法及時超時,從而無法實現(xiàn)自動復(fù)位的功能。

2. 喂狗的頻率:在使用看門狗功能時,需要定時喂狗,否則看門狗會在計時器超時時觸發(fā)系統(tǒng)復(fù)位。喂狗的頻率應(yīng)該在重載值的一半以上,以保證系統(tǒng)能夠正常運行。

3. 系統(tǒng)的初始化時間:看門狗計數(shù)器的啟動時間需要一定的時間,因此在初始化系統(tǒng)時,需要保證計時器已經(jīng)啟動并工作正常。

4. 發(fā)生異常時的處理:如果程序發(fā)生異常,例如死鎖或死循環(huán)等情況,可能會導(dǎo)致看門狗計時器無法及時喂狗,從而觸發(fā)系統(tǒng)復(fù)位。因此需要注意程序的穩(wěn)定性和安全性,盡可能避免出現(xiàn)異常情況并進行針對性的處理。

總結(jié):
在STM32中使用看門狗實現(xiàn)系統(tǒng)自動復(fù)位,需要進行時鐘源、預(yù)分頻系數(shù)、重載值和使能位的配置。通過定時喂狗,可以保證看門狗計時器的正常工作,防止系統(tǒng)出現(xiàn)異常情況,實現(xiàn)系統(tǒng)的自動復(fù)位功能。

嵌入式物聯(lián)網(wǎng)的學(xué)習(xí)之路非常漫長,不少人因為學(xué)習(xí)路線不對或者學(xué)習(xí)內(nèi)容不夠?qū)I(yè)而錯失高薪offer。不過別擔(dān)心,我為大家整理了一份150多G的學(xué)習(xí)資源,基本上涵蓋了嵌入式物聯(lián)網(wǎng)學(xué)習(xí)的所有內(nèi)容。點擊這里,0元領(lǐng)取學(xué)習(xí)資源,讓你的學(xué)習(xí)之路更加順暢!記得點贊、關(guān)注、收藏、轉(zhuǎn)發(fā)哦。 


the end

評論(0)