![wKgaomYwSqiAY_PQAAnl063z3JE116.png](https://file1.elecfans.com/web2/M00/DF/57/wKgaomYwSqiAY_PQAAnl063z3JE116.png)
7.1實驗內容
通過本實驗主要學習以下內容:
- 獨立看門狗的原理
- 獨立看門狗功能介紹
- 實現獨立看門狗功能
7.2實驗原理
前面講到,看門狗的計數值在每一個計數器時鐘來的時候減1,那么這個時鐘是什么呢,我們來看一下GD32F470的時鐘樹:
![wKgZomY-0tuAXmybAABFzs052pI850.png](https://file1.elecfans.com/web2/M00/E4/2D/wKgZomY-0tuAXmybAABFzs052pI850.png)
從時鐘樹可以看到,FWDGT的時鐘來源于IRC32K,這是GD32F470的內部時鐘,典型的頻率值是32KHz。但要注意,這個IRC32K不是直接連到FWDGT計數器的,而是需要經過一個預分頻器,這個分頻器大小通過FWDGT_PSC進行設定。
預分頻寄存器(FWDGT_PSC):
![wKgaomY9eV-AOG5kAABcFQ1QEEw925.png](https://file1.elecfans.com/web2/M00/E4/B8/wKgaomY9eV-AOG5kAABcFQ1QEEw925.png)
![wKgZomY9eWiAWv51AAFYY6ZfqBc364.png](https://file1.elecfans.com/web2/M00/E3/D5/wKgZomY9eWiAWv51AAFYY6ZfqBc364.png)
![wKgaomY9eY6ASl7jAAFQREG8aQk297.png](https://file1.elecfans.com/web2/M00/E4/B8/wKgaomY9eY6ASl7jAAFQREG8aQk297.png)
如設定PS[2:0]為001b,那么計數器的時鐘頻率就為32K/8 = 4KHz,即每隔250us計數值減1。
7.2.1獨立看門狗(FWDGT)的重裝載
說完時鐘,我們來說下FWDGT的計數器和重裝載。計數器就是按照前面說的,每來一個計數器時鐘,計數器減1,而計數器的初始值,來自于重裝載寄存器。
重裝載寄存器(FWDGT_RLD):
![wKgaomY9eYaAVRGMAABaHu93Q8g730.png](https://file1.elecfans.com/web2/M00/E4/B8/wKgaomY9eYaAVRGMAABaHu93Q8g730.png)
![wKgZomY9eaCAClk4AAJfPNzGgew320.png](https://file1.elecfans.com/web2/M00/E3/D5/wKgZomY9eaCAClk4AAJfPNzGgew320.png)
從“描述”中我們可以看出,向FWDGT_CTL寫入0xAAAA(即喂狗,詳見用戶手冊FWDGT_CTL寄存器),重裝載寄存器中的數值就會自動加載到FWDGT的計數器中。
重裝載寄存器(FWDGT_RLD)是一個12位的計數器,這就意味著重裝載最大值為65535,再結合上一節的時鐘分頻,FWDGT設定的最大/最小超時周期見下表:
![wKgaomY-0xCARvf1AAEstf88zJE142.png](https://file1.elecfans.com/web2/M00/E5/10/wKgaomY-0xCARvf1AAEstf88zJE142.png)
7.2.2獨立看門狗的使用注意事項
獨立看門狗的時鐘源來自于IRC32K,這個內部時鐘實際上不是非常的準確,所以在設定看門狗重載值和分配器時需要留有一定的余量,防止應用程序由于IRC32K頻率偏差而來不及喂狗,導致不必要的MCU復位。
7.3硬件設計
本實驗我們通過紫藤派開發板LED0的狀態來指示MCU復位情況,用LED1來指示喂狗的情況。
7.4代碼解析
在driver_wdgt.c中定義了獨立看門狗的配置函數drive_fwdgt_config和喂狗函數Feed_fwdgt:
C void drive_fwdgt_config(uint16_t reload_value, uint8_t prescaler_div) { /* 開啟內部32K時鐘 */ rcu_osci_on(RCU_IRC32K); /* 等待時鐘ready */ while(SUCCESS != rcu_osci_stab_wait(RCU_IRC32K)){ } /*配置看門狗參數*/ fwdgt_config(reload_value,prescaler_div); /*開啟看門狗*/ fwdgt_enable(); } void Feed_fwdgt(void) { /* 重裝載計數器 */ fwdgt_counter_reload(); } |
以下為main函數代碼:
C int main(void) { uint8_t i; driver_init();//delay函數初始化 bsp_led_group_init();//LED初始化 bsp_led_on(&LED1);//點亮LED0 delay_ms(2000); //延時2s bsp_led_off(&LED1);//熄滅LED0 drive_fwdgt_config(625,FWDGT_PSC_DIV64);//獨立看門狗配置 /*閃爍LED1 5次,并每閃爍一次進行喂狗*/ for(i = 0;i<5;i++) { delay_ms(500); bsp_led_toggle(&LED2); Feed_fwdgt(); printf_log("Feed_fwdgt!/r/n") } while (1) { } } |
本例程main函數首先進行了延時函數初始化,再初始化LED0和LED1,并將LED0點亮2s鐘后熄滅,然后配置獨立看門狗時鐘預分頻為64分頻,重載值為1000,即超時時間為625/(32K/64)= 1.25s,再每500ms翻轉一次LED1,同時進行喂狗,最后進入while(1)循環。
7.5實驗結果
紫藤派開發板上電后,LED0燈亮,2s鐘后熄滅,隨后LED1閃爍5次,再經過一段時間后LED1燈滅,LED0復亮,周而復始。
-
看門狗
+關注
關注
10文章
566瀏覽量
70949 -
開發板
+關注
關注
25文章
5121瀏覽量
98196 -
GD32
+關注
關注
7文章
413瀏覽量
24471
發布評論請先 登錄
相關推薦
【GD32F470紫藤派開發板使用手冊】第十一講 SPI-SPI NOR FLASH讀寫實驗
![【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】第十一講 SPI-SPI NOR FLASH讀寫<b class='flag-5'>實驗</b>](https://file1.elecfans.com/web2/M00/E6/51/wKgZomZGuYCAbqxgAAAj5ISjOEU463.png)
【零基礎學習STM32】第七講:WWDG看門狗實驗——復位ARM
【GD32】GD32設置看門狗
![【<b class='flag-5'>GD</b>32】<b class='flag-5'>GD</b>32設置<b class='flag-5'>看門狗</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【GD32F303紅楓派開發板使用手冊】第二十講 SPI-SPI NAND FLASH讀寫實驗
![【<b class='flag-5'>GD32F</b>303紅楓<b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】第二十<b class='flag-5'>講</b> SPI-SPI NAND FLASH讀寫<b class='flag-5'>實驗</b>](https://file1.elecfans.com/web2/M00/F1/AD/wKgaomZzisiAamI-AABGtAQwDgo073.png)
評論