STM32系列第10篇--看门狗

发布者:云自南国来最新更新时间:2017-09-22 来源: eefocus关键字:STM32系列  看门狗 手机看文章 扫描二维码
随时随地手机看文章

看门狗的作用:

在启动正常运行的时候,系统不能复位。 
在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行

STM32有两个看门狗:

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。

窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。 窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。

看门狗一般用法:

while(1)
{
    喂狗;    if(定时标识)
    {
    里面就是按键程序;
    }
}12345678

计算一下,主循环执行一次的最大时间,看门狗定时是这个时间的一,二十倍,就可以了。不用再某个模块中喂狗,一个循环来一次。

窗口看门狗配置步骤:

  1. 取消寄存器写保护:IWDG_WriteAccessCmd();

  2. 设置独立看门狗的预分频系数,确定时钟: IWDG_SetPrescaler();

  3. 设置看门狗重装载值,确定溢出时间: IWDG_SetReload();

  4. 使能看门狗: IWDG_Enable();

  5. 应用程序喂狗: IWDG_ReloadCounter();

溢出时间计算:Tout=((4×2^prer) ×rlr) /40 (M3) 
wdg.c

void IWDG_Init(u8 prer,u16 rlr) {     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作
    IWDG_SetPrescaler(prer);  //设置IWDG预分频值:设置IWDG预分频值为64
    IWDG_SetReload(rlr);  //设置IWDG重装载值
    IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器
    IWDG_Enable();  //使能IWDG}12345678

main.c

int main(void)
{
    delay_init();     //延时函数初始化  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200); //串口初始化为115200
    LED_Init();   //初始化与LED连接的硬件接口
    KEY_Init();          //按键初始化 
    delay_ms(500);    //让人看得到灭
    IWDG_Init(4,625);    //与分频数为64,重载值为625,溢出时间为1s
    LED0=0; //点亮LED0
    while(1)
    {        if(KEY_Scan(0)==WKUP_PRES)
        {
            IWDG_ReloadCounter();//如果WK_UP按下,则喂狗,LEDO亮,一直连按LED0一直亮
        }
        delay_ms(10);
    }; 
}12345678910111213141516171819

窗口看门狗:

工作过程: 
STM32F的窗口看门狗中有一个7位的递减计数器T[6:0],它会在出现下述2种情况之一时产生看门狗复位:

  1. 当喂狗的时候如果计数器的值大于某一设定数值W[6:0](上窗口值)时,此设定数值在WWDG_CFR寄存器定义。

  2. 当计数器的数值从0x40减到0x3F时【T6位跳变到0】。

如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以用于喂狗以避免WWDG复位。

配置过程:

  1. 使能看门狗时钟:RCC_APB1PeriphClockCmd();

  2. 设置分频系数:WWDG_SetPrescaler();

  3. 设置上窗口值:WWDG_SetWindowValue();

  4. 开启提前唤醒中断并分组(可选):WWDG_EnableIT(); NVIC_Init();

  5. 使能看门狗:WWDG_Enable();

  6. 喂狗:WWDG_SetCounter();

  7. 编写中断服务函数:WWDG_IRQHandler();

wdg.c

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);//设置窗口值
    WWDG_Enable(WWDG_CNT); //使能看门狗
    WWDG_ClearFlag();//清除提前唤醒中断标志位 
    WWDG_NVIC_Init();//初始化窗口看门狗 NVIC
    WWDG_EnableIT(); //开启窗口看门狗中断} 

