STM32外设:专用定时器 IWDG、WWDG、RTC
主要外设:
- IWDG:Independent Watch DoG 独立看门狗
- WWDG:Window Watch DoG 窗口看门狗
- RTC: Real-Time Clock 实时时钟
IWDG
主要功能:监控MCU的程序,当程序发生故障或超时,使MCU自动重启
LSI(内部RC振荡器~40KHz)→8位预分频系数PR→装值RLR、12位递减计数器→IWDG复位
- 递减计数器:计数值从RLR减到0,IWDG会产生一个复位信号,系统复位重新启动
- 避免产生看门狗复位,则需在计数值减到0之前将重装值写入到计数器即“喂狗”
- 当程序出错时没有刷新计数器,计数器递减到0,系统复位重新启动
- 使用"独立"的内部RC振荡器作为时钟源,CM内核使用主时钟,在停机和待机模式可工作
- 最多PR/40KHZ*RLR时间不刷新IWDG则系统复位
硬件设计
32分频/40kHz*1000=800ms 不刷新IWDG则系统复位
CubeMX的配置
引脚分配:无
外设配置:
- System Core-IWDG →模式→ 勾选Actived
- System Core-IWDG →参数设置(时钟)→IWDG计数器时钟预分频系数=32、IWDG递减计数器重载值1000
用户代码
//USBR CODE3:后台程序(无限循环)
HAL_IWDG_Refresh(&hiwdg);//喂狗
WWDG
主要功能:保证MCU运行时间是否精准
PCLK1→4096分频→分频器系数CFR→重载值CR (TR)、窗口值CFR(WR)、7位递减计数器

