STM32入门学习笔记之看门狗实验(上)

发布者:nu23最新更新时间:2024-04-18 来源: elecfans关键字:STM32  看门狗实验  电磁干扰 手机看文章 扫描二维码
随时随地手机看文章

14.1 STM32看门狗简介

在单片机构成的微型计算机系统中,单片机的工作可能会受到外界的电磁干扰或者程序运行的BUG导致程序指针错误,或者其他错误导致的死循环,引发整个系统陷入停滞状态,所以需要一个与系统独立的定时器来监控单片机的运行状态,这个定时器在系统正常运转的时候,不停的刷新定时器的计数器,例如隔一段时间给这个定时器的计数器写100,然后在定时器减运算到0之前再一次写入100,这样,就保证了定时器不计数到0,也就意味着通过判断这个定时器是否计数到0来判断系统是否陷入死机状态,实现这种功能的定时器就称为看门狗,不停的刷新计数器值的行为就称为“喂狗”,一般计数器计数到0后会直接对单片机进行复位,用于避免系统陷入死循环。

STM32内部有两种看门狗模块,一种是窗口看门狗WWDG,另一种是独立看门狗IWDG,STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。


独立看门狗的时钟是一个内部RC时钟,所以并不是准确的40Khz,而是在30~60Khz之间的一个可变化的时钟,只是我们在估算的时候,以40Khz的频率来计算。

窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。

在递减计数器达到窗口配置寄存器数值之前,如果7位的递减计数器数值在控制寄存器中被刷新,那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

14.2 独立看门狗相关寄存器

14.2.1 键值寄存器IWDG_KR

1514131211109876543210
KEY[15:0]














该寄存器属于只写寄存器,读取的值为0x0000,软件必须以一定间隔写入0xAAAA,否则,当计数器为0时,看门狗会产生复位;

写入0x5555表示允许访问IWDG_PR和IWDG_RLR寄存器;

写入0xCCCC表示启动看门狗工作,如果选择了硬件看门狗则不受此命令字限制。

14.2.2 预分频寄存器IWDG_PR

1514131211109876543210
-PR[2:0]













Bit 2~Bit 0:预分频因子

000:预分频因子=4

001:预分频因子=8

010:预分频因子=16

011:预分频因子=32

100:预分频因子=64

101:预分频因子=128

110:预分频因子=256

111:预分频因子=256

14.2.3 重装载寄存器IWDG_RLR

1514131211109876543210
-RLR[11:0]













Bit 11~Bit 0:看门狗计数器重装载值:每当向IWDG_KR寄存器写入0xAAAA时,重装载值会被传送到计数器中,随后计数器从这个值开始递减计数。

14.3 窗口看门狗相关寄存器

14.3.1 控制寄存器WWDG_CR

1514131211109876543210
-WDGAT6T5T4T3T2T1T0






Bit 7:激活位:,此位由软件置1,但仅能由硬件在复位后清0。当WDGA=1时,看门狗可以产生复位

0:禁止看门狗

1:启用看门狗

Bit 6~Bit 0:7位计数器,存储看门狗的计数器值。每(4096x2 ^WDGTB^ )个PCLK1周期减1。当T6变成0产生看门狗复位

14.3.2 配置寄存器WWDG_CFR

1514131211109876543210
-EWITB1TB0W6W5W4W3W2W1W0




Bit 9:提前唤醒中断,此位若置1,则当计数器值达到40h,即产生中断,此中断只能由硬件在复位后清除

Bit 8:预分频器时基

00:CK计时器时钟不分频

01:CK计时器时钟2分频

10:CK计时器时钟4分频

11:CK计时器时钟8分频

Bit6~Bit 5:7位窗口值,用来与递减计数器进行比较用的窗口值

14.3.3 状态寄存器WWDG_SR

1514131211109876543210
-EWIF













Bit 0:提前唤醒中断标志,当计数器值达到40h时,此位由硬件置1。它必须通过软件写0来清除。若中断未被使能,此位也会被置1

14.4 实验例程

14.4.1 独立看门狗实验

功能:如果看门狗没有复位,接在PB5上的LED常亮,如果PA0的按键按下,就喂狗,只要按键不停的按,看门狗就一直不会产生复位,保持DS0的常亮,一旦超过看门狗定溢出时间,那么将导致程序重启,这将导致DS0熄灭一次。


