什么是看門狗
單片機(jī)STM32的看門狗(Watchdog)是一種硬件定時(shí)器,用于監(jiān)控系統(tǒng)的運(yùn)行狀態(tài)并在出現(xiàn)故障或死鎖時(shí)采取措施以恢復(fù)正常操作??撮T狗的主要功能是定期檢查系統(tǒng)是否正常運(yùn)行,并在系統(tǒng)出現(xiàn)問題時(shí)觸發(fā)復(fù)位操作。
STM32系列單片機(jī)通常配備了內(nèi)置的看門狗定時(shí)器(通常稱為獨(dú)立看門狗,IWDG)和窗口看門狗定時(shí)器(WWDG),以提供更可靠的系統(tǒng)保護(hù)。
獨(dú)立看門狗(IWDG)是STM32中常用的看門狗,它是一個(gè)獨(dú)立的硬件模塊,可以在系統(tǒng)內(nèi)部獨(dú)立運(yùn)行。通過配置IWDG定時(shí)器的計(jì)數(shù)器和預(yù)分頻器,可以設(shè)置看門狗的定時(shí)時(shí)間。當(dāng)看門狗定時(shí)器計(jì)數(shù)器達(dá)到預(yù)設(shè)的值時(shí),會(huì)產(chǎn)生看門狗超時(shí)事件,觸發(fā)系統(tǒng)復(fù)位。
窗口看門狗(WWDG)是另一種類型的看門狗,它允許在特定的時(shí)間窗口內(nèi)更新計(jì)數(shù)器值,以避免觸發(fā)復(fù)位。WWDG可以通過設(shè)定窗口和計(jì)數(shù)器的值來進(jìn)行配置,并在每次更新計(jì)數(shù)器時(shí),確保計(jì)數(shù)器值位于設(shè)定的窗口范圍內(nèi)。如果計(jì)數(shù)器超出窗口范圍,將觸發(fā)看門狗復(fù)位。
通過使用STM32的看門狗功能,可以監(jiān)測(cè)系統(tǒng)運(yùn)行的正常性,防止系統(tǒng)出現(xiàn)死鎖或意外故障導(dǎo)致的無響應(yīng)狀態(tài)??撮T狗可以在系統(tǒng)軟件編程錯(cuò)誤、電源干擾或其他異常情況下,提供一個(gè)安全機(jī)制來恢復(fù)系統(tǒng)的正常運(yùn)行。
為什么需要看門狗?
看門狗在嵌入式系統(tǒng)中起著重要的作用,以下是一些需要看門狗的原因:
-
防止系統(tǒng)死鎖:在某些情況下,嵌入式系統(tǒng)可能會(huì)陷入無限循環(huán)或死鎖狀態(tài),導(dǎo)致系統(tǒng)停止響應(yīng)??撮T狗能夠監(jiān)測(cè)系統(tǒng)的運(yùn)行狀態(tài),如果系統(tǒng)在預(yù)定的時(shí)間內(nèi)沒有及時(shí)更新看門狗定時(shí)器,就會(huì)觸發(fā)復(fù)位操作,使系統(tǒng)重新啟動(dòng)并恢復(fù)正常運(yùn)行。
-
處理軟件故障:在開發(fā)嵌入式軟件時(shí),可能會(huì)出現(xiàn)編程錯(cuò)誤、內(nèi)存溢出、任務(wù)優(yōu)先級(jí)錯(cuò)誤等問題,導(dǎo)致系統(tǒng)運(yùn)行不正常??撮T狗可以監(jiān)測(cè)系統(tǒng)是否持續(xù)運(yùn)行,并在軟件故障時(shí)進(jìn)行復(fù)位,以恢復(fù)系統(tǒng)到初始狀態(tài)。
-
應(yīng)對(duì)外部干擾:嵌入式系統(tǒng)可能受到外部干擾,如電源波動(dòng)、電磁干擾等。這些干擾可能導(dǎo)致系統(tǒng)崩潰或運(yùn)行不正常。看門狗可以檢測(cè)這些異常情況,并在系統(tǒng)無響應(yīng)時(shí)采取措施,以確保系統(tǒng)的穩(wěn)定性和可靠性。
-
提高系統(tǒng)可靠性:通過引入看門狗,系統(tǒng)可以在出現(xiàn)故障時(shí)自動(dòng)恢復(fù),減少系統(tǒng)停機(jī)時(shí)間。這對(duì)于需要連續(xù)運(yùn)行和高可靠性的應(yīng)用非常重要,如工業(yè)控制、汽車電子、醫(yī)療設(shè)備等領(lǐng)域。
總之,看門狗提供了一種監(jiān)測(cè)和保護(hù)機(jī)制,確保嵌入式系統(tǒng)的可靠性和穩(wěn)定性。它可以防止系統(tǒng)死鎖、處理軟件故障、抵御外部干擾,并提高系統(tǒng)的可用性和可靠性。
STM32CubeMX配置和應(yīng)用
在使用STM32CubeMX配置和應(yīng)用看門狗時(shí),您可以按照以下步驟進(jìn)行操作:
-
打開STM32CubeMX軟件,并創(chuàng)建或打開您的工程。
-
在"Pinout & Configuration"選項(xiàng)卡中,選擇您的目標(biāo)STM32微控制器型號(hào)。
-
在"Peripherals"面板中,找到并展開"System Core"選項(xiàng)。
-
選擇"Independent Watchdog"(獨(dú)立看門狗)或"Window Watchdog"(窗口看門狗),具體根據(jù)您的需求選擇相應(yīng)的看門狗類型。
-
配置看門狗的參數(shù),包括計(jì)數(shù)器值、預(yù)分頻器、窗口值等,根據(jù)您的應(yīng)用需求進(jìn)行設(shè)置。您可以在"Configuration"面板中進(jìn)行配置。
-
在配置完成后,單擊"Project"菜單,選擇"Settings",然后在"Code Generator"選項(xiàng)中啟用看門狗的代碼生成。
-
單擊"Project"菜單,選擇"Generate Code",生成代碼并導(dǎo)出到您的工程目錄。
-
在您的代碼中,可以使用相關(guān)的看門狗函數(shù)來初始化和操作看門狗。
例如,如果使用獨(dú)立看門狗(IWDG),則可以使用以下函數(shù)進(jìn)行初始化和操作:
-
HAL_IWDG_Init()
:初始化獨(dú)立看門狗,設(shè)置計(jì)數(shù)器和預(yù)分頻器等參數(shù)。 -
HAL_IWDG_Start()
:?jiǎn)?dòng)獨(dú)立看門狗計(jì)數(shù)器。 -
HAL_IWDG_Refresh()
:刷新獨(dú)立看門狗計(jì)數(shù)器,防止看門狗超時(shí)復(fù)位系統(tǒng)。 -
HAL_IWDG_GetState()
:獲取獨(dú)立看門狗的狀態(tài),判斷是否發(fā)生看門狗超時(shí)。
對(duì)于窗口看門狗(WWDG),可以使用類似的函數(shù)來進(jìn)行配置和操作。
請(qǐng)注意,以上步驟僅涵蓋了基本的配置和應(yīng)用看門狗的過程。具體的步驟和函數(shù)名稱可能會(huì)根據(jù)您所使用的STM32系列和CubeMX版本而有所不同。建議參考官方文檔和相應(yīng)的參考手冊(cè)以獲取更詳細(xì)的信息和指導(dǎo)。
示例
獨(dú)立看門狗(IWDG)
以下是使用STM32F103C8T6單片機(jī)編寫?yīng)毩⒖撮T狗(IWDG)的代碼示例:
#include "stm32f1xx_hal.h"
IWDG_HandleTypeDef hiwdg;
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_4; // 設(shè)置預(yù)分頻器,產(chǎn)生IWDG時(shí)鐘頻率
hiwdg.Init.Reload = 4095; // 設(shè)置計(jì)數(shù)器重裝載值,用于設(shè)定看門狗超時(shí)時(shí)間
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
while (1)
{
HAL_IWDG_Refresh(&hiwdg); // 刷新看門狗計(jì)數(shù)器,防止看門狗超時(shí)復(fù)位系統(tǒng)
// 執(zhí)行其他任務(wù)和代碼
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
以上代碼示例中,主要步驟如下:
-
初始化HAL庫和系統(tǒng)時(shí)鐘。
-
定義
IWDG_HandleTypeDef
類型的變量hiwdg
,用于配置和操作獨(dú)立看門狗。 -
在
main()
函數(shù)中,使用HAL_IWDG_Init()
函數(shù)初始化獨(dú)立看門狗,設(shè)置預(yù)分頻器和計(jì)數(shù)器重裝載值。 -
在主循環(huán)中,使用
HAL_IWDG_Refresh()
函數(shù)刷新看門狗計(jì)數(shù)器,防止看門狗超時(shí)復(fù)位系統(tǒng)。您可以在此處添加其他任務(wù)和代碼。
請(qǐng)注意,此代碼示例中的時(shí)鐘配置是基于HSI(內(nèi)部高速時(shí)鐘)和PLL(鎖相環(huán))的基本配置。
窗口看門狗(WWDG)
以下是使用STM32F103C8T6單片機(jī)編寫窗口看門狗(WWDG)的代碼示例:
#include "stm32f1xx_hal.h"
WWDG_HandleTypeDef hwwdg;
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
hwwdg.Instance = WWDG;
hwwdg.Init.Prescaler = WWDG_PRESCALER_8; // 設(shè)置預(yù)分頻器,產(chǎn)生WWDG時(shí)鐘頻率
hwwdg.Init.Window = 127; // 設(shè)置窗口值
hwwdg.Init.Counter = 127; // 設(shè)置計(jì)數(shù)器重裝載值
if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
{
Error_Handler();
}
while (1)
{
HAL_WWDG_Refresh(&hwwdg, 127); // 刷新看門狗計(jì)數(shù)器,并設(shè)置窗口值
// 執(zhí)行其他任務(wù)和代碼
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
以上代碼示例中,主要步驟如下:
-
初始化HAL庫和系統(tǒng)時(shí)鐘。
-
定義
WWDG_HandleTypeDef
類型的變量hwwdg
,用于配置和操作窗口看門狗。 -
在
main()
函數(shù)中,使用HAL_WWDG_Init()
函數(shù)初始化窗口看門狗,設(shè)置預(yù)分頻器、窗口值和計(jì)數(shù)器重裝載值。 -
在主循環(huán)中,使用
HAL_WWDG_Refresh()
函數(shù)刷新看門狗計(jì)數(shù)器,并設(shè)置窗口值。您可以在此處添加其他任務(wù)和代碼。
注意事項(xiàng)
在使用看門狗時(shí),有幾個(gè)方面需要特別注意:
-
看門狗定時(shí)器的配置:確保正確配置看門狗的計(jì)數(shù)器值、預(yù)分頻器等參數(shù),以滿足您的應(yīng)用需求和系統(tǒng)穩(wěn)定性要求。過小的計(jì)數(shù)器值可能導(dǎo)致系統(tǒng)頻繁復(fù)位,而過大的計(jì)數(shù)器值則可能導(dǎo)致看門狗無法及時(shí)復(fù)位系統(tǒng)。
-
定時(shí)刷新看門狗:在主循環(huán)或關(guān)鍵任務(wù)中,確保及時(shí)刷新看門狗,以防止看門狗超時(shí)復(fù)位系統(tǒng)。刷新看門狗的操作應(yīng)該在預(yù)定的時(shí)間范圍內(nèi)完成,否則看門狗將認(rèn)為系統(tǒng)出現(xiàn)故障。
-
看門狗的啟動(dòng)和停止:確保在適當(dāng)?shù)臅r(shí)機(jī)啟動(dòng)和停止看門狗。通常,在系統(tǒng)初始化完成后啟動(dòng)看門狗,并在系統(tǒng)關(guān)閉或出現(xiàn)異常情況時(shí)停止看門狗。
-
系統(tǒng)穩(wěn)定性和測(cè)試:使用看門狗之前,確保系統(tǒng)的穩(wěn)定性和可靠性。進(jìn)行全面的系統(tǒng)測(cè)試,包括正常操作、異常情況、邊界條件等,以確保看門狗能夠按預(yù)期工作并保護(hù)系統(tǒng)免受故障影響。
-
注意看門狗的限制:了解您使用的具體看門狗的限制和特性。不同的單片機(jī)和看門狗模塊可能具有不同的特性和限制,如最大計(jì)數(shù)器值、精度、復(fù)位時(shí)間等。確保在使用中符合相關(guān)規(guī)范和要求。
-
處理看門狗超時(shí):當(dāng)看門狗超時(shí)發(fā)生時(shí),系統(tǒng)將被復(fù)位。如果出現(xiàn)看門狗超時(shí)復(fù)位,請(qǐng)仔細(xì)檢查系統(tǒng)代碼和硬件設(shè)計(jì),查找潛在的問題,例如任務(wù)優(yōu)先級(jí)、死循環(huán)、資源競(jìng)爭(zhēng)等。文章來源:http://www.zghlxwxcb.cn/news/detail-535572.html
總之,使用看門狗需要確保正確配置和及時(shí)刷新,同時(shí)進(jìn)行系統(tǒng)穩(wěn)定性測(cè)試和故障排查,以保證系統(tǒng)的可靠性和穩(wěn)定性。文章來源地址http://www.zghlxwxcb.cn/news/detail-535572.html
到了這里,關(guān)于單片機(jī)STM32看門狗詳解(嵌入式學(xué)習(xí))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!