stm32f10x独立看门狗

发布者:RadiantJourney最新更新时间:2021-11-08 来源: eefocus关键字:stm32f10x  独立看门狗  窗口看门狗 手机看文章 扫描二维码
随时随地手机看文章

一、IWDG介绍

1.1、独立看门狗简介

STM21F1芯片内部含有两个看门狗外设,独立看门狗(IWDG)与窗口看门狗(WWDG)。

两个看门狗都可以用于检测并解决由软件错误导致的故障。

独立看门狗可以简单的理解为一个12位的递减计数器,当计数器从某个值递减到0时(如果看门狗已激活),那么系统会产生一次复位。

如果在计数器递减到0之前刷新了计数器值,那么系统就不会产生复位。

这个刷新计数器值得过程称为“喂狗”。

独立看门狗功能由VDD电压域供电,在停止模式和待机模式下仍能工作。


1.2、IWDG结构框图

LSI:内部低速时钟,频率约在30~60KHz之间   仅适用于时间精度较低的场合,即便在主时钟发生 故障时仍然保持工作状态。


8 位预分频寄存器 IWDG_PR :LSI 时钟并不是直接提供给计数器时钟,而是通过一个 8 位预分频寄存器 IWDG_PR 分频后输入给计数器时钟。操作 IWDG_PR 寄存器来设置分频因子。8位预处理器(寄存器):分频因子有2,4,8,16,32,64,128,256。分频后的计数器时钟为:CK_CNT= 40/ 4*2^PRE,PRE 为预分频系数(0-6),4*2^PRE 大小就是 4、8、16、32、64、128、256 值。每经过一个计数器时钟, 计数器就减 1。

12位递减计数器:独立看门狗的计数器是一个 12 位的递减计数器,计数最大值为 0XFFF,当递减到 0 时,会产生一个复位信号,让系统重新启动运行,如果在计数器减到 0

之前刷新了计数器值的话,就不会产生复位信号,这个刷新计数器值过程称 之为“喂狗”。


12位  重加载数值:重装载寄存器是一个 12 位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。溢出时间 Tout = (4*2^pre) / 40 * rlr

(ms), pre 是预分频器系数(0-6),rlr 是重装载寄存器的值,公式内的 40 是 独立看门狗的时钟。 比如设置 pre=4,rlr=800,那么独立看门狗溢出时间是 1280ms,也就是说

如果在 1280ms 内没有进行喂狗,那么系统将进行重启,即程序重新开始运行

键寄存器(IWDG_KR)又称关键字寄存器或密钥寄存器(IWDG_KR)。此寄存器可以说 是 IWDG 的一个控制寄存器。往该寄存器写入三种值会有三种控制效果:

①写入 0X5555,由于 IWDG_PR 和 IWDG_RLR 寄存器具有写访问保护。若要 修改寄存器,必须首先对 IWDG_KR 寄存器写入代码 0x5555。若写入其他值将重 启写保护。

②写入 0XAAAA,把 IWDG_RLR 寄存器内值重装载到计数器中。


③写入 0XCCCC,启动 IWDG 功能。此方式属于软件启动,一旦开启独立看门 狗,它就关不掉,只有复位才能关掉IWDG的控制寄存器    

状态寄存器 IWDG_SR 只有位 0: PVU 和位 1: RVU 有效,这两位只能由硬件操作。RVU:看门狗计数器重装载值更新,硬件置 1 表示重装载值的更新正在进行中,更新完毕之后由硬件清 0。 PVU: 看门狗预分频值更新,硬件置 1 表示预分频值的更新正在进行中,当更新完成后,由硬件清 0。所以只有当 RVU/PVU 等于 0 的时候才可以更新重装载寄存器/预分频寄存器

二、IWDG配置

独立看门有自己的时钟LSI(内部低速时钟),不存在使能问题,但固件库还是提供LSI的使能函数

RCC_LSICmd(ENABLE); // 

while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==0){} // 复位LSE振荡器时钟

/**

  * @brief  Enables or disables the Internal Low Speed oscillator 振荡器(LSI).                                           使能或失能内部低速时钟

  * @note   LSI can not be disabled if the IWDG is running.                                                                        注意:当IWDG处于运行状态时,无法禁用LSI。

  * @param  NewState: new state of the LSI. This parameter can be: ENABLE or DISABLE.

  * @retval None

  */

void RCC_LSICmd(FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState;

}


内部低速时钟开启为的别名地址


#define CSR_LSION_BB              (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4))


#define PERIPH_BB_BASE        ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */   位带区域内的外围基地地址


#define CSR_OFFSET                (RCC_OFFSET + 0x24)


/* ------------ RCC registers bit address in the alias region ----------- */    RCC在别名区域寄存器位地址

#define RCC_OFFSET                (RCC_BASE - PERIPH_BASE)


#define LSION_BitNumber           0x00


(1)IWDG相关库函数在stm32f10x_iwdg.c和stm32f10x_iwdg.h文件中 

  开启寄存器访问(给IWDG_KP寄存器写入0x5555)