(1)创建wdg.h文件输入以下代码。


#ifndef _WDG_H_

#define _WDG_H_



#include 'sys.h'

/*********************************************************************************************************

                  函    数    列    表

*********************************************************************************************************/

void IWDG_Init( u8 prer, u16 rlr ) ;                                  //独立看门狗初始化



#endif

(2)创建wdg.c文件输入以下代码。


#include 'wdg.h'

/***************************************************

Name    :IWDG_Init

Function  :独立看门狗初始化

Paramater  :

      prer:分频数:0~7

      rlr:重装载寄存器值

Return    :None

***************************************************/

void IWDG_Init( u8 prer, u16 rlr )

{

  IWDG->KR = 0x5555 ;                                          //使能对IWDG->PR和IWDG->RLR的写

    IWDG->PR = prer ;                                          //设置分频系数

    IWDG->RLR = rlr ;                                          //从加载寄存器 IWDG->RLR

  IWDG->KR = 0xAAAA ;                                          //更新计数器

    IWDG->KR = 0xCCCC ;                                          //使能看门狗

}

(3)在1.c文件中输入以下代码。


#include 'sys.h'

#include 'delay.h'

#include 'usart1.h'

#include 'wdg.h'

/***************************************************

Name    :LED_Init

Function  :LED初始化

Parameter  :None

Return    :None

***************************************************/

#define LED PBout( 5 )                                          //定义LED端口

void LED_Init()

{

  RCC->APB2ENR |= 1<<3 ;

  GPIOB->CRL &= 0xFF0FFFFF ;

  GPIOB->CRL |= 0x00300000 ;

  LED = 1 ;

}

/***************************************************

Name    :KEY_Init

Function  :KEY初始化

Parameter  :None

Return    :None

***************************************************/

#define KEY  PAin( 0 )                                          //定义按键端口

void KEY_Init()

{

  RCC->APB2ENR |= 1<<2 ;

  GPIOA->CRL &= 0xFFFFFFF0 ;

  GPIOA->CRL |= 0x00000008;

}

/***************************************************

Name    :main

Function  :主函数

Parameter  :None

Return    :None

***************************************************/

int main()

{

  STM32_Clock_Init( 9 ) ;                                        //STM32时钟初始化

  SysTick_Init( 72 ) ;                                        //SysTick初始化

  USART1_Init( 72, 115200 ) ;                                      //初始化串口1波特率115200

  LED_Init() ;                                            //LED初始化

  KEY_Init() ;                                            //按键初始化

   delay_ms( 500 ) ;                                          //延时500ms,让人可以看到DS0灭的状态

   IWDG_Init( 4, 625 ) ;                                        //与分频数为64,重载值为625,溢出时间为1s

  LED = 0 ;                                              //点亮DS0

  while( 1 )

  {

    if( KEY==1 )

    {

      delay_ms( 10 ) ;

      if( KEY==1 )

      {

        IWDG->KR = 0xAAAA ;                                    //喂狗

      }

    }

    delay_ms( 20 ) ;

  }

}


关键字:STM32  看门狗实验  电磁干扰 引用地址:STM32入门学习笔记之看门狗实验(上)

上一篇:STM32入门学习笔记之EEPROM存储实验2
下一篇:STM32入门学习笔记之RTC实验(下)

推荐阅读最新更新时间:2024-11-16 16:16

