【零基础学STM32】CubeMX+HAL 喂狗小教程
IWDG&WWDG
- 内容简介
- 一点小原理
- CubeMX配置
- 工程代码
- 出现的问题
- 参考文献
内容简介
IWDG独立看门狗&WWDG窗口看门狗作为特殊的两类定时器,在检测异常,定期复位有很有效果的应用,本文基于STM32F429IGT6写了一个简单的入门小教程,用其中的一些原理实现一点小功能
一点小原理
简单介绍一下两类定时器。定时器的调用方法无非预分频系数和递增递减达到某个特定值实现复位或者中断,看门狗同样,不同的是通过喂狗可以暂缓复位的到来。二者都采用递减计数。
IWDG可以在监测到异常自动复位保护,也叫硬件看门狗。可以用LSI RC 32MHZ时钟做时钟源,主要就三个寄存器影响。
关键字寄存器IWDG_KR,写入0xAAAA将重装载值写入寄存器,使重头开始计数,就是喂狗;0x5555表示可以对分频系数和重装载值进行修改;0xCCCC表示启动看门狗,在HAL库都有函数对应,了解即可
IWDG_PR预分频系数修改,IWDG_RLR重装载值修改,和普通的TIM很类似除了喂狗一步,就相当于重新复位。
喂狗时间(溢出时间)如下所示,超过这个时间定时器就会复位,正常程序跑的时候没错误就不要让它复位,算出他的周期然后选一个不大不小的时间清空定时器(喂狗)起到需要的目的
WWDG可以监测应用软件等一些错误时复位,也叫软件看门狗,其工作原理图大概如此
WWDG_CR寄存器,T7(WDGA)位置1表示启用窗口看门狗,通常用软件置1;;T[6:0]存储看门狗周期,从0x00-0x3F都可以
超时时间通过你在w[6:0]中设定的值和0x3F进行比较得到周期,用用的时钟频率乘上周期即可,公式如下
假设采用45Mhz的时钟源,,预分频系数设成0,此时周期为91ns 以此类推。
0x40->0x37会reset T6若1->0使MCUreset
EWI会在T[6:0]为0x40时置1,产生中断,在中断服务函数里面写喂狗就可以实现不复位,但要和你自己设定的周期做对比,在小于周期时间内喂完狗,否则还是会复位
总结下来就是:IWDG设置PRE和RLR,WWDG使能时钟PCLK1 设置PRE 窗口值w 计数值T就可以了
CubeMX配置
配置时钟源,这里我选用IWDG用内部源32M,WWDG外部在最上面一栏勾选好两个的参数,再到NVIC里面改好优先级,初始化两个小灯,一个按键,改好工程名没了
工程代码
IWDG:先点亮0灯,延时0.1s初始化看门狗,在死循环里面写如果检测到按键按下就喂狗,否则按照设定的周期反转电平,小灯呈现闪烁
int main(void)
{HAL_Init(); //初始化HAL库 Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhzdelay_init(180); //初始化延时函数LED_Init(); //初始化LED KEY_Init(); //初始化按键delay_ms(100); //延时100ms再初始化看门狗,LED0的变化"可见"IWDG_Init(IWDG_PRESCALER_64,500); LED0=0;while(1){if(KEY_Scan(0)==WKUP_PRES) //如果WK_UP按下,喂狗{IWDG_Feed(); //喂狗}delay_ms(10); }
}
WWDG:先点亮1灯,延时0.3s后进入看门狗初始化,在死循环里熄灭1灯。通过设定好的时间,在回调函数里面不断的刷新CR的值,并且翻转0灯电平,实现周期检测。
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{ __HAL_RCC_WWDG_CLK_ENABLE(); //使能窗口看门狗时钟HAL_NVIC_SetPriority(WWDG_IRQn,2,3); //抢占优先级2,子优先级为3HAL_NVIC_EnableIRQ(WWDG_IRQn); //使能窗口看门狗中断
}
//窗口看门狗中断服务函数
void WWDG_IRQHandler(void)
{HAL_WWDG_IRQHandler(&WWDG_Handler);//调用WWDG共用中断处理函数
}
//中断服务函数处理过程
//此函数会被HAL_WWDG_IRQHandler()调用
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
{HAL_WWDG_Refresh(&WWDG_Handler,WWDG_CNT);//更新窗口看门狗值LED1=!LED1;
}int main(void)
{HAL_Init(); //初始化HAL库 Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhzdelay_init(180); //初始化延时函数LED_Init(); //初始化LED KEY_Init(); //初始化按键LED0=0; //点亮LED0delay_ms(300); //延时300ms再初始化看门狗,LED0的变化"可见"WWDG_Init(0X7F,0X5F,WWDG_PRESCALER_8); //计数器值为7F,窗口寄存器为5F,分频数为8while(1){LED0=1; //熄灭LED灯 }
}
现象正常出现,实验结束
注意,回调函数没使用EWI,只用了普通的回调,EWI回调是
HAL_WWDG_EarlyWakeupCallback(WWDG_HandlerTypeDef *hwwdg)
出现的问题
调整好WWDG优先级,以及先点亮DS0再初始化WWDG,否则会无法进入中断回调函数,看不到现象。
第一次移植的时候 出现了进不到中断函数的现象,外部delay竟然能改变中断里面那个灯的闪烁周期,maybe是优先级出了问题,改完好了。
WWDG和IWDG作为一个小保险还是有用的,在代码里面放进去,一旦出现异常,能重新复位,保护程序和芯片,也能比较及时发现问题。
参考文献
1.正点原子STM32F429开发指南-HAL库版本_V1.1
2.王维波 STM32Cube高效开发教程(基础篇)
只是做了一个简述,更详细的寄存器知识详见野火教程
代码和正点原子官方的兼容,就不上传git链接了
ps:如果我哪里说的不清楚 欢迎指出,我会在第一时间进行修改
【零基础学STM32】CubeMX+HAL 喂狗小教程相关推荐
- 零基础学stm32要多久?stm32应该怎么学?
STM32由于资料丰富.稳定.性价比高深得广大工程师和企业的喜爱. 现在随便在招聘平台上搜索单片机开发或者嵌入式开发,基本都要求会STM32. 我用STM32也有很多年了,基本上是围绕着F103.F0 ...
- 【零基础学STM32】CubeMX+HAL玩转电机控制
Motor 主要内容 前置知识 CubeMX配置 代码 出现的问题 参考文献 主要内容 基于被我鸽了的电控作业 主控 STM32F429IGT6 电机TT小黄 模拟小车所以两路编码器 前置知识包括 P ...
- 小甲鱼零基础学python pdf_鱼C论坛小甲鱼《零基础入门学习python》课程课后题.pdf...
第 1 课 0. Python 是什么类型的语言? Python 是脚本语言 脚本语言 (Scripting language) 是电脑编程语言,因此也能让开发者藉以编写出 让电脑听命行事的程序. 以 ...
- 【零基础学STM32】CubeMx+HAL配置按键点灯实验
试验流程 主要内容 cubemx配置 代码部分 1.普通功能 2.模块化设计 1 2 遇到的问题 主要内容 上一篇文章中采用了EXTI中断的方式控制小灯的亮灭.其实也可以不采用中断,直接使用GPIO配 ...
- 零基础学kubernetes(k8s)必看教程,带你10分钟快速实战入门k8s
一.前言 作为一个工作十余年,拥有比较丰富的计算机网络运维.主机运维.云计算平台运维.自动化运维开发经验的老鸟,我来说说我当初刚接触Kubernetes时的一些感受以及学习技巧. 刚开始学习k8s时, ...
- pandas打印某一列_零基础学Python--不得不说的Pandas小技巧
在前面的文章里,我介绍了如何使用Pandas去读写一个CSV文件,其实Pandas的功能还不仅仅限于此,它还可以读写Excel.Hdf.html.Json等多种文件格式.除此以外,Pandas还拥有众 ...
- 零基础学java培训怎么选择学校
java技术在互联网行业的快速发展,引起了很多人的关注,大家都想通过学习java技术来加入到这个行业,那么零基础学java培训怎么选择学校呢?如今市面上的java培训机构这么多,下面小编就来为大家详细 ...
- 零基础学怎么学Java_零基础学java难么?怎么自学?
在计算机发展迅速的今天,越来越多的人去学习编程,其中Java就是大家热衷的语言之一.这时候就有人问,零基础学java难么?下面小编将回答这一问题并给出学习路线. 小编想说,这个实际上要看个人能力以及前 ...
- 【零基础学Java】—对象的向上和向下转型(二十七)
[零基础学Java]-对象的向上转型(二十七) 对象的向上转型,其实就是多态的写法 格式:父类名称 对象名=new 子类名称(): 含义:右侧创建一个子类对象,把它当做父类来看待使用 注意事项:向上转 ...
最新文章
- 拒绝躺平,Redis选择实现了自己的VM
- java数据通道抽象为流_【java】IO流
- golang中的strings.SplitAfterN
- while循环里面scanf_5.1 for循环
- .NET自定义获得JSON的方法(System.Runtime.Serialization.Json)
- Partition学习笔记
- 【CodeForces 577C】Vasya and Petya’s Game
- python做股票分析_利用Python进行股票投资组合分析(调试)
- Gartner最新报告:阿里云计算、存储、网络、安全均获得最高分
- java类修饰词和内部类详解
- expect免互交 常用编辑文本
- mysql8 启动报错:Error while setting value ‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DI
- java 设置纸张大小设置_java page如何设置纸张
- 白领失眠危害大 如何拯救上班族?
- 乐筑携手大通,共筑全球绳网产业互联网领导者平台
- 【元宵快乐】猜灯谜吃元宵 元气满满闹元宵~(附猜灯谜小游戏)
- OpenCV—python OCR文本检测
- java就业前景,成都java培训,传智播客java培训
- cc2530裸机编程系列笔记1--定时器Timer1模模式的程序设计
- STM32_温湿度传感器