完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、IWDG简介
STM32F103ZET6的独立看门狗(IWDG)是由内部LSI(内部约40KHZ低速时钟)时钟驱动的。由于IWDG是由内部低速时钟驱动,所以就算主时钟发生故障,IWDG依然能够工作。 由于LSI是一个内部RC时钟,所以时钟不是很准确的40KHZ,而是在30KHZ~60KHZ之间变化的时钟,所以IWDG时间的计算并不是很准确,只能是一个大概的值。一般用40KHZ来估算。 IWDG的计数器是一个递减计数器,当IWDG被激活后,计数器开始向下递减计数,当计数器计数至0x0000时产生复位信号,使芯片复位。 当芯片处于停止和待机模式下工作时,IWDG依然继续工作。 2、IWDG工作原理 当IWDG被激活后,IWDG的计数器开始向下递减计数,当IWDG的计数器的值递减到0x000时,芯片就会复位。所以为了保证芯片正常工作,必须在IWDG的计数器的值递减到0x000之前,重新给IWDG的计数器赋值,否者芯片就会不断的复位。 必须注意的是:IWDG一旦启用,就不能在被关闭,想要关闭IWDG,只能复位,并且在复位后不能打开IWDG。 3、IWDG的配置 IWDG的寄存器并不复杂,只有IWDG_KR键值寄存器、IWDG_PR分频寄存器、IWDG_RLR重装载寄存器这3个寄存器。 IWDG_KR键值寄存器: 当向IWDG_KR寄存器写入0xCCCC后,IWDG就开始工作,IWDG的计数器从IWDG_RLR寄存器的值开始向下递减计数,当计数到0x0000时,就会产生一个复位信号。 当向IWDG_KR寄存器写入0xAAAA后,IWDG_RLR中的值就会重新加载到IWDG计数器中,从而避免IWDG产品复位信号。 需要注意的是IWDG_RLR和IWDG_PR这两个寄存器是有写保护的,当操作这两个寄存器的时候,必须先向IWDG_KR寄存器写入0x5555,之后才能操作IWDG_RLR和IWDG_PR这两个寄存器。 IWDG_PR寄存器: IWDG_PR寄存器是IWDG的预分频寄存器。IWDG_PR寄存器可以对IWDG的时钟进行分频,分频系数从4分频到256分频。IWDG_PR寄存器只用到了低3位,PR[2:0]组成IWDG的分频系数。如下: PR[2:0] = 000: 4分频 PR[2:0] = 001: 8分频 PR[2:0] = 010: 16分频 PR[2:0] = 011: 32分频 PR[2:0] = 100: 64分频 PR[2:0] = 101: 128分频 PR[2:0] = 110: 256分频 PR[2:0] = 111: 256分频 IWDG_RLR寄存器: IWDG_RLR寄存器只有低12位有效,所以IWDG的计数值最大只有0xFFF。 IWDG的配置流程: 首先向IWDG_KR写入0x5555,取消IWDG_PR和IWDG_RLR的写保护; 取消写保护之后设置IWDG_PR和IWDG_RLR的值; 为了将IWDG_RLR寄存器的值加载到IWDG的计数器中,将0xAAAA的值写入IWDG_KR寄存器中。 最后将值0xCCCC写入IWDG_KR寄存器中启动IWDG。 IWDG的时间计算: 假设IWDG的预分频系数为pr,重装载值为rlr,那么IWDG的时间计算公式为: T = ((4*2^pr)*rlr)/40000 (计算后的单位为秒) 4、HAL库操作IWDG IWDG初始化代码如下: void IWDG_Init(void){ IWDG_HandleTypeDef IWDG_Handle; IWDG_Handle.Instance = IWDG; IWDG_Handle.Init.Prescaler = IWDG_PRESCALER_4; IWDG_Handle.Init.Reload = 0xFFF; HAL_IWDG_Init(&IWDG_Handle);} IWDG_Handle是IWDG的句柄。 IWDG_Handle.Instance = IWDG是将句柄指向外设IWDG。 IWDG_Handle.Init.Prescaler = IWDG_PRESCALER_4是设定IWDG的分频系数。 IWDG_Handle.Init.Reload = 0xFFF是设定IWDG的重装载值。 HAL_IWDG_Init(&IWDG_Handle)是将句柄传入HAL_IWDG_Init函数对IWDG进行初始化。 IWDG重新更新计数器(喂狗)代码如下: void IWDG_CLR(void){ IWDG_HandleTypeDef IWDG_Handle; IWDG_Handle.Instance = IWDG; HAL_IWDG_Refresh(&IWDG_Handle); } 将句柄参数传入HAL_IWDG_Refresh函数,HAL_IWDG_Refresh函数的作用是更新IWDG的计数值,防止IWDG的计数值计算到0x0000时产生复位信号。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 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 08:42 , Processed in 1.395365 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号