STM32 串口通信OLED屏幕显示(IIC)心得体会
主机:单片机 从机:oled 当主机向从机写入数据时,从机需要向主机返回应答信号 每写入一个字节,则需等待应答信号:在scl和sda都为高时 当主机向从机中读取数据时,主机需要向从机给应答信号 此时,给应答信号,则表示还需要读取数据;如果给非应答信号,则表示不再读取数据 IIC模式 SDA PA1 //D1 SCL PA2 //D0 DC PA3 //地址选择 0 地址为0x78 1 地址为0x7A RES PA4 //复位引脚 CS PA5 //默认接地 电阻R3换到R1 R8短接 16(8x16)号字体 一个字符纵向占两个字节 横向占一个字节 12(6x8)号字体 一个字符纵向占1个字节 横向占6bit 主
[单片机]
关于单片机STM32裸机程序架构设计
本着授人以渔的原则,既提供我一直在用的程序架构,也讲程序架构的设计思路。 如果本文内容,你都能领悟并做到,不管项目多复杂,都将游刃有余。 我研发的那几年,接触大多数工程师,都没有程序架构的概念,基本一个while死循环干到底。 模块之间也没有封装好,导致代码写好以后,扩展性和维护性太差,类似的功能代码,也很难移植到新项目去复用。 早期我也是这样写的,反正实现功能就行了,代码好不好,功能上又看不出区别。 不过,等你接触到复杂的项目时,这招就行不通了,没设计好程序架构,根本做不稳定。 我意识到这个问题,是碰到两种需求的时候: 1.是做一个基于STM32的网关项目,项目做完以后,客户老是要改功能,客户不懂技术,在客户眼里,觉得改一个
[单片机]
关于单片机<font color='red'>STM32</font>裸机程序架构设计
【stm32f0】stm32 总中断的打开与关闭
问题: 对于基于ARM Cortex M0内核的STM32芯片各类应用开发时,有的时候需要进行总的中断的开、关处理。那就究竟有没有开、关总的中断的函数或者指令呢? 回答: 随着Corte Mn各种内核的MCU的芯片越来越多和相关编译工具的升级换代,编译工具在有关内核指令操作的文档安排以及函数书写等方面可能发生了细微的变化。所以即使用过STM32 F1系列产品的工程师,在使用晚推出的STM32 F0芯片开发时,发现那些跟内核操作有关的指令或函数不知道哪里去找了。以STM32各系列的标准固件库为例,与内核相关的指令及函数都可以在...librariescmsis...后面目录的相关文件里找到。于不同系列的标准库中对应的子目录以及相
[单片机]
电机位置闭环控制(STM32代码详细注释)
这是一个电机位置闭环控制(代码详细注释),很适合做伺服电机控制入门的同志们学习借鉴 单片机源程序如下: #include sys.h u8 Flag_Stop=1; //停止标志位 int Encoder,Position=10000; //编码器的脉冲计数 long SHOW; int Moto1; //电机PWM变量 应是Motor的 向Moto致敬 int main(void) { Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 LED_Init();
[单片机]
STM32之ADC单通道连续例程
#include stm32f10x.h /* RCC时钟配置 */ void RCC_config(void) { ErrorStatus HSEStartUpStatus; /* RCC寄存器设置为默认配置 */ RCC_DeInit(); /* 打开外部高速时钟 */ RCC_HSEConfig(RCC_HSE_ON); /* 等待外部高速时钟稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* 设置HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_D
[单片机]
STM32 TIM测 输入信号的 频率
说 不进中断 等等基本功能没实现ok的,查看: STM32 外设配置关键步骤 务必仔细瞅瞅… TIM输入捕获简介 TIM输入捕获两种模式: 1. PWM输入模式 2. 输入捕获模式 调试记录 PWM输入模式: 该模式的理解: stm32的PWM输入捕获模式 仅适用于通道1、 2 从输入捕获中断说起… 从TIM3 CH1输入信号, .............. if(TIM_GetITStatus(TIM3,TIM_IT_CC1) == SET) // { ic1 = TIM_GetCapture1(TIM3)+1; //周期 ic2 = TIM_GetCapture2(TIM3)+1; //脉冲宽度
[单片机]
<font color='red'>STM32</font> TIM测 输入信号的 频率
STM32HAL库学习(二)CubeMx按键
首先是找到电路图,按键是高电平按下还是低电平按下 GPIO八种模式 https://blog.csdn.net/hailin0716/article/details/24333951 上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平。而在信号输入为低电平是输入端的电平应该也为低电平。 按键是按下时是高电平时,那无信号输入时要保持低电平,下拉输入 枚举KEYState_TypeDef 定义按键的两种状态 typedef enum{ KEY0_UP, KEY0_DOWN, KEY1_UP, KEY1_DOWN }KEYState_typedef; 函数有个 KEYState_TypeDef 类型的返回值
[单片机]
STM32HAL库学习(二)CubeMx按键
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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