野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 343|回复: 5

关于独立看门狗例程的BUG(记录stm32学习中遇到的问题)

[复制链接]
发表于 2023-12-11 22:15:29 | 显示全部楼层 |阅读模式
本帖最后由 SSBY 于 2023-12-11 22:18 编辑

火哥的看门狗历程有一个比较重的BUG,就是延时几乎放在了程序的最前面,我在测试开发板的时候,就遇到了在LED熄灭期间(延时期间),使用复位按键RESET_KEY将程序复位后,程序复位后依旧亮起红灯;思考后明白了,因为清除看门狗复位标志位的函数在了延时函数后面,在如果手动复位前的一次复位是看门狗触发的,在我们按下键RESET_KEY,标志位未清除,所以程序重启后依旧判断看门狗复位标志位为1(我同样不理解为什么这个标志位不随程序重启置0,我不理解,但就现象来说,只有这种可能),所以依旧亮红灯;、
1.png


修改方法一:将延时放在了清楚标志位之后,红灯之前,就可以避免这种情况;(程序重启立即判断,符合条件立即清楚标志位,消除了BUG);
但我更推荐图2的修改方法二:程序复位后,优先判断标志位状态,并清除标志位;然后将延时函数放在点亮红色LED后,则看门狗复位后就变成了红灯直接亮起,短暂延时后熄灭,这样就可以认为红灯闪的时刻看门狗复位就触发了;其他现象还是与原程序一致,喂狗后绿灯亮起,直到再次超时复位;非看门狗复位程序则蓝灯亮起(包括重新烧录程序);
2.png



回复

使用道具 举报

发表于 2023-12-12 10:04:27 | 显示全部楼层
你这个也有BUG,再喂狗时,必须等待完红灯闪烁关闭后才亮绿灯
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-12 19:16:51 | 显示全部楼层
确实哎,等我再改
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-12 19:35:43 | 显示全部楼层
MO12138 发表于 2023-12-12 10:04
你这个也有BUG,再喂狗时,必须等待完红灯闪烁关闭后才亮绿灯

这个问题吧,是按键扫描函数的问题,火哥的按键扫描函数只能放在死循环里用(而且是独占死循环),我在研究原来那个BUG时就尝试过把扫描函数放在外面,结果就是松开时机必须是程序刚好运行到这个扫描函数才能生效;这就让我想了一下每个指令的优先级,这个程序里的判断按键扫描的优先级必须最优先执行,所以最好的方法应该就是用外部中断,检测按键的GPIO电平变化,喂狗,亮绿灯;现在再看窗口看门狗,学完了我就回来完善这个程序,先给自己挖个坑。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-12 20:15:57 | 显示全部楼层
本帖最后由 SSBY 于 2023-12-12 20:17 编辑

我自己也没想到,这么快就来填坑了,主要是当年练习的就是按键的外部中断,所以把那段程序直接剪切到中断就好了。
记得在主函数里使能外部中断。
  1. void KEY1_IRQHandler(void)
  2. {
  3.         //确保是否产生了 EXTI Line 中断
  4.         if (EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
  5.         {
  6.                 /* 按键1中断要触发的内容 */
  7.                 LED_GREEN;
  8.                 IWDG_Feed();

  9.                 //清除中断标志位
  10.                 EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
  11.         }
  12. }

  13. void KEY2_IRQHandler(void)
  14. {
  15.         //确保是否产生了 EXTI Line 中断
  16.         if (EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
  17.         {
  18.                 /* 按键2中断要触发的内容 */
  19.                
  20.                
  21.                
  22.                 //清除中断标志位
  23.                 EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);
  24.         }
  25. }
复制代码

回复 支持 1 反对 0

使用道具 举报

发表于 前天 08:56 | 显示全部楼层
独立看门狗的时钟由独立 RC 振荡器提供(可在待机和停止模式下运行),RCC 时钟控制和状态寄存器 (RCC_CSR)中的位0-LSION(内部低速振荡器使能位)初始值是0,默认关闭LSI RC振荡器。就是没有开启给看门狗的LSI时钟啊?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-28 21:27 , Processed in 0.112981 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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