IWDG_WriteAccesscmd(IWDG_WriteAccess_Enable); // 取消寄存器写保护

/**

  * @brief  Enables or disables write access to IWDG_PR and IWDG_RLR registers.                                  失能或使能独立看门狗的预分频寄存器和独立看门狗重装载寄存器的写访问

  * @param  IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers.          独立看门狗的预分频寄存器与独立看门狗重装载寄存器 写访问的新状态

  *   This parameter can be one of the following values:

  *     @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers         

  *     @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers

  * @retval None

  */

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)

{

  /* Check the parameters */

  assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess));           assert_param宏 拥有检测函数的参数

  IWDG->KR = IWDG_WriteAccess;                                                              IWDG的KR(健存寄存器) 的0~15位写入0x5555 (0101 0101 0101 0101)   表示允许操作IWDG_PR与IWDG_RLR  即取消寄存器写保护           

}


#define IWDG_WriteAccess_Enable     ((uint16_t)0x5555)                 //  取消写保护

#define IWDG_WriteAccess_Disable    ((uint16_t)0x0000)                 //  写保护

#define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) ||

                                      ((ACCESS) == IWDG_WriteAccess_Disable))


(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是独立看门狗的时钟。

比如设置 pre=4,rlr=800,那么独立看门狗溢出时间是 1280ms,

只要在 1280ms 之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位   

看门狗的时钟不是准确的40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位

/**

  * @brief  Sets IWDG Prescaler value.                                                    设置预分频寄存器的值

  * @param  IWDG_Prescaler: specifies the IWDG Prescaler value.

  *   This parameter can be one of the following values:                         4     8     16      32      64    128     256

  *     @arg IWDG_Prescaler_4: IWDG prescaler set to 4

  *     @arg IWDG_Prescaler_8: IWDG prescaler set to 8

  *     @arg IWDG_Prescaler_16: IWDG prescaler set to 16

  *     @arg IWDG_Prescaler_32: IWDG prescaler set to 32

  *     @arg IWDG_Prescaler_64: IWDG prescaler set to 64

  *     @arg IWDG_Prescaler_128: IWDG prescaler set to 128

  *     @arg IWDG_Prescaler_256: IWDG prescaler set to 256

  * @retval None

  */


void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)

{

  /* Check the parameters */

  assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler));

  IWDG->PR = IWDG_Prescaler;                                                                预分频寄存器

}


/**

  * @brief  Sets IWDG Reload value.                                               独立看门狗重装载的值

  * @param  Reload: specifies the IWDG Reload value.                 设置独立看门狗重装载的值

  *   This parameter must be a number between 0 and 0x0FFF.     参数的取值范围0 ~ 0x0FFF

  * @retval None

  */

void IWDG_SetReload(uint16_t Reload)

{

  /* Check the parameters */

  assert_param(IS_IWDG_RELOAD(Reload));

  IWDG->RLR = Reload;

}


(3)重载计数器值(喂狗)给IWDG_KR寄存器写入0xAAAA

IWDG_ReloadCounter();

/**

  * @brief  Reloads IWDG counter with value defined in the reload register

  *   (write access to IWDG_PR and IWDG_RLR registers disabled).

  * @param  None

  * @retval None

  */

void IWDG_ReloadCounter(void)

{

  IWDG->KR = KR_KEY_Reload;

}


/* KR register bit mask */

#define KR_KEY_Reload    ((uint16_t)0xAAAA)       

#define KR_KEY_Enable    ((uint16_t)0xCCCC)


(4)开启IWDG(给IWDG_KR寄存器写入0xCCCC)

IWDG_Enable();

/**

  * @brief  Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled).

  * @param  None

  * @retval None

  */

void IWDG_Enable(void)

{

  IWDG->KR = KR_KEY_Enable;

}


四、编写独立看门狗

通过 KEY_UP 按键进行喂狗,喂狗的时候 DS1 点亮, 同时串口输出“喂狗”提示信息,超过喂狗时间系统重启 DS1 熄灭,同时串口输 出“复位系统”提示信息,同时使用 DS0 指示灯闪烁表示系统运行编写看门狗例子1

#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();  //重装载初值

}

 

头文件


#ifndef _iwdg_H

#define _iwdg_H

 

#include "system.h"

void IWDG_Init(u8 pre,u16 rlr);

void IWDG_FeedDog(void);  //喂狗

 

#endif

 

主函数


#include "system.h"

#include "SysTick.h"

[1] [2]
关键字:stm32f10x  独立看门狗  窗口看门狗 引用地址:stm32f10x独立看门狗

上一篇:stm32F103的端口与管脚的功能定义表
下一篇:STM32带位操作

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

