首页 > 编程知识 正文

看门狗(stm32看门狗仿真)

时间:2023-05-04 03:39:51 阅读:75307 作者:2324

独立看门狗(IWDG )独立看门狗由内部专用的40Khz低速时钟(内部RC时钟)驱动,即使主时钟发生故障也有效。

作用

如果单片机系统万一在外界干扰了死循环,看门狗可以复位。 看门狗的作用是在一定时间内(由定时计数器实现)没有接收到喂狗的信号)时,实现处理器的自动复位重启(发送复位信号)。

相关寄存器

键值寄存器iwdg _ kr markdown http://www.Sina.com /

0xCCCC 启动

计数器从复位值0xFFF倒计时计数器到末尾0x000开始计数。 (IWDG_RESET )产生复位信号

写入0xAAAA

注意:IWDG_PR和IWDG_RLR寄存器具有写保护功能。 要更改这两个寄存器的值,必须首先向IWDG_KR寄存器中写入0x5555。 如果向该寄存器写入其他值,则操作顺序混乱,寄存器受到保护。 重新装载操作(即写入0xAAAA )也会启动写保护功能。

操作流程:

解除寄存器写保护(向IWDG_KR写入0X5555 )设定独立看门狗的预分频系数和重载值喂狗(向IWDG_KR写入0XAAAA )启动看门狗(IWDG_KR 1iwdg_writeaccesscmd )将0XCCCC写入IWDG_KR ) 65//2voidiwdg _ set prescaler (uint8_ ti wdg _ prescaler ); 设置IWDG预分频值voidiwdg _ set reload (uint 16 _ tre load ); 设置IWDG重载值//3IWDG_ReloadCounter (; 根据//IWDG重载寄存器的值选择iwdg计数器//4IWDG_Enable (; 启用//IWDG注意,启用iwdg后,不能再关闭! 要关机,只能重新启动。

窗口狗(WWDG )窗口样例(WWDG )通常用于监视由于外部干扰或意外逻辑条件而导致的APP应用程序脱离正常操作序列而出现的软件故障。

倒计时必须在有限的时间窗口中更新。

T[6:0]排在WWDG_CR后7位,W[6:0]排在WWDG-CFR后7位。 T[6:0]

窗口监视的计数器,其中W[6:0]是窗口监视的上窗口,下窗口的值是固定的(0X40 )。 当窗口监视的计数器刷新到顶部窗口值以外或低于底部窗口值时,将发生复位。

就是只能再靠窗户喂狗了。

上窗口值(w(633600 ) )由用户自己设定,使窗口值大于0X40。

假设Fpclk1=36Mhz,可以计算超时调度。

相关寄存器控制寄存器(WWDG_CR ) )。

只有低8位有效,T[6:0]用于存储看门狗的计数器值,并随时更新。 每个窗口的看门狗计数周期(40962^ WDGTB )减去1。

该计数器的值从0X40变为0X3F时,将发生看门狗复位。

WDGA位是看门狗的激活位,该位由软件设置为1以启动看门狗。 请注意,一旦设置此位,则只能在硬件重置后清零。

设定寄存器(WWDG_CFR )

该位的EWI在早期清醒中断(即可能发生复位的前一级(t(6:0 )=0x40 ) )提醒我们需要喂狗。 否则会重置。

我们一般利用这个位来设置中断

窗口监视的计数器值减少到0X40时,该位被设置,中断打开后,发生中断。 可以通过在中断中将计数器值重新写入WWDG_CR来喂狗。

注意:在此情况下,进入中断后,必须在一个窗口看门狗计数周期以下的时间(在PCLK1频率为36M、WDGTB为0的条件下,该时间为113us ) )内重写WWDG_CR。 否则,将发生看门狗复位。

状态寄存器(WWDG_SR )是

此寄存器用于记录当前是否存在早期唤醒标志。 此寄存器只有位0有效,其他为保留位。

当计数器值达到40h时,此位由硬件设置为1。

必须用软件写0并清除。 在此位中写1无效。

操作步骤

启用WWDG设置窗口值和分频值,打开WWDG中断,将计数器初始值分组设置,使用看门狗写入中断服务函数RCC _ AP B1 periphclockcmd (RCC _ AP B1 per iph _ ) //WWDG时钟使能//WWDG与IWDG不同,IWDG有自己的40Khz时钟,没有使能问题。 //WWDG使用了PCLK1的时钟voidwwdg _ setwindowvalue (uint8_ twindowvalue ); //WindowValue看门狗的上窗口值voidwwdg _ set prescaler (uint 32 _ tw wdg _ prescaler ); //设定分频数WWDG_EnableIT (; //打开窗口监视中断//接下来进行中断优先顺序的配置,但在此不重复。 NVIC_Init ) )函数即可。 voidwwdg_enable(uint8_tcounter ); //该函数在设定计数器初始值的同时,启用窗口监控。 /*最后,写服务函数*///喂狗

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。