//重设置WWDG计数器的值,喂狗void WWDG_Set_Counter(u8 cnt)
{
    WWDG_Enable(cnt);//使能看门狗}//窗口看门狗中断服务程序void WWDG_NVIC_Init()
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;//WWDG中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 
    NVIC_Init(&NVIC_InitStructure);//NVIC初始化}//中断服务函数void WWDG_IRQHandler(void)
{
    WWDG_SetCounter(WWDG_CNT);  //当禁掉此句后,窗口看门狗将产生复位
    WWDG_ClearFlag();  //清除提前唤醒中断标志位
    LED1=!LED1; //LED状态翻转}12345678910111213141516171819202122232425262728293031323334353637

main.c

int main(void)
{
    delay_init();     //延时函数初始化  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    uart_init(115200); //串口初始化为115200
    LED_Init();
    KEY_Init();          //按键初始化 
    LED0=0;
    delay_ms(300);  
    WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);//计数器值为7f,窗口寄存器为5f,分频数为8   
    while(1)
    {
        LED0=1;     
    }   
}


关键字:STM32系列  看门狗 引用地址:STM32系列第10篇--看门狗

上一篇:STM32系列第10篇--看门狗
下一篇:STM32系列第9篇--外部中断

推荐阅读最新更新时间:2024-03-16 15:38

STM32 基础系列教程 10 - 单线串口(半双工)
前言 在工程应用中,很多时间为了方便走线会采用单线串口方案,本节将学习stm32 usart单线串口的使用,学会用使用单线串口收发数据。 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置: 系统时钟树 USART1配置 引脚配置(保持默认即可) 引脚保持默认即可,当然实际应用中可以根据自己的需求对其
[单片机]
<font color='red'>STM32</font> 基础<font color='red'>系列</font>教程 10 - 单线串口(半双工)
stm32 看门狗 BKP(HAL库)
(一)概述 stm32有两个看门狗:硬件看门狗(LSI 40KHz,时间精度不高)和窗口看门狗(APB1)。 (二)硬件看门狗实现代码 IWDG_HandleTypeDef hiwdg; // 硬件看门狗初始化 static void MX_IWDG_Init(IWDG_HandleTypeDef *pHiwdg) { pHiwdg- Instance = IWDG; pHiwdg- Init.Prescaler = IWDG_PRESCALER_4; pHiwdg- Init.Reload = 0xFFF; // Tout = ((4 * 2^prer) * rlr) / 40 = 409ms,看门狗
[单片机]
PIC12F508单片机学习之二—看门狗和休眠模式试用
PIC12F508单片机是没有中断的,定时器只能是查询方式。 编译器用的XC8,编译环境IDE用的是MPLAB X IDE。 下载器是PICKIT3. //*************************************************** // __________________ // VDD-| 1 8 |-VSS // GP5-| 2 27 |-GP0/DAT // GP4-| 3 26 |-GP1/CLK //GP3/RMCLR--| 4 25 |-GP2 // |________________
[单片机]
STM32学习笔记---IWDG独立看门狗实验
继做了WWDG窗口看门狗实验后,继续进行第9个实验-IWDG独立看门狗实验,本实验通过设置窗口看门狗IWDG间断时间来定期的检查是否出错,在SysTick_Handler中断函数中加入了流水灯用来测试是否运行了IDWG看门狗程序,用PD6-LED2通过闪烁验证程序可行性,编程工程大致和USART实验过程差不多,先是开启系统时钟,然后GPIO端口时钟,然后复用功能时钟AFIO,然后各个模块用的的时钟,,呵呵,之后进入各个模块初始化,设置,编写子程序,中断的话,要在中断函数中填写某模块的中断触发处理函数,重要的是在CONFG.H函数中开启模块的声明,差不多是这样的了。 以下为IWDG函数主要部分: //IWDG窗口看门狗设置初始化 v
[单片机]
<font color='red'>STM32</font>学习笔记---IWDG独立<font color='red'>看门狗</font>实验
基于STM32系列的模拟串口(非阻塞式)
STM32单片机一般少则3个串口,多则5个,而我这次的项目还偏偏5个硬件串口还是不够用. 至于不够用的原因,哎,是项目做到后面有定制,随便哪个串口都省不得,没得办法,只能另想法子咯~ 板子上有几个预留IO口,可以用来模拟串口. 模拟串口一般都选9600,速度最快试了也才19200, 所以限制还是较多的,一般不得以情况下才会用到. 在写程序之前我也是参考了前辈们,觉得写的不咋地,照抄他的代码,那我的系统啥事情也 不要干了,就在那里delay吧!!! 模拟串口分收和发:收比较难,发送比较容易,那就先将接收这块吧。 接收: 有2种思路: 一种是第一个下降沿开始启动定时器,每个bit都去采样Rx电平;
[单片机]
基于<font color='red'>STM32</font><font color='red'>系列</font>的模拟串口(非阻塞式)
stm32的窗口看门狗的一点发现
今天看stm32的窗口看门狗,突然发现很不正常,于是做了各方面的实验得出以下结论,由于只是实验了得出的结论没有官方结论,所以如果有人有理论依据请告知我,非常感谢1 1.一旦使能窗口看门狗的时钟,SR寄存器的EWIF位就会被置1 2.一旦在定义的窗口范围外喂狗就会复位 3.在没有使能窗口看门狗定时器的情况下(即CR寄存器的WDGA寄存器置1来使能看门狗),SR不能被软件清0 结论:所以必须把窗口看门狗的清0,使能中断放在初始化的最后2句才能正常运行!
[单片机]
MSP430使用指南8 -> WDT看门狗模块
看门狗WDT电路在平时调试过程中使用并不多,但在真正产品应用上,可以说每一个系统都会使用看门狗,其主要功能和作用如下: 看门狗电路基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗计数器正常工作时自动计数,程序流程定期将其复位清零,如果系统在某处卡死或跑飞,该定时器将溢出,并将进入中断。在定时器中断中执行一些复位操作。 使系统恢复正常的工作状态,即在程序没有正常运行期间,如期复位看门狗以保证所选择的定时溢出归零,使处理器重新启动。看门狗电路的定时时间长短可由具体应用程序的循环周期决定,通常比系统正常工作时最大循环周期的时间略长即可。 MSP430 MCU内部直接集成了看门狗模块,可以通过用户的设置进行对程序是否
[单片机]
MSP430使用指南8 -> WDT<font color='red'>看门狗</font>模块
MAX791在看门狗电路中的应用
某远程数据采集系统是为解决海军边远地区哨所数据上传问题研制的,该系统应用GPS(全球卫星定位系统)与GIS(地理信息系统)技术,能够进行智能化和规范化管理。 系统由数据采集、传送和管理中心两个部分组成。其中,数据采集部分主要包括看门狗电路、数据存储、接口和Modem(见图1)。 图1 远程数据采集系统结构 掉电保护电路的应用 对于该系统来说,当供电部件瞬间断电或电压突然下降时,系统会进入混乱状态,即使电压恢复正常,系统也难以正常运作。处理这类事故最有效的方法就是增加掉电保护系统。 掉电保护系统一般由低功耗的CMOS-RAM、供电电路及控制电路组成。供电电路保证系统正常时由电源给RAM供电,掉电时自动转换到备用电池给
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved