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 ...
随机推荐
- centos7.X安装nginx – 东凭渭水流
1.安装nginx需要使用root用户 2.配置nginx源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release ...
- Vue【原创】千位符输入框(不仅只是过滤器哦)
最近和一个做金融的朋友讨论到千位符输入的问题,后来一想貌似自己项目中也会经常碰到金额数字这种输入框,要么自己做一个吧. 首先肯定要有一个正则表达式,也就是过滤器的方案里面常用的正则: 1 filter ...
- Linux下MySQL备份指定数据库命令
比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldump 命令格式如下: [root@linuxsir01 root]# mysqldump -u root -p li ...
- Hadoop核心概念
大数据开发总体架构: Hadoop是大数据开发所使用的一个核心框架.使用Hadoop可以方便的管理分布式集群,将海量数据分布式的存储在集群中,并使用分布式并行程序来处理这些数据. Hadoop由许多子 ...
- 最接地气的.NET微服务框架
前言: "人必有所执,方能有所成",从2018年底我就开始规划要写一个.NET微服务框架,5年了,今天终于正式发布了. 正文: Wing 致力于打造一个功能强大.最接地气的.NET ...
- 算法打卡|Day4 链表part02
Day4 链表part02 今日任务 ● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II 目录 Day4 链表part0 ...
- filebeat新filestream类型是否支持tail_files类似功能探究
背景 试水搭建ELK,使用了ELK7.17.13版本,filebeat默认配置的input type已经是filestream而非旧版的log类型,开始了探索之旅. 信任ChatGPT导致的三次失败尝 ...
- ORA-01008:并非所有变量都已绑定-解决办法
近期批量处理数据,后台用JAVA编写,连接Oracle数据库,程序运行报ORA-01008问题.解决这个问题时遇见的坑较多,下面复盘现象.问题提出解决办法,希望能帮到遇见同类问题的你. 调试问题: 后 ...
- ASP.NET 6启动时自动创建MongoDB索引
大家好,我是Edison. 最近,在使用MongoDB时,碰到这样的一个需求:针对某个Collection手动在开发环境创建了索引,但在测试环境和生产环境不想再手动操作了,于是就想着通过代码的方式在A ...
- linux的认知与基本命令
一.linux的了解 1. 什么是Linux? a,Linux是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布.它主要受到Mi ...