找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3084|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

[零基礎(chǔ)學(xué)習(xí)STM32]第七講:WWDG看門狗實(shí)驗(yàn)—復(fù)位ARM

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:278743 發(fā)表于 2018-3-12 16:03 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
本帖最后由 kkhkbb 于 2018-3-13 08:40 編輯

一、概述
1、  WWDG看門狗簡介
       IWDG看門狗存在這樣一個問題,如果在喂狗的間隔期間,程序跑飛后又正確歸位,獨(dú)立看門狗無法發(fā)現(xiàn)這樣的錯誤,程序?qū)⒋嬖诤艽蟮奈kU。與IWDG看門狗不同,WWDG看門狗需要在一個規(guī)定的時間范圍內(nèi)喂狗才有效,這樣可以較為有效的解決IWDG看門狗存在的問題?梢愿鶕(jù)WWDG看門狗通常被用來監(jiān)測由外部干擾或不可預(yù)見的邏輯條件造成的應(yīng)用程序背離正常的運(yùn)行序列而產(chǎn)生的軟件故障。
2、  WWDG看門狗窗口說明
       WWDG看門狗在使用時,除了使能時鐘和設(shè)置預(yù)分頻值外,還需要設(shè)置窗口和計(jì)數(shù)器初值。在芯片內(nèi)部,WWDG看門狗計(jì)數(shù)器是一個7位二進(jìn)制遞減計(jì)數(shù)器,當(dāng)它從0x40翻轉(zhuǎn)到0x3F時,系統(tǒng)會啟動復(fù)位。只有計(jì)數(shù)器在窗口值和0x40之間的時候,喂狗才是有效的。如圖7_0所示:
                          圖7_0 WWDG工作原理圖
二、硬件電路
                           圖7_1 按鍵引腳
                             圖7_2 按鍵
      iCore3雙核心開發(fā)板中,采用一個獨(dú)立的按鍵與STM32F407PH15相連,限流電阻為1K。
三、實(shí)驗(yàn)原理
      本次實(shí)驗(yàn)使用的是常開帶復(fù)位按鍵,從硬件電路上可以看出,當(dāng)按鍵沒有按下時,ARM芯片的ARM_KEY引腳讀取到的值是高電平,按鍵按下后讀取到的值為低電平,按鍵沒有按下是正常喂狗,當(dāng)按鍵按下后停止喂狗。
四、主函數(shù)
1.主函數(shù)
  1. //--------------------------- Variable --------------------------//
  2. unsigned long int time_delay = 0;
  3. //--------------------- Function Prototype ----------------------//
  4. static void delay(unsigned long int ms);
  5. //--------------------------- Function --------------------------//
  6. /*
  7. * Name                : main
  8. * Description         : ---
  9. * Author              : ysloveivy.
  10. *
  11. * History
  12. * --------------------
  13. * Rev                 : 0.00
  14. * Date                : 11/21/2015
  15. *
  16. * create.
  17. * --------------------
  18. */
  19. int main(void)
  20. {
  21.         int i;
  22.         for(i = 0;i < 10000000;i++);
  23.         led.initialize();
  24.         key.initialize();
  25.         systick.initialize();
  26.         wwdg.initialize();
  27.         LED_RED_ON;
  28.         while(1){
  29.                 while(!KEY_INPUT);
  30.                 delay(30);                                 //30ms喂狗
  31.                 wwdg.feed_dog();
  32.         }
  33. }
  34. /*
  35. * Name                : delay
  36. * Description         : ---
  37. * Author              : ysloveivy.
  38. *
  39. * History
  40. * --------------------
  41. * Rev                 : 0.00
  42. * Date                : 11/21/2015
  43. *
  44. * create.
  45. * --------------------
  46. */
  47. static void delay(unsigned long int ms)
  48. {
  49.         time_delay = ms;
  50.         while(time_delay != 0);
  51. }
復(fù)制代碼
2.WWDG初始化及喂狗代碼
  1. /*
  2. * Name               : initialize
  3. * Description        : ---
  4. * Author             : ysloveivy.
  5. *
  6. * History
  7. * -------------------
  8. * Rev                : 0.00
  9. * Date               : 11/21/2015
  10. *
  11. * create.
  12. * -------------------
  13. */
  14. static int initialize(void)
  15. {
  16.         //21.06ms 49.9ms之間喂狗
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);             //使能窗口看門狗時鐘
  18.         WWDG_SetPrescaler(WWDG_Prescaler_8);                             //設(shè)置預(yù)分頻值
  19.         WWDG_SetWindowValue(100);                                        //設(shè)置窗口值
  20.         WWDG_Enable(127);                                                //設(shè)置計(jì)數(shù)器初值,并使能窗口看門狗

  21.         return 0;
  22. }
  23. /*
  24. * Name               : feed_dog
  25. * Description        : ---
  26. * Author             : ysloveivy.
  27. *
  28. * History
  29. * -------------------
  30. * Rev                : 0.00
  31. * Date               : 11/21/2015
  32. *
  33. * create.
  34. * -------------------
  35. */
  36. static void feed_dog(void)
  37. {
  38.         WWDG_SetCounter(127);                                            //重置計(jì)數(shù)器,喂狗
  39. }
復(fù)制代碼
3.系統(tǒng)滴答定時器中斷
  1. /*
  2. * Name               : SysTick_Handler
  3. * Description        : ---
  4. * Author             : ysloveivy.
  5. *
  6. * History
  7. * -------------------
  8. * Rev                : 0.00
  9. * Date               : 11/21/2015
  10. *
  11. * create.
  12. * -------------------
  13. */
  14. void SysTick_Handler(void)
  15. {
  16.         static int counter = 0;
  17.         if((counter ++ % 1000) == 0){
  18.                 systick.second_flag = 1;
  19.         }
  20.         time_delay --;
  21. }
復(fù)制代碼
五、實(shí)驗(yàn)現(xiàn)象
      iCore3 雙核心板紅色 LED 常亮,當(dāng)按鍵一直按下,看門狗一直復(fù)位 ARM,紅燈閃爍。
六、代碼包下載
      網(wǎng)盤:http://pan.baidu.com/s/1qWEK7fQ

iCore3_7_WWDG.rar

909.11 KB, 下載次數(shù): 10, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表