找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2545|回复: 0
收起左侧

[零基础学习STM32]第七讲:WWDG看门狗实验—复位ARM

[复制链接]
ID:278743 发表于 2018-3-12 16:03 | 显示全部楼层 |阅读模式
本帖最后由 kkhkbb 于 2018-3-13 08:40 编辑

一、概述
1、  WWDG看门狗简介
       IWDG看门狗存在这样一个问题,如果在喂狗的间隔期间,程序跑飞后又正确归位,独立看门狗无法发现这样的错误,程序将存在很大的危险。与IWDG看门狗不同,WWDG看门狗需要在一个规定的时间范围内喂狗才有效,这样可以较为有效的解决IWDG看门狗存在的问题。可以根据WWDG看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
2、  WWDG看门狗窗口说明
       WWDG看门狗在使用时,除了使能时钟和设置预分频值外,还需要设置窗口和计数器初值。在芯片内部,WWDG看门狗计数器是一个7位二进制递减计数器,当它从0x40翻转到0x3F时,系统会启动复位。只有计数器在窗口值和0x40之间的时候,喂狗才是有效的。如图7_0所示:
                          图7_0 WWDG工作原理图
二、硬件电路
                           图7_1 按键引脚
                             图7_2 按键
      iCore3双核心开发板中,采用一个独立的按键与STM32F407PH15相连,限流电阻为1K
三、实验原理
      本次实验使用的是常开带复位按键,从硬件电路上可以看出,当按键没有按下时,ARM芯片的ARM_KEY引脚读取到的值是高电平,按键按下后读取到的值为低电平,按键没有按下是正常喂狗,当按键按下后停止喂狗。
四、主函数
1.主函数
  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. }
复制代码
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);                             //设置预分频值
  19.         WWDG_SetWindowValue(100);                                        //设置窗口值
  20.         WWDG_Enable(127);                                                //设置计数器初值,并使能窗口看门狗

  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);                                            //重置计数器,喂狗
  39. }
复制代码
3.系统滴答定时器中断
  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. }
复制代码
五、实验现象
      iCore3 双核心板红色 LED 常亮,当按键一直按下,看门狗一直复位 ARM,红灯闪烁。
六、代码包下载
      网盘:http://pan.baidu.com/s/1qWEK7fQ

iCore3_7_WWDG.rar

909.11 KB, 下载次数: 10, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表