STM32中使用看門狗實現系統自動復位
一、看門狗原理簡介
看門狗是一種獨立的硬件計時器,在啟動看門狗計時器之后,系統需要在一定的時間內喂狗(即清除計時器計數值),否則看門狗將會超時,觸發系統自動復位。這是一種預防系統死鎖或異常情況的安全機制。
二、看門狗的配置
在STM32中,看門狗的配置主要涉及以下幾個方面:時鐘源、預分頻系數、重載值和使能位。
1. 時鐘源:通常可以選擇LSI(低速內部時鐘)或LSI的2倍作為看門狗的時鐘源。
2. 預分頻系數:預分頻系數用于控制看門狗計時器的時鐘頻率,根據系統需求選擇合適的預分頻系數。
3. 重載值:重載值決定了看門狗計時器的定時時長,當看門狗計時器達到重載值時,將會觸發系統復位。
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();
}
}
```
以上代碼中,我們首先初始化系統時鐘(System Clock),然后初始化GPIO和看門狗計時器。在main函數中,在一個無限循環中,我們通過調
用HAL_WWDG_Refresh函數來喂狗,確保看門狗計時器的計數值不會超時,從而防止系統自動復位。
在以上代碼中,我們配置了一個預分頻系數為8,重載值為127的看門狗計時器,并在無限循環中調用HAL_WWDG_Refresh函數來喂狗,以保證系統的正常運行。如果系統中出現了死鎖或其他異常情況導致程序未能及時喂狗,導致計數器超時,看門狗將會觸發系統復位,從而實現系統自動復位的功能。
三、注意事項
在使用STM32中的看門狗功能時,需要注意以下幾點:
1. 重載值的選擇:重載值的選擇需要根據系統運行時間和所需的復位間隔來確定。如果重載值太小,可能會導致看門狗頻繁觸發復位,影響系統的穩定性;如果重載值太大,可能會導致看門狗計數器無法及時超時,從而無法實現自動復位的功能。
2. 喂狗的頻率:在使用看門狗功能時,需要定時喂狗,否則看門狗會在計時器超時時觸發系統復位。喂狗的頻率應該在重載值的一半以上,以保證系統能夠正常運行。
3. 系統的初始化時間:看門狗計數器的啟動時間需要一定的時間,因此在初始化系統時,需要保證計時器已經啟動并工作正常。
4. 發生異常時的處理:如果程序發生異常,例如死鎖或死循環等情況,可能會導致看門狗計時器無法及時喂狗,從而觸發系統復位。因此需要注意程序的穩定性和安全性,盡可能避免出現異常情況并進行針對性的處理。
總結:
在STM32中使用看門狗實現系統自動復位,需要進行時鐘源、預分頻系數、重載值和使能位的配置。通過定時喂狗,可以保證看門狗計時器的正常工作,防止系統出現異常情況,實現系統的自動復位功能。
嵌入式物聯網的學習之路非常漫長,不少人因為學習路線不對或者學習內容不夠專業而錯失高薪offer。不過別擔心,我為大家整理了一份150多G的學習資源,基本上涵蓋了嵌入式物聯網學習的所有內容。點擊這里,0元領取學習資源,讓你的學習之路更加順暢!記得點贊、關注、收藏、轉發哦。
the end
- 贊