【STM32】基于IWDG实现复位(手动喂狗)功能
目标:
没按下KEY1(没喂狗):LED反复点亮熄灭
按下KEY1(喂狗):一直进复位, LED不亮
一.原理分析
1.看门狗:IWDG(独立看门狗), WWDG(窗口看门狗)
2.
电脑死机—>强制关机并重启
仪器仪表的CPU—>遇到强电场和大功率设备->处理器跑飞->程序中的pt指针跳到另一个地方执行或者不能运行->仪表死机->复位仪表->独立看门狗实现
3.STM32寄存器手册(3个)
键寄存器(IWDG_KR):喂狗值(复位):写0xAAAA, 允许访问寄存器:写0x5555, 启动看门狗:写0xCCCC
预分频寄存器(IWDG_PR):分频倍数为0、1、2、3......(我选择4倍频)(IWDG工频40KHZ)
40KHZ/4*2^4 = 625HZ(重装载值设置为625)
重装载寄存器(IWDG_RLR):决定复位时间(我设置的4倍频+重装载值设为625, 一秒一个复位(喂狗时间))
寄存器知道怎么设置了, 那库函数中有给IWDG封装好的函数吗?
4.库函数手册
1.LED要亮灭, 所以初始化LED
void Led_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);}
套路:
1.定义结构体对象, 对象赋值, 调用xxxx_Init函数。
2.开启GPIOA外设挂载在APB2上的时钟
2.用到延时函数, 初始化SysTick
中断处理函数:
void SysTick_Handler(void)
{if(TimingDelay != 0)TimingDelay--;
}
初始化SysTick函数:
void SysTick_Configuration(void)
{while(SysTick_Config(72));SysTick->CTRL &= ~(1<<0);}
利用中断实现延时函数:
void Delay_us(unsigned int i)
{TimingDelay = i;SysTick->CTRL |= (1<<0);while(TimingDelay); SysTick->CTRL &= ~(1<<0);
}
3.初始化IWDG
void IWDG_Configuration(void)
{IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(IWDG_Prescaler_64);IWDG_SetReload(625);IWDG_ReloadCounter();IWDG_Enable();
}
注意:
1.使能对PR和RLR的写操作, 分频, 重装载值, 重装载值放在IWDG定时器中,使能IWDG
2.复位时间为一秒:工频/分频率*传入参数(例:1000000)
4.PA0配置成喂狗(复位)操作
1.初始化KEY1
void Key_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);}
注意:
1.结构体对象, 对象赋值, Init函数,开启GPIOA挂载在APB2上的时钟
2.KAY1在PA0上
2.喂狗操作的配置
给KR(键寄存器)写0xAAAA, 复位(喂狗)。
void IWDG_EeedDog(void)
{IWDG_ReloadCounter();
}
注意:
1.IWDG_ReloadCounter();(重装载计数器函数)
这个函数默认值为0xAAAA, 也就是参数,给KR寄存器写0xAAAA,实现复位 。所以直接调用此函数就实现了喂狗(复位)功能。
5.main函数写法
int main(void)
{SysTick_Configuration();Led_Configuration();¯IWDG_Configuration(); Key_Configuration();LED_TOGGLE;Delay_us(100000);LED_TOGGLE;Delay_us(100000);while(1){if(Key_Scan(GPIOA, GPIO_Pin_0) == KEY_ON)IWDG_EeedDog();Delay_us(10);}
}
说明:
1.分别是各个函数的调用。
2.没按下按键之前, LED闪烁;按下按键后(喂狗复位后), LED熄灭。
6.效果展示
https://www.bilibili.com/video/BV1Qa411e7UN?spm_id_from=333.999.0.0https://www.bilibili.com/video/BV1Qa411e7UN?spm_id_from=333.999.0.0
【STM32】基于IWDG实现复位(手动喂狗)功能相关推荐
- STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)
STM32的复位方式:硬件复位.软件复位(看门狗复位和系统复位). 1.硬件复位: 硬件复位通过给NRST引脚输入低电平复位单片机. 2.看门狗复位: 独立看门狗和窗口看门狗. (1)独立看门狗 ST ...
- stm32增加IWDG(看门狗)功能
现有工程是通过stm32CubeMX生成,并且新增很多逻辑.当前需求是需要增加看门狗功能,如果还是用stm32CubeMX生成,还需要将之前的逻辑再移植一遍,很麻烦. 1. 先新建一个stm32Cub ...
- 正点原子STM32(基于HAL库)3
目录 高级定时器实验 高级定时器简介 高级定时器输出指定个数PWM 实验 高级定时器输出指定个数PWM原理 TIM1/TIM8 寄存器 硬件设计 课堂源码(输出指定个数PWM灯就闪几次) 程序设计 下 ...
- STM32学习心得十七:窗口看门狗(WWDG)实验及旧知识点复习
记录一下,方便以后翻阅~ 主要内容: 1) 窗口看门狗概述: 2) 常用寄存器和库函数配置: 3) 窗口看门狗实验. 窗口看门狗实验内容: 为了对之前的知识进行总结复习,本人在教学案例的基础上又&qu ...
- STM32F10xx中独立看门狗(IWDG)和窗口看门狗(WWDG)介绍
本文大部分内容只用到了键盘的3个按键-你懂的 . 简单总结,Markdown了解一下,推荐. 1.看门狗电路介绍 看门狗电路(watchdog timer),又称监控电路.百度百科解释的很详细: 在由 ...
- 正点原子STM32(基于HAL库)0
目录 开发环境搭建与使用 常用开发工具简介 MDK 安装 仿真器驱动安装 CH340 USB 虚拟串口驱动安装 使用MDK5 编译例程 使用串口下载程序 使用DAP 下载与调试程序 使用DAP 下载程 ...
- 基于51单片机的手动数字时钟
具体实现功能 实现功能: (1)利用数码管显示时分秒,显示格式为"时-分-秒": (2)利用6个按键控制时.分.秒: (3)设置秒复位按键,可实现秒钟复位. 单片机介绍 51单片是 ...
- 正点原子STM32(基于HAL库)5
目录 SRAM 实验 存储器简介 SRAM 方案简介 硬件设计 程序设计 程序流程图 程序解析 下载验证 内存管理实验 内存管理简介 硬件设计 程序设计 程序流程图 程序解析 下载验证 SD 卡实验 ...
- STM32实战总结:HAL之看门狗
在由单片机构成的微型计算机系统中,单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环:或者因为用户配置代码出现BUG,导致芯片无法正常工作.出于对单片机运行状态进行实时监测的考虑 ...
最新文章
- LeetCode 94. Binary Tree Inorder Traversal--二叉树中序遍历--递归,迭代--C++,Python解法
- HBase性能优化方法总结(四):数据计算
- 二、python基础(列表、元组、字符串、集合、字典、文件操作,函数基本语法及特性)...
- linux线程并不真正并行,Linux系统编程学习札记(十二)线程1
- js导入导出总结与实践
- 取KindEditor中的textarea的值区不到的解决方案,固定kindEditor的高度
- 燃!Java全球标准中国人参与制定,阿里成首个受邀中国公司
- 面试官:Redis的事务满足原子性吗?
- 2019年的第三场LiveVideoStackCon有何不同?
- 战斗机各种世界之最,涨知识了。。。
- ubuntu安装python3.8_Ubuntu 16.04 安装 python3.8
- Docker Desktop 向大公司宣告收费,网友大呼:是时候弃用了!
- Node.js Path 模块
- ubuntu 16.04下安装mysql
- 常用公差配合表图_常用的机械测量工具竟然这么多?你知道几个?
- 哪里获取计算机新闻比较好,学新闻的用什么电脑比较好
- 【阿里巴巴Java编程规范学习 三】Java异常日志规约
- reg、wire与logic的区别
- 让连续的英文或数字自动换行
- 如何利用python准确预测双色球开奖结果
热门文章
- Coffee Chicken
- ppi协议源码 c语言,S7-200 PLC的PPI协议及其开发实例
- spread运算符_JavaScript中的Spread运算符有什么用?
- 编程之美之一摞烙饼的排序1
- 【K8S 三】部署 metrics-server 插件
- [经验] PROTEUS仿真学习笔记05 (SPI 协议 外设)——2014_7_15
- 网易我的世界java进不去_网易我的世界端游怎么进不去
- MongoDB之查询文档
- 计算机设计核心思想,科学网—计算机设计的两种理念,颠覆os的计算机 - 姜咏江的博文...
- 使用LumaQQ来开发QQ机器人