STM32F103看门狗功能实现

发布者:qin199099最新更新时间:2021-12-29 来源: eefocus关键字:STM32F103  看门狗功能 手机看文章 扫描二维码
随时随地手机看文章

  STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备( 独立看门狗 和 窗口看门狗 )可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。


  独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。


  IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。


  看门狗主要是用来对系统运行状态进行监控的,以免系统被干扰后代码跑飞了,导致系统混乱。看门狗的使用也比较简单,下面就分别来看一下独立看门狗和窗口看门狗的使用方法。


独立看门狗


//初始化独立看门狗

//prer:分频数:0~7(只有低 3 位有效!)

//分频因子=4*2^prer.但最大值只能是 256!

//rlr:重装载寄存器值:低 11 位有效.

//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).

void IWDG_Init(u8 prer,u16 rlr)

{

// 1、取消寄存器写保护 写0x5555

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

// 2、设置独立看门狗预分频系数

IWDG_SetPrescaler(prer);

// 3、设置独立看门狗重装载值

IWDG_SetReload(rlr);;

// 4、重载计数值喂狗 写0xAAAA

IWDG_ReloadCounter();

// 5、启动看门狗     写0xCCCC

IWDG_Enable();

}

void IWDG_Feed(void)

{

IWDG_ReloadCounter();

}


独立看门狗的初始化很简单,主要就是设置一下喂狗的时间。然后在程序运行过程中不停的喂狗。


int main(void)

{

    u8 key = 0;

    delay_init();       //延时函数初始化

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    LED_Init();

    KEY_Init();

    IWDG_Init(4, 625); //溢出时间为1s  (4*2^4)*625/40=1000ms


    LED0 = 1;

    LED1 = 1;

    delay_ms(500);

    LED0 = 0;

    LED1 = 0;


    while(1)

    {

        key = KEY_Sacn(1);

        if( key == WKUP_PRES)

        {

            IWDG_Feed();

        }

        delay_ms(10);

    }

}


这里通过一个按键来模拟喂狗,当按键按一次,就会喂狗一次。如果按键超过喂狗时间没有按下时,独立看门狗就会使系统复位。


窗口看门狗


u8 WWDG_CNT = 0x7f;

void WWDG_NVIC_Init(void)

{

    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}


//初始化窗口看门狗

//tr :T[6:0],计数器值

//wr :W[6:0],窗口值

//fprer:分频系数(WDGTB),仅最低 2 位有效

//Fwwdg=PCLK1/(4096*2^fprer)

void WWDG_Init(u8 tr, u8 wr, u32 fprer)

{

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); //时钟使能

    WWDG_CNT = tr & WWDG_CNT;

    WWDG_SetPrescaler(fprer); //设置预分频值

    WWDG_SetWindowValue(wr); //设置窗口值 上窗口值  与喂狗间隔没关系

    WWDG_Enable(WWDG_CNT); //使能看门狗,设置计数值

    WWDG_ClearFlag(); //清除提前唤醒中断

    WWDG_NVIC_Init(); //设置中断优先级

    WWDG_EnableIT(); //开启窗口看门狗中断

}

void WWDG_Set_Counter(u8 cnt)

{

    WWDG_Enable(cnt); //使能看门狗,设置计数值

}

void WWDG_IRQHandler(void)

{

    WWDG_SetCounter(WWDG_CNT);        //喂狗

    WWDG_ClearFlag(); //清除提前唤醒中断

    LED0=!LED0;

}


由于窗口看门狗的喂狗时间很短,在程序运行过程中很难判断出什么时候该喂狗,所以这里喂狗使用中断来执行,在需要喂狗的时候,直接触发中断,在中断中进行喂狗,每喂一次狗,LED就取反一次。通过观察LED的闪烁就可看出中断函数的执行情况。


int main(void)

{

    u8 key = 0;

    delay_init();       //延时函数初始化

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    LED_Init();

    KEY_Init();

    //IWDG_Init(4, 625); //溢出时间为1s  (4*2^4)*625/40=1000ms


    LED0 = 1;

    LED1 = 1;

    delay_ms(500);

    LED0 = 0;

    LED1 = 0;

    //窗口看门狗喂狗间隔 只和 tr 低6位有关  wr 可以设置为0x40---0x7f 之间的任意值

    // 4096*2^3*64/36000000 = 58.25ms   (64为0x7f 低6位值)

    WWDG_Init(0x7f, 0x7f, WWDG_Prescaler_8); //计数器值7f,窗口寄存器5f,分频数为8

    // 4096*2^3*31/36000000 =28.22ms   (31为0x4f 低6位值)

    //WWDG_Init(0x5f, 0x5f, WWDG_Prescaler_8);

   // 4096*2^3*15/36000000 =13.65ms   (15为0x4f 低6位值)

    //WWDG_Init(0x4f, 0x5f, WWDG_Prescaler_8);

    // 4096*2^3*1/36000000 =910us  (1为0x41 低6位值)  窗口最小值为0x40 

    //WWDG_Init(0x41, 0x5f, WWDG_Prescaler_8);

    while(1)

    {       

    }

}


在主函数中通过设置不同的溢出时间来观察LED灯的闪烁频率。

关键字:STM32F103  看门狗功能 引用地址:STM32F103看门狗功能实现

上一篇:STM32F103单片机PWM功能实现
下一篇:STM32F103定时器输入捕获功能

推荐阅读最新更新时间:2024-11-12 22:13

移植ucosII到STM32F103ZE(四)
a) 根据stm32f103芯片对系统文件进行修改 根据AN-1018.pdf 和移植详解介绍的移植基础知识,对OS-uCOSIIport 下的代码解释下。 并进行相关特性修改。 os_cpu.h #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsign
[单片机]
STM32F030和STM32F103的IO结构上的区别
STM32F103GPIO 功能描述 每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器
[单片机]
STM32F030和<font color='red'>STM32F103</font>的IO结构上的区别
STM32F103单片机RTC实时时钟的使用
  实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。   RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。   系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问: 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。   下面直接通过代码来演示如何操作RTC。
[单片机]
stm32f103r6仿真计数器程序+Proteus
单片机源程序如下: #include stm32f10x.h #include Delay.h #include smg.h #include sys.h #include timer.h #include led.h #include fmq.h #include key.h #include stm32f10x_tim.h uint16_t table = { /* 0, 1, 2, 3, 4, 5, 6, 7, 8, */ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, /* 9, A, B, C,
[单片机]
<font color='red'>stm32f103</font>r6仿真计数器程序+Proteus
STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)
一、环境介绍 工程编译软件: keil5 温湿度传感器: SHT30 MCU : STM32F103ZET6 程序采用模块化编程,iic时序为一个模块(iic.c 和 iic.h),SHT30为一个模块(sht30.c 和 sht30.h);IIC时序采用模拟时序方式实现,IO口都采用宏定义方式,方便快速移植到其他平台使用。 工程源码完整下载地址: https://download.csdn.net/download/xiaolong1126626497/18973724 二、SHT30介绍 特点: 1. 湿度和温度传感器 2. 完全校准、线性化和温度 3. 补偿数字输出,宽电源电压范围,从2.4 V
[单片机]
<font color='red'>STM32F103</font>ZE+SHT30检测环境温度与湿度(IIC模拟时序)
STM32F103--(三) USART实践
GPIO的后面很容易想到的应该就是通用同步/异步接受发送器(USART) 了。对于比较复杂点的程序而言,用led来调试显然是有点不太科学。所以,把USART口调试好后,有助于之后其它部分的调试。(把USART当成是调试输出口来用 ) 调试USART花了我一些时间,其实问题主要出现在一些很小的细节方面。比如发现发送的数据中夹杂这乱码,后来通过数据的二进制分析发现是奇偶校验位不小心打开了。如果排除这些小问题的话,整个工作应该是很容易的。 先上例程,然后标注,最后分析 USART的初始化 void UartInit(void) { USART_InitTypeDef USART_InitStructure;//声明一个USART初
[单片机]
基于STM32的智能循迹往返小车设计
智能车辆作为智能交通系统的关键技术之一,是许多高新技术综合集成的载体。它体现了车辆工程、人工智能、自动控制及计算机技术于一体的综合技术,是未来汽车发展的趋势。本文提出了一个基于STM32F103芯片为控制核心,附以红外传感器采集外界信息和检测障碍物的智能小车系统设计方案。充分利用该芯片高速运算、处理能力,来实现小车自动识别路线按迹行走、躲避障碍物,并且通过LCD显示器实时显示小车运动参数,使用芯片自带的PWM输出功能,步进调节占空比来调节电机的转速。通过模糊控制和PWM脉宽调制技术的结合,提高了对车位置控制精度。 1 系统硬件电路设计 根据题目中的设计要求,本系统主要由主控单片机模块、电源模块、电机驱动模块、黑线检测模块、
[单片机]
基于STM32的智能循迹往返小车设计
基于STM32F103系列单片机的11个定时器解析
STM32F103系列的单片机一共有11个定时器,其中: 2个高级定时器 4个普通定时器 2个基本定时器 2个看门狗定时器 1个系统嘀嗒定时器 除去看门狗定时器和系统滴答定时器的八个定时器列表; 8个定时器分成3个组; TIM1和TIM8是高级定时器 TIM2-TIM5是通用定时器 TIM6和TIM7是基本的定时器 这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式 计数器三种计数模式 向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时 向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时 中央对齐模式:从0开始向上
[单片机]
基于<font color='red'>STM32F103</font>系列单片机的11个定时器解析
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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