- 递减计数器:从TR→WR→0x40:在IWDG的基础上画了一道线WR
- 只能在WR→0x40窗口上限和窗口下限之间可以"喂狗"(从而保证在一定时间内执行)
- TR→WR之间"喂狗"会产生复位
- 最小超时时间为WR→0x40:4096预分频值(TR-WR)/APB1时钟
- 最大超时时间为TR→0x40:4096预分频值(TR-0x39)/APB1时钟
- 早期预警中断Early wakeup interrupt:WWDG复位并不代表程序出错或死机,在MCU复位前,进行收尾工作(eg.保存数据)、
- 与CM内核共用主时钟
硬件设计
TR=127、WR=84、APB1=50MHz
(4096 * 8)(127-63)/ 50MHz =41.94ms
(4096 * 8)(127-84)/ 50MHz =28.18ms
CubeMX的配置
引脚分配:无
外设配置:
- System Core-WWDG →模式→ 勾选Actived
- System Core-WWDG →参数设置(看门狗时钟)→WWDG计数器时钟预分频系数=8、WWDG窗口值84、WWDG自运行递减计数器值127
- System Core-WWDG →参数设置(看门狗中断)→Early wakeup interrupt使能
- System Core-NVIC-NVIC中断表 → Window watchdog Interrupt → 勾选使能、并设置抢占优先级和子优先级
用户代码
//USBR CODE3:后台程序(无限循环)
HAL_Delay(35);//等待29ms~40ms喂狗的窗口时间
HAL_WWDG_Refresh(&hwwdg);//喂狗
//USER CODE4:定义中断回调函数
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg){
//在MCU复位前,进行收尾工作(eg.保存数据),不在此处喂狗
}
RTC
主要功能:系统实时时间(日历时钟、闹钟中断)、低功耗模式下的唤醒定时器
32.768kHz→20位预分频器→1s的时间基准→32位计数器CNT、闹钟值ALR→闹钟中断
闹钟中断:当CNT = ALR时
DS1302芯片是按年月日时分秒的分组寄存器
RTC使用32位计数器每1s计数器+1(最多可计时136年)、以1970-01-01 00:00:00为起点的时间戳
在系统复位或从待机模式唤醒后RTC的设置和事件维持不变
后备寄存器:10个16bit的SRAM类型的寄存器(包括RTC的时间、用户数据等)、断电后丢失、需要备用电池供电
时钟源
- 内部RC振荡40KHz→LSI:可能发生温漂、精确度低
- 外接32.768KHz石英晶体晶振→GPIO AF→引脚OSC32_IN、OSC32_OUT→LSE:为补偿天然晶体的偏差,512Hz信号进行校准
- HSE→128分频
系统实时时间:
- 备用电池(3V纽扣电池通过VBAT引脚接入MCU):一般情况由VDD给RTC和后备寄存器供电,当断电后由VBAT供电
CubeMX的配置
引脚分配:无
外设配置:
- Timers-RTC →模式→ 勾选Activate Clock source、Active Calendar、选择AlarmA为内部时钟
- Timers-RTC →参数设置(日历时间)→日期格式=二进制数据格式、小时0、分钟0、秒0
- Timers-RTC →参数设置(日历日期)→日期格式=二进制数据格式、星期五、1月、1日 、21年
- Timers-RTC →参数设置(AlarmA)→小时0、分钟0、秒30
用户代码
//USER CODE PV:变量定义variables
RTC_DateTypeDef GetDate;
RTC_TimeTypeDef GetTime;
//USER CODE2:外设启动
//手动设置时间、日期、闹钟
RTC_TimeTypeDef sTime = {0};
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK){
Error_Handler();
}
RTC_DateTypeDef sDate = {0};
sDate.WeekDay = RTC_WEEKDAY_SATURDAY;
sDate.Month = RTC_MONTH_MAY;
sDate.Date = 1;
sDate.Year = 21;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK){
Error_Handler();
}
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = 17;
sAlarm.AlarmTime.Minutes = 19;
sAlarm.AlarmTime.Seconds = 30;
sAlarm.AlarmTime.SubSeconds = 0;
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
sAlarm.AlarmDateWeekDay = 29;
sAlarm.Alarm = RTC_ALARM_A;
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK){
Error_Handler();
}
//USBR CODE3:后台程序(无限循环)
//打印当前时间
HAL_RTC_GetTime(&hrtc,&GetTime,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&GetDate,RTC_FORMAT_BIN);
printf("DateTime:%02d-%02d-%02d %02d:%02d:%02d\r\n",2000+GetDate.Year,GetDate.Month,GetDate.Date,GetTime.Hours,GetTime.Minutes,GetTime.Seconds);
//USER CODE4:定义中断回调函数
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
//闹钟触发
}
STM32外设:专用定时器 IWDG、WWDG、RTC的更多相关文章
- STM32学习笔记——定时器中断(向原子哥学习)
定时器中断 STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器.在本章中,我们将利 ...
- STM32之旅5——IWDG
STM32之旅5--IWDG stm32有两个看门狗,一个独立看门狗(IWDG).一个窗口看门狗(WWDG):独立看门狗是时钟源是内部的40kHz的低速时钟,即使主频出问题了,独立看门狗也不会受到影响 ...
- STM8S awu及看门狗IWDG WWDG应用(转)
源:STM8S awu及看门狗IWDG WWDG应用 AWU的应用(用库函数完成的) //切记要开启中断 且在中断函数中 AWU_GetFlagStatus(); 来清除中断 void AWU_SET ...
- STM32 TIM高级定时器死区时间的计算
STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...
- STM32 TIM1高级定时器RCR重复计数器的理解
STM32 TIM1高级定时器RCR重复计数器的理解 TIMx_RCR重复计数器寄存器,重复计数器只支持高级定时器TIM1和TIM8,下面看标准外设库的TIM结构体的封装: typedef struc ...
- STM32入门系列-STM32外设地址映射
片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设.相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外 ...
- STM32时钟和定时器
时钟源 STM32包含了5个时钟源,分别为HSI.HSE.LSI.LSE.PLL. HSI是高速内部时钟.RC振荡器,频率为8MHz: HSE是高速外部时钟,即晶振,可接石英/陶瓷谐振器或接外部时钟源 ...
- 一文打尽PWM协议、PPM协议、PCM协议、SBUS协议、XBUS协议、DSM协议 | STM32的通用定时器TIM3实现PPM信号输出
PWM.PPM.PCM.SBUS.XBUS.DSM都是接收机与其他设备通信的协议. 请注意这里不要将遥控器和接收机之间的协议混淆.遥控器和接收机之间会采用某种协议来互相沟通,这些协议往往各个厂牌各自有 ...
- [stm32] STM32的通用定时器TIMx系统了解
通用定时器(TIMx) 一.TIMx简介 二.TIMx主要功能 三.TIMx功能描述 3.1 时基单元 3.2 计数器模式 3.3 时钟选择 3.4 捕获/比较通道 3.5 输入捕获模式 3.6 PW ...
- Stm32之通用定时器复习
因为毕业设计要用到PWM调光很久都没用到Stm32的定时器,有些内容已经遗忘,为了回顾复习相关内容今天开下通用定时器这一章节的数据手册. 1.时钟 通用定时器一般是TIM2~TIM5,TIM1.TIM ...
随机推荐
- SpringBoot3集成Kafka
目录 一.简介 二.环境搭建 1.Kafka部署 2.Kafka测试 3.可视化工具 三.工程搭建 1.工程结构 2.依赖管理 3.配置文件 四.基础用法 1.消息生产 2.消息消费 五.参考源码 标 ...
- 正则表达式快速入门一:正则表达式(regex)基本语法及概念
Regex quickstart :正则表达式快速入门 author: wclsn reference quick start 如果想要了解正则表达式的基本概念且英文ok的话,完全可以从我上面所附网站 ...
- Gitbook Android App
最有用Ionic 2 做了一个Gitbook 混合app, 上线google play的时候提醒我触犯了假冒行为,可能是logo和名字问题吧,放弃: 上线腾讯被认为是h5 app,不是native a ...
- 织梦DEDEBIZ调用全站文章数量
织梦DEDEBIZ如何调用全站文章数量{dede:sql sql="select count(*) as c from biz_archives} 共有文章:[field:c/] 篇 {/d ...
- Note -「Maths」Euler 筛筛积性函数
Part. 1 Preface 这个东西是我在做 JZPTAB 的时候 LYC 给我讲的. 然后发现这是个通法,就写一写. 本文除了例题所有代码均未经过编译,仅作为参考. Part. 2 Untitl ...
- ingress获取客户端真实IP
环境: k8s1.25.2.helm部署的ingress 1.进入ingress helm目录,修改values.yaml文件 2.卸载重装 helm uninstall ingress-test - ...
- RabbitMQ保姆级教程最佳实践
一.消息队列介绍 1.消息队列概念 1.MQ全称为Message Queue,消息队列(MQ)是⼀种应⽤程序对应⽤程序的通信⽅法. 应⽤程序通过读写出⼊队列的消息(针对应⽤程序的数据)来通信,⽽⽆需专 ...
- Python 列表操作指南3
示例,将新列表中的所有值设置为 'hello': newlist = ['hello' for x in fruits] 表达式还可以包含条件,不像筛选器那样,而是作为操纵结果的一种方式: 示例,返回 ...
- CF1746F Kazaee
prologue 数组范围一定要看好了开,不然容易我一样,调试调了一页多. 还有就是不要傻乎乎地只跑一次和哈希,因为和哈希(从下面地佬的题解中才知道)它其实算作是一种 trick(类比SA(Stimu ...
- 【Unity3D】动态路径特效
1 前言 本文通过导航系统(NavMeshAgent)和线段渲染器(LineRenderer)实现了角色走迷宫和绘制路径功能,同时实现动态路径特效. 导航系统的介绍详见博客:导航系统.分离路面 ...