你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32加看门狗死机不复位

[复制链接]
lian-413271 提问时间:2018-5-25 10:57 /
小弟使用STM32F103,程序里使用了闹钟中断,开启了独立看门狗,主程序里循环喂狗,验证过看门狗是生效的;测试如果不喂狗的话可以出发复位;但是实际用起来以后,连续运行较长时间,STM32还是会死机,看门狗竟然没有让程序复位,难道看门狗也会死掉?
请教大神门有没有遇到这种问题啊?
收藏 评论4 发布时间:2018-5-25 10:57

举报

4个回答
七哥 回答时间:2018-5-25 14:48:31
本帖最后由 toofree 于 2018-5-25 14:49 编辑

喂狗也是有讲究的,不要在可能重复产生中断的中断服务函数里面喂狗。
万一程序死翘翘了,但是中断可不会死,这时候在中断里面喂狗的话,程序就会在跑飞和中断服务函数中切换。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

feixiang20 回答时间:2018-5-26 00:42:15
参考下【STM32F103独立看门狗不复位】有很多回复,下面是其中一段。
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。
看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号) 。
在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA,  IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位  。
IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。
只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32 的独立看门狗,启动过程可以按如下步骤实现(独立看门狗相关的库函数和定义分布在文件 stm32f10x_iwdg.h 和stm32f10x_iwdg.c 中) :
1)取消寄存器写保护(向 IWDG_KR 写入 0X5555)
通过这步,我们取消 IWDG_PR 和 IWDG_RLR 的写保护,使后面可以操作这两个寄存器,设置 IWDG_PR 和 IWDG_RLR 的值。这在库函数中的实现函数是:
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
2)设置独立看门狗的预分频系数和重装载值
设置看门狗的分频系数的函数是:
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);  //设置 IWDG 预分频值
设置看门狗的重装载值的函数是:
void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间 (也就是看门狗溢出时间) ,该时间的计算方式为:
Tout=((4×2^prer)  ×rlr) /40
其中 Tout 为看门狗溢出时间(单位为 ms) ;prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值) ;
比如我们设定 prer 值为 4, rlr 值为 625,那么就可以得到 Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
3)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
库函数里面重载计数值的函数是:
IWDG_ReloadCounter();   //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。 即实现独立看门狗的喂狗操作。
4)  启动看门狗(向 IWDG_KR 写入 0XCCCC)
库函数里面启动独立看门狗的函数是:
IWDG_Enable();   //使能 IWDG
通过这句,来启动 STM32 的看门狗。注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

lian-413271 回答时间:2018-6-11 19:42:59
最后才发现,主程序并没有挂掉。因为主程序里面是判断某个标志置位后才处理,否则什么都不处理。标志置位的条件是:RTC 1s的闹钟中断,不停的做定时递减。程序移植的是LoraWAN 节点的代码,里面实现了一个RTC定时器链表。我是利用这个定时器链表来做1s的计时的,但是运行一段时间后,发现这个RTC定时失效了,造成了程序死掉的假象。
现在还不清楚为什么会出现这个现象
jianxuan5527 回答时间:2020-7-10 11:43:53
lian-413271 发表于 2018-6-11 19:42
最后才发现,主程序并没有挂掉。因为主程序里面是判断某个标志置位后才处理,否则什么都不处理。标志置位的 ...

rtc的1s中断失效的问题,你找到原因了没有,我也碰到类似的问题,加了看门狗也是无法重启

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版