STM32F10x_RTC日历
Ⅰ、概述 接着上一篇文章来讲述关于RTC的计数功能,我们以实例RTC日历(读写年、月、日、星期、时、分、秒)来讲述该章节。 STM32F1系列芯片的RTC功能和其他系列(F0、F2、F4等)相比来说,功能要弱一点,原因在于F1系列的RTC日历功能需要我们通过软件进行处理(换算RTC计数值)才能真正实现RTC日历的功能,而其他系列芯片不用这么麻烦,可直接读取日历值。 该文和上一篇文章的区别:1、RTC时钟源选择LSE(外部低速时钟); 2、分频值是32768; 3、读写了RTC_CNT(计数值),用于RTC日历。 本文章提供的实例工程,其实验效果是: 主函数间隔0.5秒LED变化一次; 间隔1秒中断:读取日历并打印出来。
[单片机]
STM32F10x_RTC日历
STM32F10x 学习笔记之基本定时器
大容量的STM32F101xx、STM32F103xx系列和互联型产品中包含了两个基本定时器,TIM6和TIM7。这两个定时器功能非常简单,基本上和SysTick 定时器相当。 但是我在使用的时候确是费了一番周折才调试通过,所以还是应该将这两个定时器的使用方法好好的写一写。 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。简单的说两个定时器是从0计数到N(由自动装载计数器来确定N的具体值),然后复位回0 重新计数。每次复位到0 的时候可以产生对应的中断信号,或者产生DMA 请求,还可以触发DAC 同步电路。不过这次笔记不讨论触发DAC 的问题,等写到DAC 的使用时在讲解如何用这两定时器
[单片机]
STM32F10x_ 模拟I2C读写EEPROM
Ⅰ、写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件。但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1、我们有必要学习I2C通信吗? I2C作为常见串行通信的其中一种,在嵌入式领域中占有很重要的地位。原因在于我们嵌入式开发的产品中有很多设备都是使用I2C进行通信的。我们开始学习单片机开发的时候最先接触的应该是使用I2C操作EEPROM(如AT24C08)通信,这也是典型的I2C通信例子。其实还有很多常见的I2C通信设备,如温度芯片、触摸芯片、时钟芯片等,当你工作今后或多或少都会遇到I2C通信的设备。所以,如果你有时间的话,请花一定时间去研究学习一下
[单片机]
STM32F10x_ 模拟I2C读写EEPROM
stm32f0独立看门狗配置
独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。 设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间 (也就是看门狗溢出时间) ,该时间的计算方式为 Tout=((4×2^prer) ×rlr) /40 具体配置 先开启看门狗 对看门狗进行设置,这里主要的是设置IWDG down-counter reload value。IWDG counter clock prescaler为分频系数,我现在项目设置的IWDG的时钟是40KHz,所以分频后为40000/16=2500Hz,我先在项目需要使用1秒的看门狗,则250
[单片机]
stm32f0<font color='red'>独立</font><font color='red'>看门狗</font>配置
STM32独立看门狗(宠物狗)
一、前言 ······在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) ,其主要功能是:能够让CPU复位的一个硬件。 ······看门狗( watchdog timer),是一个定时器电路, 一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作
[单片机]
STM32<font color='red'>独立</font><font color='red'>看门狗</font>(宠物狗)
stm32f10x 中断分组
一、中断优先级分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); #define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*! 0 bits for pre-emption priority 4 bits for subpriority */ #define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*! 1 bits for pre-emption priority 3
[单片机]
<font color='red'>stm32f10x</font> 中断分组
独立看门狗IWDG详细解析
独立看门狗IWDG详细解析 为什么要有看门狗? 看门狗的定时原理 寄存器功能简介 看门狗定时器计数原理 看门狗相关寄存器 KR寄存器 PR寄存器 RLR寄存器 SR寄存器 看门狗相关基础知识 什么是“溢出时间”? 溢出时间指的是“从重装载值递减至0的时间”,当距离上次使能键寄存器的时间超过溢出时间,那么看门狗会自动复位,重投开始执行程序。例如:当我们设定溢出时间为1s,但是我们操作键寄存器距离上次使能键寄存器的时间已经是1.2s了,这说明程序已经Reset复位,从头开始执行(从main函数的头部开始执行)。 预分频系数有什么用? “溢出时间”如何计算? 不同预分频系数
[单片机]
<font color='red'>独立</font><font color='red'>看门狗</font>IWDG详细解析
关于 stm32f10x_conf.h 在外设V3.4版本的是使用说明
先说这个问题,大家都知道,我们在选择使用哪些外围的的时候,是去更改从官方模版中拷贝过来的stm32f10x_conf.h文件的27-48行,把我们要用的外围的头文件包含进来,不用的外围的头文件注释掉,但是你是否发现我们根本没有在用户主程序文件中包含stm32f10x_conf.h这个文件。那我们的修改这个文件怎么进入主程序文件的呢?答案只有一个,它包含在stm32f10x.h这个文件中,因为在用户主文件中我们第一句就使用了#include stm32f10x.h ,所以应该是stm32f10x.h这个文件包含了stm32f10x_conf.h,间接的包含进了用户主程序文件中。(其实大家去看看固件库的文件结构图就明白了确实是这
[单片机]
关于 stm32f10x_conf.h 在外设V3.4版本的是使用说明
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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