<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>STM32窗口看門狗(WWDG)開源

STM32窗口看門狗(WWDG)開源

2022-11-14 | zip | 12.74 MB | 次下載 | 免費

資料介紹

描述

STM32F401xD/E 有兩個看門狗定時器——獨立看門狗 (IWDG) 和窗口看門狗 (WWDG)。在這個項目中,我們將看到如何激活并定期撫摸狗,我的意思是刷新看門狗。此外,如果您不在窗口內撫摸您的看門狗,例如太晚或太早撫摸(刷新),我們也會看到會發生什么。

假定讀者了解 STM32CubeMX、Keil MDK、GPIO、計數器的一些知識。

理論

顧名思義,看門狗正在監視 MCU 上運行的應用程序。這是一個監控功能。如果程序執行的正常順序出現任何異常-軟件故障,看門狗會檢測到它。然后它會啟動 MCU 復位,這將有助于重新啟動軟件。

從功能的角度來看,IWGD 和 WWDG 之間有兩個主要區別。

  • IWDG 不提供刷新窗口。[這意味著,IWDG 不在乎,只要在遞減計數器之前刷新它(WWDG_CR[6:0],翻轉]
  • IWDG 沒有像 WWDG 那樣提供中斷服務程序 (ISR)。[這意味著,就在啟動重??置之前,會生成一個中斷,您可以在其中編寫例程以安全退出。]

與 IWDG 不同,WWDG 由 APB1 外設時鐘提供時鐘。下圖顯示了 STM32CubeMX 的快照形式。

pYYBAGNxJheAd3IjAABJUnczUSI010.png
?

在這個項目中,我們將配置和測試這些案例。

  • 情況 1:激活 WWDG,我們不會刷新 WWDG 并通過倒計時計數器 WWDG_CR[6:0] 來檢查是否觸發了復位。我們將使用 Digilent-Analog Discovery (Legacy) 儀器監控復位線。
  • 案例 2:包括我們的例程以在窗口中刷新它,并看到 WWDG 沒有啟動重置。[此時我還沒有解釋這個窗口是什么。過段時間就會熟悉]
  • 案例 3:我們將過早刷新 WWDG 并檢查是否觸發了重置。
  • 案例 4:我們將啟用 EWI 中斷并編寫一個程序來切換那里的板載綠色 LED。我們將在示波器上觀察到 ISR 在啟動 MCU 復位之前執行。這是 WWDG 中的一項高級功能,在 IWDG 中不可用。

啟動項目..

1. 通過板選擇器在 STM32CubeMX 中創建一個項目。有關詳細信息,請參閱附件 - “創建 STM32CubeMX 項目”。

2. 在左側窗格中,展開 - System Core 并選擇 - WWDG。將出現一個顯示 WWDG 配置的窗口。那里點擊激活。這將使用下圖中第 3 部分中顯示的默認配置激活 WWDG。

poYBAGNxJh2AGoiMAAHNqqQwXGA131.png
?

讓我們了解這些 WWDG 時鐘參數。

pYYBAGNxJiCAJmFMAABexVZadKI023.png
?
poYBAGNxJiKAfqEWAACHTJvYDxY647.png
?

WWDG 計數器時鐘預分頻器:時鐘的結果值等于(PCLK1/4096)/預分頻器

  • PCKL1為 APB1 時鐘(STM32F401RE 為 42MHz)
  • 4096為內分頻器

[預分頻器只是一個時鐘分頻器。預分頻器越高,計數器的時鐘頻率就越低。因此計數需要更長的時間。]

讓我們選擇預分頻器為 8: (PCLK1/4096)/ 8

導致遞減計數器的 WWDG 時鐘為 (42MHz/4096)/8 = 1281.738 Hz。因此時鐘周期(1 個時鐘周期)約為。780us

tClkWwdg = 780us

窗口:WWDG 中的這個術語是指允許刷新看門狗的時間范圍。超出該區域被解釋為軟件故障,并且 MCU 復位由 WWDG 啟動。現在讓我們配置這個窗口。請在下面找到圖片。

poYBAGNxJiSAONr3AAAvX2IqWR8858.png
STM32F401RE參考手冊中的WWDG時序圖
?

突出顯示的 3 個參數定義了窗口。

T[6:0] 是遞減計數器的 WWDG_CR[6:0] 寄存器。最大值為 127。一旦看門狗被激活 WWDG_CR[7] 被設置,倒計時以 tClkWWDG 的速率開始。在這種情況下,它是 780us。

W[6:0] 是 WWDG_CFR[6:0] 寄存器,用于在運行時與遞減計數器進行比較的窗口值。

0x3F 是向下計數器計數的最低限制。一旦計數器達到該值,就會觸發復位。

當遞減計數器值大于 W[6:0] 且小于 0x3F 時,服務(刷新/更新)WWDG 很重要。未能在此窗口中刷新被 WWDG 解釋為軟件故障并啟動復位。

讓我們為看門狗窗口選擇一些值。

預分頻器 = 8;W = 94; T = 127。

pYYBAGNxJieAOYqtAABQ6NhAIKA063.png
?

現在讓我們計算時間。

遞減計數器從 127 遞減到 63 所用時間為 tWWDG = tClkWWDG * (127 - 63) = 49.92ms

從遞減計數器 127 開始直到達到 94 都不允許刷新,即 tNoRefr = tClkWWDG * (127-94) = 25.74ms

在 tNoRefr 和 tWWDG 之前允許刷新。

讓我們回到 CubeMX,切換到 Project Manager 視角并選擇 Keil MDK,保存項目并點擊 - 'Generate code'。

請注意,看門狗中斷(Early Wakeup Interrupt-EWI)保持禁用狀態。我們將在稍后部分討論它。

poYBAGNxJiqAUjdxAADko0JneZM911.png
STM32CubeMX項目經理視角
?
pYYBAGNxJiyAVrcwAAAvF3LV_f4722.png
?

選擇 Open project 并打開 Keil MDK IDE。如下圖所示,打開main.c文件。

pYYBAGNxJjGAFAmEAAH3kcbvyz0416.png
Keil MDK-main.c
?

構建項目,看看沒有錯誤。

右鍵單擊看門狗初始化函數并選擇轉到定義。

static void MX_WWDG_Init(void);

請注意,參數與我們在 CubeMX 中指定的一樣。

poYBAGNxJjOASlfUAAB_tuQzCk8580.png
?

也可以隨意查看源文件stm32f4xx_it.c,用于 EXTI(外部中斷/事件控制器)例程。目前我們還沒有配置任何中斷。在后面的部分中,我們將更深入地了解它。

poYBAGNxJjWAS2E2AAH7FI6gZFA955.png
?

部署和測試:

無需浪費太多時間,只需構建項目并將其部署到我們的 ST32F401RE Nucleo 板即可。

情況1:

由于我們尚未為 WWDG 提供服務,因此在遞減計數器達到 0x3F 后,將觸發 MCU 復位。我們將超級有用的 Digilent Analog Discovery 的示波器通道 1 連接到復位線并對其進行監控。

我們的預期是,WWDG 每大約 50 毫秒觸發一次復位。

CN4- Pin 5 is NRST

請參閱下面的兩張圖片以供參考。

pYYBAGNxJjeAbYCxAAA1ovjMUFI308.png
來自 Schematics 的快照
?
pYYBAGNxJjqALhNdAAGJJKr-mxY034.png
?

打開 Digilent 波形。我已經為通道 1 配置了一些測量選項 - x 光標,這將有助于我們查看復位發生的頻率。

poYBAGNxJjyAJJyOAAHXnXcyfEI559.png
?

構建項目并點擊調試按鈕。

讓我們從 RCC 外設監控 CRC 寄存器。窗口看門狗復位標志 (WWDGRRSTF) 和刪除復位標志 (RMVF) 在 CRC 寄存器中很重要。詳情請閱讀 STM32 MCU 參考手冊。為了方便起見,我剛剛提供了這兩個 RCC_CRC 寄存器的圖像。

pYYBAGNxJj-AEESUAAFGwN4hEsU548.png
?

?

poYBAGNxJkKAenljAAEBTXTIpmA919.png
?

回到凱爾..

pYYBAGNxJkSAZVejAAF6m6yyGPc927.png
?
poYBAGNxJkaAUZYBAADioIQC2dY569.png
?

代碼仍然停止。您會注意到我們設置了一些重置標志。在繼續進行干凈設置之前清除所有重置。

Click RMVF bit

Hit運行 (F5) 啟動程序

poYBAGNxJkiACMRRAACHnHcHza0281.png
?

您將立即看到 WWDGRSTF 設置。

pYYBAGNxJkuAQnhOAABJLPrCujU403.png
?

我們可以看到,正如預期的那樣,每 ca 都會切換一次重置線。52 毫秒。

poYBAGNxJk6ATBTgAAIFr6FunU8461.png
?

案例二:

讓我們撫摸我們的狗,讓它不叫。好的..我的意思是讓我們在窗口中刷新我們的 WWDG 看看會發生什么..

轉到 main.c。如果您仍處于調試模式,請退出調試透視圖。在無限的while循環中包含這段代碼。

HAL_Delay(30);
HAL_WWDG_Refresh(&hwwdg);

HAL_Delay(30) 將 MCU 暫停 30 毫秒。我們等待 30ms 并刷新 WWDG。現在可能很清楚,我們無法在 tNoRefr(25.74 毫秒)的持續時間內刷新看門狗。

pYYBAGNxJlGASQBqAAGwNp1d95w914.png
?

結果..應該有由WWDG觸發的任何重置。讓我們構建項目并檢查它..

按照與之前相同的步驟構建項目并在調試模式下打開它。設置 RMVF 位以清除復位標志并運行程序。您應該看到 WWDGRSTF 標志始終是清除的。

poYBAGNxJlOAD9YMAAC-sRRBsJ0526.png
?
pYYBAGNxJlWARPl2AAGhkLBBfvQ050.png
?

沒有重置。我們的狗很高興:)

