打印

STM32的喂狗时间计算/求验证

[复制链接]
3747|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tacet_alex|  楼主 | 2013-8-21 23:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*看门狗函数*/
void IWDG_test(void)
{
  /* IWDG timeout equal to 280 ms (the timeout may varies due to LSI frequency
     dispersion) */
  /* Enable write access to IWDG_PR and IWDG_RLR registers */
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

  /* IWDG counter clock: 40KHz(LSI) / 32 = 1.25 KHz */
  IWDG_SetPrescaler(IWDG_Prescaler_32);             //预分频寄存器(IWDG_PR)

  /* Set counter reload value to 349 */                                                                                                                                    //4*2^3=32
  IWDG_SetReload(349);                                                         //重装载寄存器(IWDG_RLR)  重此值递减 喂狗时间T=40Khz/((4*2^prer )* rlr)=3.6ms

  /* Reload IWDG counter */
  IWDG_ReloadCounter();                     //键寄存器(IWDG_KR)写入0xAAAA

  /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
  IWDG_Enable();                                  //键寄存器(IWDG_KR)写入0xCCCC,启动看门狗工作

}
我看网上是这么算的:T=40Khz/((4*2^prer )* rlr)~那我写的349就应该等于3.6ms~
想请问一下这样算对么~~如果对的话请再对比一下这个
void Wdt_Init(void)
{
// Enable write access to IWDG_PR and IWDG_RLR registers
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //IWDG->KR = 0x5555

// IWDG counter clock: 40KHz(LSI) / 64 = 0.625 KHz
IWDG_SetPrescaler(IWDG_Prescaler_256);   //IWDG->PR = 0x06;

// Set counter reload value to 1250
IWDG_SetReload(0xfff);           //IWDG->RLR =0xFFF

  Red IWDG counter
  IWDG_ReloadCounter();   //IWDG->KR = 0xAAAA

/ Enable IWDG (the LSI oscillator will be enabled by hardware)
IWDG_Enable();   //IWDG->KR = 0xCCCC

}

//喂狗
void Kick_Dog(void)
{
    //Reload IWDG counter
    IWDG_ReloadCounter();   //IWDG->KR = 0xAAAA         
}

/*上面这个看门狗有 /256   26214.4 ms。即2s多一点时间没有喂狗就复位。*/
同样的算法上边不对呢~~新人求释疑!!先行谢过~~
沙发
xxiao6130| | 2013-8-22 08:13 | 只看该作者
不懂,帮你顶一下

使用特权

评论回复
板凳
tacet_alex|  楼主 | 2013-8-22 20:01 | 只看该作者
求解释求解释~~~

使用特权

评论回复
地板
tacet_alex|  楼主 | 2013-8-23 14:57 | 只看该作者
自己回答吧~大概确认了~式子确实是错了~应该是Tout=((4×2^prer) ×rlr) /40
其中Tout 为看门狗溢出时间(单位为ms);prer 为看门狗时钟预分频值(IWDG_PR 值),
范围为0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);~~

1)向IWDG_KR 写入0X5555。
通过这步,我们取消IWDG_PR 和IWDG_RLR 的写保护,使后面可以操作这两个寄存器。
设置 IWDG_PR 和IWDG_RLR 的值。
这两步设置看门狗的分频系数,和重装载的值。由此,就可以知道看门狗的喂狗时间(也
就是看门狗溢出时间),该时间的计算方式为:
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,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
2)向IWDG_KR 写入0XAAAA。
通过这句,将使STM32 重新加载IWDG_RLR 的值到看门狗计数器里面。也可以用该命令
来喂狗。
3)向IWDG_KR 写入0XCCCC。
通过这句,来启动 STM32 的看门狗。注意IWDG 在一旦启用,就不能再被关闭!想要关
闭,只能重启,并且重启之后不能打开IWDG,否则问题依旧,所以在这里提醒大家,如果不
用IWDG 的话,就不要去打开它,免得麻烦。
通过上面 3 个步骤,我们就可以启动STM32 的看门狗了,使能了看门狗,在程序里面就
必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们通过一个LED 灯来指
示程序是否重启,来验证STM32 的独立看门狗。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