完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
IWDG介绍
STM32F1芯片内部含有两个看门狗外设,一个是独立看门狗IWDG,另一个是窗口看门狗WWDG。两个看门狗外设(独立和窗口)均可用于检测并解决由软件错误导致的故障。独立看门狗简单理解其是就是一个12位递减计数器,当计数器从某一个值递减到0时(如果看门狗已激活),系统就会产生一次复位。如果在计数器递减到0之前刷新了计数器值,那么系统就不会产生复位。这个刷新计数器值过程我们称之为“喂狗”。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。 内部结构 IWDG配置步骤 IWDG相关库函数在stm32f10x_iwdg.c和stm32f10x_iwdg.h文件中 (1)开启寄存器访问(给IWDG_KR寄存器写入0X5555) IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); (2)设置IWDG预分频系数和重装载值 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); void IWDG_SetReload(uint16_t Reload); Tout = (4*2^pre) / 40 * rlr 其中Tout为独立看门狗溢出时间,单位是ms。pre是预分频器系数(0-6),rlr 是重装载寄存器的值,公式内的40是独立看门狗的时钟。 (3)重载计数器值(喂狗)(给IWDG_KR寄存器写入0XAAAA) IWDG_ReloadCounter(); (4)开启IWDG(给IWDG_KR寄存器写入0XCCCC) IWDG_Enable(); 硬件电路 D1指示灯用来提示系统运行,D2指示灯用来作为喂狗和系统重 启时的提示,K_UP按键用来喂狗操作,喂狗时D2指示灯亮,喂狗失败系 统重启,D2指示灯灭。 编写独立看门狗控制程序 通过K_UP按键进行喂狗,喂狗的时候D2指示灯亮,同时串口输出“喂狗”提示信息,超过喂狗时间系统重启D2指示灯灭,同时串口输出“复位系统”提示信息,同时使用D1指示灯闪烁表 示系统运行。 iwdg.h #ifndef _iwdg_H #define _iwdg_H #include “system.h” void IWDG_Init(u8 pre,u16 rlr); void IWDG_FeedDog(void); //喂狗 #endif iwdg.c #include “iwdg.h” /******************************************************************************* * 函 数 名 : IWDG_Init * 函数功能 : IWDG初始化 * 输 入 : pre:预分频系数(0-6) rlr:重装载值(12位范围0xfff) 独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 * 输 出 : 无 *******************************************************************************/ void IWDG_Init(u8 pre,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护 IWDG_SetPrescaler(pre);//设置预分频系数 0-6 IWDG_SetReload(rlr);//设置重装载值 IWDG_ReloadCounter(); //重装载初值 IWDG_Enable(); //打开独立看门狗 } /******************************************************************************* * 函 数 名 : IWDG_FeedDog * 函数功能 : 喂狗 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void IWDG_FeedDog(void) //喂狗 { IWDG_ReloadCounter(); //重装载初值 } main.c #include “system.h” #include “SysTick.h” #include “led.h” #include “usart.h” #include “key.h” #include “iwdg.h” /* bug:使用普中自带的串口助手,调试信息可以打印;但是使用其它的串口助手,发现系统 * 没有起来,原因未知,看门狗程序是正确的,只是调试打印信息有问题 */ /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ int main() { u8 i=0; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 LED_Init(); USART1_Init(9600); KEY_Init(); IWDG_Init(4,800); //只要在1280ms内进行喂狗就不会复位系统 led2=1; printf(“复位系统rn”); while(1) { if(KEY_Scan(0)==KEY_UP) { IWDG_FeedDog();//喂狗 led2=0; printf(“喂狗rn”); } i++; if(i%20==0) { led1=!led1; } delay_ms(10); } } 实验现象 如果在规定的时间内没有按下KEY_UP按键,串口打印系统复位,如果按下了按键,那么串口打印喂狗。 |
|
|
|
只有小组成员才能发言,加入小组>>
4369个成员聚集在这个小组
加入小组3295 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4237 浏览 1 评论
4247 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 23:14 , Processed in 1.003871 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号