案例3:

我們將過早刷新 WWDG 并檢查是否觸發了重置。

將延遲值從 30ms 修改為小于 tNoRefr (25.74ms) 的任何值。

我選擇 15 毫秒。

結果:

pYYBAGNxJliASPSWAAIedGntqSM669.png
?

由于我們很快就會刷新 WWDG,因此每 18 毫秒觸發一次重置。

案例4:

最有趣的部分。我們不應該忘記 WWDG 有一個漂亮的特性——它會在觸發休息之前產生一個中斷。這將幫助我們以安全狀態退出,比如說拍攝系統快照并存儲到 EEPROM 中。

讓我們通過啟用 EWI 中斷并編寫一個例程來切換板載綠色 LED 來檢查此功能。我們將在示波器上觀察到 ISR 在啟動 MCU 復位之前執行。這是 WWDG 中的一項高級功能,在 IWDG 中不可用。

可以使用 CubeMX 以圖形方式啟用 EWI,如下所示。

poYBAGNxJlqAGRvWAACN9WmKzKQ575.png
?

這還不夠。我們需要在 NVIC 設置中啟用看門狗中斷。如果不啟用全局看門狗中斷,僅啟用 EWI 不起作用,因為中斷將無法通過中斷控制器-NVIC。我強烈建議您閱讀參考手冊中的 EXTI 部分以了解更多詳細信息,因為這超出了本文的范圍。

