基于STM32的独立看门狗详细用法(IWDG)
文章目录
- 前言
- 一、IWDG
- 1.简介
- 2.主要特性
- 3.独立看门狗框图
- 二、使用步骤
- 1.独立看门狗初始化
- 2.完整代码
- 三、功能演示
前言
今天要学习的是独立看门狗,看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位。即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
一、IWDG
1.简介
独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持 工作状态。
IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时
间精度要求较低的场合。
2.主要特性
● 自由运行递减计数器
● 时钟由独立 RC 振荡器提供(可在待机和停止模式下运行)
● 当递减计数器值达到 0x000 时产生复位(如果看门狗已激活)
3.独立看门狗框图
二、使用步骤
1.独立看门狗初始化
void iwdg_init(void)
{//允许访问独立看门狗IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//配置独立看门狗的分频值为256//独立看门狗的硬件时钟=32khz/256=125hzIWDG_SetPrescaler(IWDG_Prescaler_256);//设置独立看门狗的计数值124,1秒钟IWDG_SetReload(125-1);//刷新计数值IWDG_ReloadCounter();//使能看门狗工作IWDG_Enable();}
2.完整代码
#include "stm32f4xx.h" // Device header
#include "sys.h"
#include "stdio.h"static GPIO_InitTypeDef GPIO_InitStructure;
static USART_InitTypeDef USART_InitStructure;
static NVIC_InitTypeDef NVIC_InitStructure;
static uint16_t d;struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)
{USART_SendData(USART1,ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);return ch;
}void delay_ms(uint32_t n)
{while(n--){SysTick->CTRL = 0; // Disable SysTickSysTick->LOAD = (168000)-1; // Count from 255 to 0 (256 cycles)SysTick->VAL = 0; // Clear current value as well as count flagSysTick->CTRL = 5; // Enable SysTick timer with processor clockwhile ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set}SysTick->CTRL = 0; // Disable SysTick
}
void delay_us(uint32_t n)
{while(n--){SysTick->CTRL = 0; // Disable SysTickSysTick->LOAD = (168)-1; // Count from 255 to 0 (256 cycles)SysTick->VAL = 0; // Clear current value as well as count flagSysTick->CTRL = 5; // Enable SysTick timer with processor clockwhile ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set}SysTick->CTRL = 0; // Disable SysTick
}void usart1_init(uint32_t band)
{//打开硬件时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//打开串口1硬件时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//配置PA9和PA10为服用功能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化//将PA9和PA10引脚连接到串口1的硬件GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//配置串口1相关参数:波特率、无校验位、8位数位、1位停止位USART_InitStructure.USART_BaudRate = band; //波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据位USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶检验USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //允许收发数据USART_Init(USART1, &USART_InitStructure);//配置串口1的中断触发方法 接收一个字节触发中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//配置串口1的中断优先级NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);//使能串口1工作USART_Cmd(USART1,ENABLE);
}void iwdg_init(void)
{//允许访问独立看门狗IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//配置独立看门狗的分频值为256//独立看门狗的硬件时钟=32khz/256=125kzIWDG_SetPrescaler(IWDG_Prescaler_256);//设置独立看门狗的计数值124,1秒钟IWDG_SetReload(125-1);//刷新计数值IWDG_ReloadCounter();//使能看门狗工作IWDG_Enable();}int main(void)
{int32_t d;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟//GPIOF9,F10初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//复用功能模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO_SetBits(GPIOF,GPIO_Pin_9);usart1_init(115200);iwdg_init();if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET){printf("iwdg reset cpu\r\n");}else{printf("normal reset cpu\r\n");}RCC_ClearFlag();while(1){//delay_ms(2000);//喂狗IWDG_ReloadCounter();}}void USART1_IRQHandler(void)
{//检查标志位if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET){d=USART_ReceiveData(USART1);printf(d+"");//清空标志位USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}
三、功能演示
这次实验使用的是裸机代码实现。
首先把while循环的延时2秒注释打开如下图所示:
这时就会在2秒后喂狗,这样就会导致独立看门狗复位cup
我们使用串口打印信息。
效果如下:
可以看到芯片一直在被看门狗复位。
当把延时两秒的代码注释掉,效果如下图所示:
没有一直打印看门狗复位cpu的信息,当按下我们板子上的复位键时
基于STM32的独立看门狗详细用法(IWDG)相关推荐
- STM32之独立看门狗与窗口看门狗总结
一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...
- STM32之独立看门狗原理
STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即主时钟发生故障,它也仍然有效,这里我们需要注意独立看门狗的时钟不是准确的40Khz,二是在30~60Khz之间变化的一个时钟,只是我们估算以 ...
- proteus里面没有stm32怎么办_学习STM32日志——独立看门狗实验(20.06.23)
继续更新学习STM32的历程,今天学习看门狗. 在单片机构成的微型计算机系统中,单片机的工作时常收到外界电磁场的干扰,导致程序跑飞,陷入死循环.为了解决这个问题,产生了一种用于监测单片机程序运行状态的 ...
- 【STM32】独立看门狗程序
00. 目录 文章目录 00. 目录 01. 独立看门狗简介 02. 程序功能示例 03. 硬件设计 04. 编程步骤 05. 程序示例 06. 附录 07. 声明 01. 独立看门狗简介 STM32 ...
- 【STM32】独立看门狗
00. 目录 文章目录 00. 目录 01. IWDG简介 02. IWDG主要特性 03. IWDG功能说明 04. IWDG框图 05. IWDG寄存器 5.1 关键字寄存器 (IWDG_KR) ...
- [STM32 ]内部独立看门狗IWDG
看门狗大家应该都不陌生,STM32内部带有独立看门狗和窗口看门狗两种:其中独立看门狗依赖于内部的晶振LSI进行工作,窗口看门狗依赖于系统时钟工作: 看门狗的作用,防止程序跑飞无法实现自复位而存在:如果 ...
- STM32之独立看门狗
看门狗 Watch Dog 一.看门狗是什么? 第一次听到看门狗还是比较新奇的,当时对这个看门狗没有概念,现在看来这个看门狗英译 过来有点怪怪的,原意应为监视,监管的狗,本质上是一个定时器电路,用来监 ...
- 7、【STM32】独立看门狗和窗口看门狗(IWDG、WWDG)实验
前言 使用的是正点原子的探索者开发板进行学习,芯片:STM32F407ZGTx 学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接. 注:本文档添加了对代码的在线调试功能,有助 ...
- STM32的独立看门狗
独立看门狗时钟频率一般以40KHz,但不是非常准确,变化范围在15-47KHz. 看门狗在开启后不能关闭,除非复位. 1.寄存器 关键字寄存器 IWDG_KR:用来写指令,指令有0xAAAA(把IWD ...
最新文章
- 当前人工智能技术都在哪些领域有应用
- C++ goto的用法
- 在OpenCV环境下写的两个图像平移C和C++源代码
- 开源大数据周刊-第72期
- 取木棒21根c语言,关于m根火柴 ,人机最多取n根火柴(21根火柴进阶)
- 小女也爱c#(3)--俄罗斯方块练习数组
- PAT甲级1080 Graduate Admission【模拟】
- 在后台获取前台按钮里的值(如LinkButton)
- OpenGL 坐标变换(1)
- JAVA中JDK环境变量配置
- 一条龙教程:Matlab下使用yalmip(工具箱)+cplex(求解器)
- LeetCode题解:猜数字大小
- AI智能尺寸测量仪简介(图像尺寸测量仪)
- LiDAR 4 固态激光雷达 (Flash LiDAR)
- 高仿小米商城项目,我爱了!
- Debian安装Python简要说明
- C++输入中iomanip的使用(基础)
- Android 快速实现Parcelable接口
- nvm最强安装配置教程
- Chrome浏览器中如何将开发者工具(F12)语言从英文设置成中文
热门文章
- 心理学:情商高的人必懂的三大沟通技巧
- 参加oschina成都MIT Talk得到的收获
- 终极解决方案:windows10 pip安装提示PermissionError: [WinError 5] 拒绝访问
- 各种银行卡的收费情况
- 冷数据冷存储,蓝光森林为企业级存储降本增效
- SQL分析——常见问题十(日期查询)
- 学计算机的男生怎么样,男生选择计算机专业好不好?学计算机技术怎么样?
- 彻底删除风行这个垃圾
- C#“调用的目标发生了异常”之终极解决办法
- 洗地机什么牌子最好?洗地机品牌推荐排行榜