完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
STM32 内部自带了 2 个看门狗:独立看门狗( IWDG )和窗口看门狗( WWDG)。本文将详细讲解关于独立看门狗( IWDG)的定义、要点及使用方法。
0x01、什么是看门狗 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成 整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑, 便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。 0x02、什么是独立看门狗IWDG 通俗点讲IWDG就是STM32中的一个12位的递减计数器,当计数器减到0时,系统会产生一个复位信号,重启单片机。所以,我们在使用看门狗时,需要在计数器减到0之前刷新计数器的值,使看门狗不产生复位信号,表示单片机工作正常。这个动作就是我们经常说的喂狗。超过一定时间没有喂狗,我们就认为单片机挂了。 0x03、IWDG的特点 1、独立看门狗的时钟是由个内部独立的 40kHz 的 RC 振荡器提供时钟,即使主时钟发生故障,它也仍然有效。(RC振荡器 LSI频率一般在 30~60KHZ之间,根据温度和工作场合会有一定的漂移,我们一般取40KHZ) 2、看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。 3、可以通过预分频寄存器来设置看门狗时钟的分频系数。 0x04、IWDG的使用 独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。 0x0001、IWDG相关寄存器 IWDG共有4个寄存器,键值寄存器IWDG_KR、预分配寄存器IWDG_PR、重载寄存器IWDG_RLR、状态寄存器IWDG_SR。 0x00011、IWDG_KR 键值寄存器 Bits 31:16 Reserved, must be kept at reset value. 保留,必须保持在复位值 Bits 15:0 KEY[15:0]: Key value (write only, read 0000h) These bits must be written by software at regular intervals with the key value AAAAh,otherwise the watchdog generates a reset when the counter reaches 0. Writing the key value 5555h to enable access to the IWDG_PR and IWDG_RLR registers (see Section 19.3.2) Writing the key value CCCCh starts the watchdog (except if the hardware watchdog option is selected) 该寄存器必须定时写入0xAAAA,否则当计数器递减到0时,看门狗将产生复位信号。 写入0x5555,表示允许访问 IWDG_PR 和 IWDG_RLR 寄存器 写入0xcccc,表示启动看门狗(如果选择了硬件看门狗,则不受此命令字限制) 0x00012、IWDG_PR 预分频寄存器 Bits 31:3 Reserved, must be kept at reset value. 保留,必须保持在复位值 Bits 2:0 PR[2:0]: Prescaler divider 预分频器 These bits are write access protected seeSection 19.3.2. They are written by software to select the prescaler divider feeding the counter clock. PVU bit of IWDG_SR must be reset in order to be able to change the prescaler divider. 这些位具有写访问保护,请参阅第19.3.2节。它们是由软件改写,用来选择供给计数器时钟的预分频器。IWDG_SR寄存器的PVU位必须复位,以便能够改变预分频器。 000: divider /4 001:divider /8 010:divider /16 011: divider /32 100:divider /64 101:divider /128 110:divider /256 111:divider /256 Note: Reading this register returns the prescaler value from the VDD voltage domain. This value may not be up to date/valid if a write operation to this register is ongoing. 注:读取该寄存器将从VDD电压域返回预分频器值。如果对此寄存器的写入操作正在进行,则此值可能不是最新的、无效的。 For this reason the value read from this register is valid only when the PVU bit in the IWDG_SR register is reset. 因此,仅当IWDG_SR寄存器中的PVU位复位时,从该寄存器读取的值才有效。 0x00013、IWDG_RLR 重载寄存器 Bits 31:12 Reserved, must be kept at reset value. 保留,必须保持在复位值 Bits11:0 RL[11:0]:Watchdog counter reload value 看门狗计数器重新加载值 These bits are write access protected see Section 19.3.2. They are written by software to define the value to be loaded in the watchdog counter each time the value AAAAh is written in the IWDG_KR register. The watchdog counter counts down from this value. The timeoutperiod is a function of this value and the clock prescaler. Refer to Table 96.The RVU bit in the IWDG_SR register must be reset in order to be able to change the reload value. 这些位具有写访问保护,见第19.3.2节。它们由软件改写,以定义每次将AAAAh值写入IWDG_KR寄存器时要加载到看门狗计数器中的值。看门狗计数器从该值开始倒计时。 timeoutperiod是这个值和时钟预分频器的函数。参考表96。IWDG_SR寄存器中的RVU位必须复位,以便能够更改重新加载值。 Note: Reading this register returns the reload value from the VDD voltage domain. This value may not be up to date/valid if a write operation to this register is ongoing on this register. For this reason the value read from this register is valid only when the RVU bit in the IWDG_SR register is reset. 注意:读取此寄存器将返回VDD电压域的重新加载值。如果对该寄存器的写入操作正在该寄存器上进行,则该值可能不是最新的、无效的。因此,仅当IWDG_SR寄存器中的PVU位复位时,从该寄存器读取的值才有效。 0x00014、IWDG_SR 重载寄存器 Bits 31:2 Reserved, must be kept at reset value. 保留,必须保持在复位值 Bit 1 RVU:Watchdog counter reload value update 看门狗计数器重新加载值更新 This bit is set by hardware to indicate that an update of the reload value is ongoing. It is reset by hardware when the reload value update operation is completed in the VDD voltage domain(takes up to 5 RC 40 kHz cycles). 该位由硬件设置,以指示正在进行重新加载值的更新。当在VDD电压域中完成重新加载值更新操作时(最多需要5个RC 40 kHz周期),由硬件重置。 Reload value can be updated only when RVU bit is reset. 重新加载值只能在RVU位复位时更新。 Bit 0 PVU: Watchdog prescaler value update 看门狗预分频器值更新 This bit is set by hardware to indicate that an update of the prescaler value is ongoing. It is reset by hardware when the prescaler update operation is completed in the VDD voltage domain (takes up to 5 RC 40 kHz cycles). 该位由硬件设置,以指示正在进行预分频器值的更新。当预分频器更新操作在VDD电压域中完成时(最多需要5个RC 40 kHz周期),由硬件重置。 Prescaler value can be updated only when PVU bit is reset. 预分频器值只能在PVU位复位时更新。 0x0002、IWDG相关库函数 我们通过官方库文件(STM32F10x_StdPeriph_Lib_V3.5.0)来操作IWDG分为以下几步: 0x00021、IWDG_WriteAccessCmd 函数名:void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) 函数功能:取消或开启IWDG_PR 和 IWDG_RLR 寄存器的写保护 参数1:uint16_t IWDG_WriteAccess —> IWDG_WriteAccess_Enable(取消寄存器写保护)、IWDG_WriteAccess_Disable(开启寄存器写保护)。 返回值:无 0x00022、IWDG_SetPrescaler 函数名:void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) 函数功能:设置看门狗IWDG时钟的预分频系数 参数1:uint8_t IWDG_Prescaler —> IWDG_Prescaler_4 IWDG_Prescaler_8 IWDG_Prescaler_16 IWDG_Prescaler_32 IWDG_Prescaler_64 IWDG_Prescaler_128 IWDG_Prescaler_256 返回值:无 总结分频系数公式为:4 × 2^Prescaler。看门狗运行频率公式为:40 000 / (4 × 2^Prescaler),每秒计数次数为:4 × 2^Prescaler / 40 000 这里比较烧脑的就是4 × 2^Prescaler这个计算,如果你需要选取分频系数,建议不要运算,直接用宏定义来选取 例如: IWDG_Prescaler取值为IWDG_Prescaler_4,IWDG运行频率为:40 000 / 4 = 10 000Hz,即每秒计数10 000次。 IWDG_Prescaler取值为IWDG_Prescaler_8,IWDG运行频率为:40 000 / 8 IWDG_Prescaler取值为IWDG_Prescaler_16,IWDG运行频率为:40 000 / 16 IWDG_Prescaler取值为IWDG_Prescaler_32,IWDG运行频率为:40 000 / 32 以此类推。 0x00023、IWDG_SetReload 函数名:void IWDG_SetReload(uint16_t Reload) 函数功能:设置 IWDG 重装载值 参数1:uint16_t Reload —> 0到0x0FFF,表示IWDG计数器要计数的次数 返回值:无 以上两个函数决定了IWDG的溢出时间,计算公式如下:TimeOut = Reload × 4 × 2^Prescaler / 40 000 因为在使用看门狗的时候,我们需要根据我们要定时的时间来反推上述函数中的两个不定的参数,这种计算比较麻烦,所以下面我给出一个1S时间基准的例子,根据这个基准调节参数最终得到你想要的时间值 我们选择Reload = 625 , Prescaler = IWDG_Prescaler_64 ,定时时间 TimeOut = 625 × 64 / 40 000 = 1s 0x00024、IWDG_ReloadCounter 函数名:void IWDG_ReloadCounter(void) 函数功能:重载IWDG 参数1:无 返回值:无 0x00025、IWDG_Enable 函数名:void IWDG_Enable(void) 函数功能:使能IWDG,并开启 IWDG_PR 和 IWDG_RLR 寄存器的写保护 参数1:无 返回值:无 0x0003、自行编写的IWDG相关函数 至此,我们启动 IWDG 的整个过程就完成了,下面我们编写一个属于自己的 IWDG 初始化及启动函数 /***@brief 初始化独立看门狗*@param 参数1:prer 分频数:0~7(只有低 3 位有效!)分频因子=4*2^prer.但最大值只能是 256! * IWDG_Prescaler_4: 对40KHz进行4分频* IWDG_Prescaler_8: 对40KHz进行8分频* IWDG_Prescaler_16: 对40KHz进行16分频* IWDG_Prescaler_32: 对40KHz进行32分频* IWDG_Prescaler_64: 对40KHz进行64分频* IWDG_Prescaler_128: 对40KHz进行128分频* IWDG_Prescaler_256: 对40KHz进行256分频* 参数2:rlr 重装载寄存器值:低 11 位有效.取值范围为0到0x0FFF。*@return 无*/void IWDG_Init(uint8_t prer,uint16_t rlr){ IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作 IWDG_SetPrescaler(prer); //设置IWDG预分频值:设置IWDG预分频值 IWDG_SetReload(rlr); //设置IWDG重装载值 IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器 IWDG_Enable(); //使能IWDG} 在 IWDG时间内,我们需要周期性调用以下函数进行喂狗 /***@brief 喂独立看门狗*@param 无 *@return 无*/void IWDG_Feed(void){ IWDG_ReloadCounter(); //重载} |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:18 , Processed in 0.786447 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号