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

STM32中的看門(mén)狗(Watchdog)是一種用于監(jiān)控系統(tǒng)運(yùn)行狀態(tài)并在系統(tǒng)故障或死鎖時(shí)執(zhí)行自動(dòng)復(fù)位的硬件功能。在本文中,我將介紹如何在STM32微控制器中使用看門(mén)狗來(lái)實(shí)現(xiàn)系統(tǒng)的自動(dòng)復(fù)位。下面是詳細(xì)的解釋?zhuān)?br />
一、看門(mén)狗原理簡(jiǎn)介
看門(mén)狗是一種獨(dú)立的硬件計(jì)時(shí)器,在啟動(dòng)看門(mén)狗計(jì)時(shí)器之后,系統(tǒng)需要在一定的時(shí)間內(nèi)喂狗(即清除計(jì)時(shí)器計(jì)數(shù)值),否則看門(mén)狗將會(huì)超時(shí),觸發(fā)系統(tǒng)自動(dòng)復(fù)位。這是一種預(yù)防系統(tǒng)死鎖或異常情況的安全機(jī)制。

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

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

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

3. 重載值:重載值決定了看門(mén)狗計(jì)時(shí)器的定時(shí)時(shí)長(zhǎng),當(dāng)看門(mén)狗計(jì)時(shí)器達(dá)到重載值時(shí),將會(huì)觸發(fā)系統(tǒng)復(fù)位。

4. 使能位:使能位用于啟用或禁用看門(mén)狗功能。

下面是一個(gè)使用STM32Cube HAL庫(kù)配置看門(mén)狗的示例代碼:

```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)時(shí)鐘(System Clock),然后初始化GPIO和看門(mén)狗計(jì)時(shí)器。在main函數(shù)中,在一個(gè)無(wú)限循環(huán)中,我們通過(guò)調(diào)

用HAL_WWDG_Refresh函數(shù)來(lái)喂狗,確保看門(mén)狗計(jì)時(shí)器的計(jì)數(shù)值不會(huì)超時(shí),從而防止系統(tǒng)自動(dòng)復(fù)位。

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

三、注意事項(xiàng)
在使用STM32中的看門(mén)狗功能時(shí),需要注意以下幾點(diǎn):

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

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

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

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

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

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


the end

評(píng)論(0)