poYBAGNxJlyAKi9aAADZX38gOvs857.png
?

保存項目并構建。這次當您切換回 Keil 時,它應該會詢問您文件是否已更新以及是否要加載它們。說,是的。

pYYBAGNxJl-ADfopAAG6o6_Onrc056.png
?

現在你應該在你的 Keil 項目中擁有最新的文件。轉到文件 stm32f4xx_it.c。您將在最后看到添加了這段額外的代碼(在紅色框中)。它是 WWDG 中斷處理程序。

poYBAGNxJmGALCAvAAGfGXuFRMM630.png
?

轉到 HAL_WWDG_IRQHandler(&hwwdg); 藍色框中指示的定義。

pYYBAGNxJmSAPRinAAIF4sG6ekA013.png
?

我們可以看到啟用了早期喚醒回調并為我們創建了 __weak 函數。復制該函數并將其粘貼到 main.c 并刪除 __weak。這就是我們將編寫例程以切換板載綠色 LED 以查看 ISR 是否在啟動復位之前執行的地方。請參閱下圖,指示它必須在 main.c 中復制的位置。在所有外設初始化功能完成后以及在用戶代碼開始和結束之間執行此操作。

pYYBAGNxJmaAXaK7AAIg0E5alpg823.png
?

讓我們從函數體中刪除所有內容并切換我們的板載 LED。

另外,注釋掉寫在 while(1) 無限循環中的代碼。這次我們將讓遞減計數器過去,并期望 WWDG 重置 MCU。但在此之前,我們希望它服務于我們的中斷。我們將通過每 20 毫秒切換一次 LED 來監控這一點。

請按照與之前相同的步驟構建項目并在調試模式下打開它。設置 RMVF 位以清除復位標志并運行程序。

結果:

請參閱顯示切換板載綠色 LED 的視頻-

?

?

示波器:

Ch1:NRST

通道 2:LED

poYBAGNxJmmAMikBAAIlUAYFcik989.png
?
poYBAGNxJmyAaYfpAAHUmvjpYdQ638.png
?

我們可以看到中斷是在大約生成的。復位前 780us,正好是之前的一個 WWDG 時鐘周期。但是每 52ms 觸發一次復位,即只有在遞減計數器倒數到 0x3F(十進制:63)之后。

注意:如果您需要有關 STM32F4 的 HAL 庫以及如何使用它們的完整信息,請參閱手冊 UM1725。STM32F4 HAL 和底層驅動說明

結論

我們已經在各種場景下對STM32F401RE的Window看門狗進行了配置和測試。在案例 4 中,我們看到了一些非常有趣的東西。板載 LED 不是每 20 毫秒切換一次。復位迫使 LED 關閉,因為 WWDG 只給 MCU 1 個時鐘周期來做任何重要的事情。由于每 52ms 發生一次復位,我們可能會將 LED 切換誤解為我們的 ISR 例程。事實上,HAL_GPIO_TogglePin()甚至沒有完全執行。它被重置破壞了。嘗試注釋掉HAL_Delay(),嘗試替換HAL_GPIO_TogglePin()to HAL_GPO_WritePin(),看看會發生什么。

同樣在啟用 EWI 的情況下,嘗試過早刷新 WWDG 并查看是否執行了 ISR。如果您有任何問題,請告訴我。我很高興聽到您的反饋。感謝您的閱讀!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>