完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
为什么要看门狗:
单片机的工作常常会受到来自外界磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常允许被打断。会造成整个系统的停滞状态。处于对单片机运行状态进行实时监测的考虑,用一种专门用于监测单片机运行状态的模块或芯片,叫看门狗。 看门狗解决的问题是什么: 在启动正常运行的时候,系统不能复位 在系统跑飞的情况,系统复位,程序重新运行 STM32有两个看门狗,一个独立看门狗、一个窗口看门狗。 独立看门狗IWDG由专用的低速时钟LSI驱动,即时主时钟发生故障它仍然有效。 独立看门狗适合应用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合。 窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。 窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。 独立看门狗 键值寄存器写入0xCCCC,开始启用独立看门狗。 此时计数器开始从其复位值0xFFF递减,当计数器计数到尾值0x000时会产生一个复位信号。 在键值寄存器写入0xAAAA,就是喂狗,自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。 如果程序异常,就无法正常喂狗,从而系统复位。 键值寄存器IWDG_KR: 0~15位有效 预分频寄存器IWDG_PR:0~2位有效 具有写保护功能,要操作先取消写保护 重装载寄存器IWDG_RLR:0~11位有效 具有写保护功能,要操作先取消写保护 状态寄存器IWDG_SR:0~1位有效 独立看门狗超时时间 Tout = ((4*2^prer预分频的值)*rlr RLR寄存器最大值)/32kHz LSI时钟频率 窗口看门狗 之所以称为窗口看门狗是因为其喂狗时间是一个有上下限的范围内(窗口),可以通过设定相关寄存器,设定其上下限时间(下限固定)。喂狗时间不能过早也不能过晚。 而独立看门狗限制喂狗时间在0-x内,由相关寄存器决定。喂狗的时间不能过晚。 窗口看门狗工作过程总结: STM32的窗口看门狗有一个7位的递减计数器T[6:0],它会在出现下述2种情况之一时产生看门狗复位: 当喂狗的时候如果计数器的值大于某一设定数值W[6:0]时,此设定数值在WWDG_CFR寄存器定义。 当计数器的数值从0x40减到0x3F时,T6位跳变到0。 如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以用于喂狗以避免WWDG复位。 为什么要窗口看门狗? 对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有隐患,可能程序跑乱了又跑回到正常的地方,或者乱跑的程序正好执行了刷新看门狗操作,这样一般的看门狗就检测不出来了。 如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗。这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。 注意事项: W[6:0]的值必须大于下窗口值0x40,否则就无窗口了。 窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。 #include 《stm32f2xx.h》#include “SYSINIT.h”#include “led.h”#include “button.h”#include “Delay.h”/**独立看门狗实验LED灯熄灭点亮,按住SW17键,则不再点亮窗口看门狗实验**/int main(){ //系统初始化 SYS_INIT(); LED_Init(); Button_Init(); void IWDG_Feed(void); GPIO_ResetBits(GPIOE,GPIO_Pin_14); GPIO_ResetBits(GPIOE,GPIO_Pin_2); /*********************************独立看门狗初始化**************************************/ //取消写保护,0x5555使能 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作 //设置IWDG预分频值:设置IWDG预分频值为64 IWDG_SetPrescaler(4); //设置IWDG重装载值 写RLR IWDG_SetReload(625); //按照IWDG重装载寄存器的值重装载IWDG计数器 //喂狗 写0xAAAA到KR IWDG_ReloadCounter(); //使能看门狗 写0xCCCC到KR IWDG_Enable(); //使能IWDG Delay_ms(100); GPIO_SetBits(GPIOE,GPIO_Pin_14); /**********************************************************************/ /*********************************内部中断向量初始化**************************************/ NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //窗口看门狗的中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占2 子优先级3,组2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); /********************************************************************************/ Delay_ms(300); GPIO_SetBits(GPIOE,GPIO_Pin_12); Delay_ms(300); /*********************************窗口看门狗初始化**************************************/ //使能看门狗时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); //设置预分频系数 WWDG_SetPrescaler(WWDG_Prescaler_8); //设置上窗口值 WWDG_SetWindowValue(0X5F); //使能看门狗 7F已经是最大的了 WWDG_Enable(0X7F); //使能,设置counter WWDG_ClearFlag(); WWDG_EnableIT(); //使能中断 /********************************************************************************/ while(1) { //当PE1置0的时候,就是按钮按下 PE2和PE1是SW17 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1)==0) IWDG_Feed(); Delay_ms(10); } }//喂独立看门狗void IWDG_Feed(void){ //喂狗 IWDG_ReloadCounter(); }// 窗口看门狗中断函数void WWDG_IRQHandler(void){ // Update WWDG counter //喂狗 WWDG_SetCounter(0x7F); // Clear EWI flag */ //清除提前唤醒中断标志位 WWDG_ClearFlag(); //清除中断标志 GPIO_ToggleBits(GPIOE, GPIO_Pin_12); //反转} |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1933浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
726浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
566浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
550浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 08:51 , Processed in 0.979084 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号