1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
一、 窗口看门狗概述
之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。而独立看门狗限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。 示意图: 框图: STM32F的窗口看门狗中有一个7位的递减计数器T[6:0],它会在出现下述2种情况之一时产生看门狗复位: 1、当喂狗的时候如果计数器的值大于某一设定数值W[6:0]时,此设定数值在WWDG_CFR寄存器定义。 2、当计数器的数值从0x40减到0x3F时【T6位跳变到0】 。 如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以用于喂狗以避免WWDG复位。 超时时间: 其他注意事项: 1、上窗口值W[6:0]必须大于下窗口值0x40。否则就无窗口了。 2、窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。 二、常用寄存器和库函数描述 1、控制寄存器WWDG_CR void WWDG_Enable(uint8_t Counter);//启动并设置初始值 void WWDG_SetCounter(uint8_t Counter);//喂狗 2、配置寄存器WWDG_CFR void WWDG_EnableIT(void);//使能提前唤醒中断 void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); void WWDG_SetWindowValue(uint8_t WindowValue); 3、状态寄存器WWDG_SR FlagStatus WWDG_GetFlagStatus(void); void WWDG_ClearFlag(void); 三、窗口看门狗的一般配置步骤 使能看门狗时钟: ① RCC_APB1PeriphClockCmd(); ② 设置分频系数: WWDG_SetPrescaler(); ③ 设置上窗口值: WWDG_SetWindowValue(); ④ 开启提前唤醒中断并分组(可选): WWDG_EnableIT(); NVIC_Init(); ⑤ 使能看门狗: WWDG_Enable(); ⑥ 喂狗: WWDG_SetCounter(); ⑦编写中断服务函数 WWDG_IRQHandler(); 四、具体代码 wwdg.c include "WWDG.h" #include "led.h" //保存WWDG计数器的设置值,默认为最大. u8 WWDG_CNT=0x7f; //初始化窗口看门狗 //tr :T[6:0],计数器值 //wr :W[6:0],窗口值 //fprer:分频系数(WDGTB),仅最低2位有效 //Fwwdg=PCLK1/(4096*2^fprer). void WWDG_NVIC_Init() { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占2,子优先级3,组2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占2,子优先级3,组2 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);//NVIC初始化 } void WWDG_Init(u8 tr,u8 wr,u32 fprer) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG时钟使能 WWDG_CNT=tr&WWDG_CNT; //初始化WWDG_CNT. WWDG_SetPrescaler(fprer);设置IWDG预分频值 WWDG_SetWindowValue(wr);//设置窗口值 ,指定的窗口值。该参数取值必须在 0x40 与 0x7F 之间。 WWDG_Enable(WWDG_CNT); // 使能 WWDG 并装入计数器值(1) Counter:指定看门狗计数器值。该参数取值必须在 0x40 与 0x7F 之间。 WWDG_ClearFlag();//清除提前唤醒中断标志位 WWDG_NVIC_Init();//初始化窗口看门狗 NVIC WWDG_EnableIT(); //开启窗口看门狗中断 } //重设置WWDG计数器的值 void WWDG_Set_Counter(u8 cnt) { WWDG_Enable(cnt);//使能看门狗 , 设置 counter . } //窗口看门狗中断服务程序 void WWDG_IRQHandler(void) //当计数器值到达0x40之后,执行中断服务函数 { WWDG_SetCounter(WWDG_CNT); //当禁掉此句后,窗口看门狗将产生复位 设置 WWDG 计数器值 WWDG_ClearFlag(); //清除提前唤醒中断标志位 GPIOE->ODR^= 0X1<<5; //LED状态翻转 } #ifndef _WWDG_H_ #define _WWDG_H_ #include "stm32f10x.h" void WWDG_Init(u8 tr,u8 wr,u32 fprer); void WWDG_Set_Counter(u8 cnt); #endif |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:18 , Processed in 0.721565 second(s), Total 76, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号