STM32的独立开门狗怎么启用和停止

发布者:清晨微风最新更新时间:2018-10-05 来源: eefocus关键字:STM32  独立开门狗  启用和停止 手机看文章 扫描二维码
随时随地手机看文章

STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。


看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号) 。


在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA,  IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位  。


IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。


只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32 的独立看门狗,启动过程可以按如下步骤实现(独立看门狗相关的库函数和定义分布在文件 stm32f10x_iwdg.h 和stm32f10x_iwdg.c 中) :


1)取消寄存器写保护(向 IWDG_KR 写入 0X5555)


通过这步,我们取消 IWDG_PR 和 IWDG_RLR 的写保护,使后面可以操作这两个寄存器,设置 IWDG_PR 和 IWDG_RLR 的值。这在库函数中的实现函数是:


IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);


2)设置独立看门狗的预分频系数和重装载值 


设置看门狗的分频系数的函数是:


void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);  //设置 IWDG 预分频值


设置看门狗的重装载值的函数是:


void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值


设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间 (也就是看门狗溢出时间) ,该时间的计算方式为:


Tout=((4×2^prer)  ×rlr) /40


其中 Tout 为看门狗溢出时间(单位为 ms) ;prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值) ;


比如我们设定 prer 值为 4, rlr 值为 625,那么就可以得到 Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。


3)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)


库函数里面重载计数值的函数是:


IWDG_ReloadCounter();   //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器


通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。 即实现独立看门狗的喂狗操作。


4)  启动看门狗(向 IWDG_KR 写入 0XCCCC)


库函数里面启动独立看门狗的函数是:


IWDG_Enable();   //使能 IWDG


通过这句,来启动 STM32 的看门狗。注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。


关键字:STM32  独立开门狗  启用和停止 引用地址:STM32的独立开门狗怎么启用和停止

上一篇:STM32F411RE Nucleo笔记-按键控制PWM占空比
下一篇:STM32F4 FLASH读写操作

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

STM32】HAL库-串口USART
USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 一个波特率寄存器(USART_BRR),12位的整数和4位小数 任何USART双向通信至少需要两个脚: 接收数据输入(RX)和发送数据输出(TX) 当发送器被激活并且不发送数据时,TX引脚处于高电平 在起始位期间,TX脚处于低电平,在停止位期间处于高电平。 发送和接收由一共用的波特率发生器驱动,当发送器和接收器的使能位分别置位时,分别为其产生时钟。 空闲符号和端口符号 空闲符号是一个帧,并且全部由1组成,空闲帧后面跟着
[单片机]
【<font color='red'>STM32</font>】HAL库-串口USART
STM32——按键输入之static
Static申明的局部变量,存储在静态存储区。 它在函数调用结束之后,不会被释放。它的值会一直保留下来。 所以可以说static申明的局部变量,具有记忆功能。 按键扫描(支持连续按)的一般思路 u8 KEY_Scan(void) { if(KEY按下) { delay_ms(10);//延时10-20ms,防抖。 if(KEY确实按下) { return KEY_Value; } return;// 无效值 } } 按键扫描(不支持连续按)的一般思路 u8 KEY_Scan(void) { static u8 ke
[单片机]
stm32 mpu6050 模拟i2c实例实现
最近准备一个比赛,所以正在加紧学习stm32,这篇文章就结合mpu6050分析一下利用i2c实现芯片之间的通信。 首先可以在原有的LED文件或显示屏(OLED)的文件基础上,新建一个HANDWARE,在其中加入mpu6050.c和mpu6050.h(名字自定)。 首先是在C文件中加入基本的I2C通信函数 1.I2C的GPIO端口初始化SDA、SCL设置为推挽输出。 2.然后是i2c_start();i2c_stop();函数,根据时序图设置SCL、SDA的高低电平变化。 3.之后加入主机ack的响应函数和ack的等待响应函数i2c_wait_ack();i2c_ack();i2c_wai
[单片机]
<font color='red'>stm32</font> mpu6050 模拟i2c实例实现
简析STM32的启动过程
  当前的嵌入式应用程序开发过程里,C语言已成为了绝大部分场合的最佳选择。如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。   无论性能高下,结构简繁,价格贵贱,每一种微控制器(
[单片机]
STM32学前班教程之四:打好基础建立模板
1、 新建目录Project_IAR4,按照自己的顺序重新组织dll(驱动);inc、src函数库;settings,其他所有文件全部放这个新建的目录下。 2、 双击打开Project.eww,继续更改内部设置。 3、 需更改的内容列表: 位置和项目 目标 说明 ProjectEdir confignations 新建基于STM3210B的配置 编译目标和过程文件存放 ProjectOptionGeneral OptionTarget ST STM32F10x 选择芯片类型 ProjectOption C/C++ CompilerPreprocessorAdditional include directori
[单片机]
stm32---SPI与外部FLASH
stm32外部flash是EN25QXX 芯片 使用 STM32F1 的 SPI 和外部 FLASH(EN25QXX)进行通信,实现数据的读写 操作。本章要实现的功能是:首先检测外部 FLASH 是否正常,然后使用 K__UP 和 K_DOWN 键控制 FLASH 的写入和读取,并将 数据显示在 串口助手上,同时控制 D1 指示灯不断闪烁,提示系统正常 运行 W25Q128 将 16M 的容量分为 256 个块( Block),每个块大小为 64K 字 节,每个块又分为 16 个扇区( Sector),每个扇区 4K 个字节。 W25Q128 的最小擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W2
[单片机]
如何在linux环境下使用gcc进行stm32项目开发
背景 我之前一直是从事单片机相关的开发工作,对于STM32平台的开发,都是在keil中进行的。后来转为搞linux相关的开发了,发现开发工具是大大的不同,linux下的开发都是makefile+gcc+gdb,写代码也是用sourceInsight,代码的编译也是在服务器上进行的,没有了集成开发环境,当对这样的开发模式逐渐熟悉之后才发现Makefile真的很强大,开发效率高,对底层细节也是掌握了很多,弥补了不少盲区。keil工具虽然十分方便,但对于开发人员来说,隐藏了太多的细节,灵活性不高,对于高级应用显得力不从心了。因此在习惯了linux平台的开发之后,我萌生了一个想法:在linux下进行stm32的开发,这里涉及到的开发环境的
[单片机]
如何在linux环境下使用gcc进行<font color='red'>stm32</font>项目开发
STM32基础知识:中断系统
中断系统 1 数据传输方式 无条件传输 :处理器不必了解外部设备状态,直接进行数据传输,用于指示灯和按键等简单设备.。 查询方式 :传输前,一方先查询另一方的状态,若已经准备好就传输,否则就继续查询。 中断方式 :一方通过申请中断的方式与另一方进行数据传输,收发双方可以并行工作。 直接存储器访问 :处理器内部建立片内外设和内存之间的数据传输通道,传输过程不需要处理器参与。 2 中断系统的基本概念 2.1 中断全过程 中断发生: 当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理。 中断处理: CPU暂停当前的工作,转去处理事件B。 中断返回: 当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继
[单片机]
<font color='red'>STM32</font>基础知识:中断系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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