完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
|
|
相关推荐
1个回答
|
|
|
1. 独立看门狗简介
STM32F4 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而是在 15~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。 2. 程序功能示例 在配置看门狗后,DS0 将常亮,如果 KEY_UP 按键按下,就喂狗,只要 KEY_UP 不停的按,看门狗就一直不会产生复位,保持 DS0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 DS0 熄灭一次。 3. 硬件设计 用到的硬件资源有: 1) 指示灯 DS0 2) KEY_UP 按键 3) 独立看门狗 前面两个在之前都有介绍,而独立看门狗实验的核心是在 STM32F4 内部进行,并不需要外部电路。但是考虑到指示当前状态和喂狗等操作,我们需要 2 个 IO 口,一个用来输入喂狗信号,另外一个用来指示程序是否重启。喂狗我们采用板上的 KEY_UP 键来操作,而程序重启,则是通过 DS0 来指示的。 4. 编程步骤 4.1 取消寄存器写保护(向 IWDG_KR 写入 0X5555 ) IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 4.2 设置独立看门狗的预分频系数和重装载值 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值 设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间(也就是看门狗溢出时间),该时间的计算方式为: 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,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。 4.3 重载计数值喂狗(向 IWDG_KR 写入 0XAAAA ) WDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器 4.4 启动看门狗(向 向 IWDG_KR 写入 0XCCCC) IWDG_Enable(); //使能 IWDG 5. 程序示例 iwdg.h文件 #ifndef __IWDG_H__#define __IWDG_H__#include “sys.h”//看门狗初始化void IWDG_Init(u8 prer, u16 value);//喂狗void IWDG_Feed(void);#endif/*__IWDG_H__*/ iwdg.c文件 #include “iwdg.h”//看门狗初始化void IWDG_Init(u8 prer, u16 value){ //取消写访问保护 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //设置预分频 IWDG_SetPrescaler(prer); //设置IWDG装载值 IWDG_SetReload(value); //重新装载 IWDG_ReloadCounter(); //使能看门狗 IWDG_Enable(); }//喂狗void IWDG_Feed(void){ //重新装载 IWDG_ReloadCounter();} main.c文件 #include “sys.h”#include “delay.h”#include “usart.h”#include “led.h”#include “beep.h”#include “key.h”#include “exti.h”#include “iwdg.h”int main(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); LED_Init(); KEY_Init(); uart_init(115200); LED2 = 0; delay_ms(100); //大约6秒 IWDG_Init(6, 500); printf(“程序初始化OKrn”); while(1) { if (Key_Scan() == WK_UP_PRESS) { //喂狗 IWDG_Feed(); printf(“喂狗rn”); } printf(“while do work rn”); delay_ms(1000); } } |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4130 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3221 浏览 1 评论
2747 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2175 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
14939 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3084浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1894浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2064浏览 3评论
1976浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2166浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 05:41 , Processed in 0.553259 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1074