首页 > 编程知识 正文

stm32独立看门狗无效(看门狗窗口化怎么办)

时间:2023-05-03 10:52:11 阅读:75382 作者:4985

今天正好遇到使用风窗的情况,开始设置,这不太理解。 摸索了几个小时后,我终于明白了。 为了以防万一,做好记录。

如上图所示,APB1是从手册的屏幕截图中首先找到WWDG的时钟源。 接下来,看看以下WWDG复位条件的两个:当看门狗计数器(7位最大值127 )小于0x40 ) 64时,启动看门狗计数器将复位。 看门狗计数器可能大于设定的窗口值) )内喂狗也会复位。 关于窗口值,以下进行说明。

//*

* @ briefwdginitializationfunction

* @param None

* @retval None

*/

静态void MX _ wwdg _ init (void )

{

/*用户代码begin wwdg _ init0* /

/*用户代码end wwdg _ init0* /

/*用户代码begin wwdg _ init1* /

/*用户代码end wwdg _ init1* /

hwwdg.Instance=WWDG;

HW wdg.init.prescaler=wwdg _ prescaler _ 8; //分频系数

hwwdg.Init.Window=74;//窗口值

hwwdg.Init.Counter=74; /*看门狗计数器74-64=10 * 8.192=80毫秒* /

HW wdg.init.ewi模式=wwdg _ ewi _ disable;

if(Hal_wwdg_init ) HWwdg )!=HAL_OK )

{

Error_Handler (;

}

/*用户代码begin wwdg _ init2* /

/*用户代码end wwdg _ init2* /

}

首先,请查看初始化上面窗口监视的代码。 这将生成STM32cube软件初始化窗口监视的代码。 这里我们关心的主要有三个参数:hwwdg.Init.Prescaler。 这是分频参数,这个分频参数分为哪个? 请看下图。 分为PCLK/4096之后的值。 椭圆包围的部分是分频值。 (只能写0、1、2、3中的任意一个。 右上角的WDGTB就是这个值。 上面的WWDG_PRESCALER_8宏的值实际上是3。 像这样以2^3进行8分频。 该分频后的脉冲是用于减少看门狗计数器的脉冲,一个脉冲计数器为负。 hwwdg.Init.Window,它是第一个段落的window值,也就是这个值设置后,如果同时启动看门狗,看门狗计数器就会根据分频后的脉冲开始递减。 如果该计数器大于此窗口值时进行了喂狗操作,也会重置。 窗口的值起到此作用。 hwwdg.Init.Counter,这就是计数器的重载值,也就是喂完狗后,把这个值下载到下载计数器。

以上是一些说明,请看一个例子。 例如,主循环中只有一个函数正常运行的时间为20ms,应该为40ms。 所有其他运行时间都表示系统出现错误时,必须重置系统。 为了监视这个函数,我们打开了窗口监控并遵守了。

如果PCLK时钟为32Mhz,则分频系数为8分频,即hwwdg.Init.Prescaler=3。 于是,经过上图,计算32m Hz/4096/8976.5 Hz的时钟脉冲,减少到看门狗计数器。 从T=1/f导出1/(32MHz/4096/8 ),导出-T=4096*8/32Mhz=1.024ms。 说明当PCLK32Mhz分频系数为8时,少一个看门狗计数器所需时间为1.024ms。 如果您认为这个时间不合适,可以通过修改PCLK或更改分频系数来更改。 出现此递减计数器时间后,可以根据需要设置窗口值和计数值。 根据WWDG的说明,我们知道如果计数器小于64,系统就会复位。 如果计数的值为74,则74 - 64=10在超过10个之后复位。 以上计算的值为1.024ms,可以计算1个。 如果在count=74时不喂狗,系统将在1.024*10=10.24ms后复位。 如果主题重置的最大值为40ms,则计数的计数为64 (如果为40ms,则计数值为40/1.024 64 867104 ) (请注意计数值不超过127,如果不满足要求,则将PCLK和分频系数除以因为如果函数的执行时间为40ms以上,则系统进行复位,另一个条件的执行时间也必须为20ms以上。104-84=20约为20ms。 因此,在PCLK为32Mhz的情况下,可以如下初始化并完成主题请求。

hwwdg.Instance=WWDG;

HW wdg.init.prescaler=wwdg _ prescaler _ 8; //8分频/

hwwdg.Init.Window=84; //窗口值84

hwwdg.Init.Counter=104; //重载值104

系统运行:

while(1)。

{

系统运行(;

Hal_wwdg_refresh(HWwdg;

/*用户代码结束while * /

/*用户代码begin3* /

}

如上所述,可以满足主题的需要。

当然,如果系统复位的上限时间比超过40ms,不喂狗就复位没有下限时间,那么窗口值也设置为计数值就没有下限时间。 这两个值都可以在104达到目的。

以上是针对HAL库的操作,但实际上HAL的库也是对寄存器进行操作的。 需要寄存器操作时,也可以通过以下寄存器说明进行操作。

/* set wwdg计数器* /

write_reg(HWwdg-instance-Cr,) wwdg _ Cr _ wdga|HW wdg-init.counter );

/* set wwdg预订器和窗口* /

write_reg(HWwdg-instance-CFR,) HW wdg-init.ewi mode (HW wdg-init.prescaler );

HAL函数初始化时,实际上也按照上面的代码操作CR和CFR寄存器。 因此,寄存器操作只要根据手册直接操作即可,值直接代入值即可。

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