目录

前言

RTC框图

STM32实时时钟电路

功能需要

STM32CubeMx配置RTC

配置RCC

配置RTC

配置时间,闹钟,唤醒

开启中断

设置中断优先级

功能代码实现

STM32Cude生成RTC初始化

自定义触发闹钟次数变量

重写周期唤醒回调函数

重写闹钟中断函数


前言

在做51单片机项目时,如果需要年月日时分秒的时间记录,会在51单片机上面外挂一个DS1302的时钟芯片,再加上时间芯片的外围电路。但在STM32F407中,不再需要这么干了,因为在STM32的内部就已经集成了年月日时分秒的时钟电路--也就是实时时钟(RTC)

RTC框图

下图是RTC的框图,箭头部分是实时时钟基本部分,包括时钟源,预分频,影子寄存器,引脚复用输出。此外还有两个闹钟,周期唤醒,入侵检测以及时间戳。

STM32实时时钟电路

在开发板上有低速外部时钟源-32.768Khz。

功能需要

1)配置当前时间

时间可以采取24小时格式,也可以采用12小时格式,默认采用24小时格式。配置时间时,还会设置日期格式,是采用BCD或者二进制。建议采用二进制即可,可以直接填入时间数值。

2)配置闹钟(每隔10s,触发一次闹钟中断)

3)设置周期唤醒(唤醒时间1s)并且可以输出低电平。

STM32CubeMx配置RTC

配置RCC

由于RTC使用到外部时钟源,因此需要在时钟配置使用低速外部时钟源。

配置RTC

配置时间,闹钟,唤醒

配置时间24小时格式,二进制格式(22年5月2日,12时19分50秒);设置闹钟(由于每10s,闹钟触发一次中断,因此屏蔽掉时分,不屏蔽秒);设置周期时钟,周期为1Hz,不需要计数,也就是1s触发一次;如果计数值为1,则为2s触发一次中断。

开启中断

设置中断优先级

功能代码实现

STM32Cude生成RTC初始化

void MX_RTC_Init(void)
{/* USER CODE BEGIN RTC_Init 0 *//* USER CODE END RTC_Init 0 */RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef sDate = {0};RTC_AlarmTypeDef sAlarm = {0};/* USER CODE BEGIN RTC_Init 1 *//* USER CODE END RTC_Init 1 *//** Initialize RTC Only*/hrtc.Instance = RTC;hrtc.Init.HourFormat = RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv = 127;hrtc.Init.SynchPrediv = 255;hrtc.Init.OutPut = RTC_OUTPUT_WAKEUP;hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}/* USER CODE BEGIN Check_RTC_BKUP *//* USER CODE END Check_RTC_BKUP *//** Initialize RTC and set the Time and Date*/sTime.Hours = 12;sTime.Minutes = 19;sTime.Seconds = 50;sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sTime.StoreOperation = RTC_STOREOPERATION_RESET;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}sDate.WeekDay = RTC_WEEKDAY_MONDAY;sDate.Month = RTC_MONTH_MAY;sDate.Date = 2;sDate.Year = 22;if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}/** Enable the Alarm A*/sAlarm.AlarmTime.Hours = 0;sAlarm.AlarmTime.Minutes = 0;sAlarm.AlarmTime.Seconds = 10;sAlarm.AlarmTime.SubSeconds = 0;sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS|RTC_ALARMMASK_MINUTES;sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;sAlarm.AlarmDateWeekDay = 1;sAlarm.Alarm = RTC_ALARM_A;if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK){Error_Handler();}/** Enable the WakeUp*/if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK){Error_Handler();}/* USER CODE BEGIN RTC_Init 2 *//* USER CODE END RTC_Init 2 */}

自定义触发闹钟次数变量

重写周期唤醒回调函数

        注:

        1)一定要要先读Time然后再度Date,否者会出错;

        2)即使不需要Date数据,也要读Date否则也会出错。 

void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{RTC_TimeTypeDef sTime ={0};RTC_DateTypeDef sDate={0};char str[40] ={0};//1)一定要要先读Time然后再度Date,否者会出做;即使不需要Date数据,也要度Date否则也会出错if((HAL_RTC_GetTime(hrtc,&sTime,RTC_FORMAT_BIN)!=HAL_OK)|| (HAL_RTC_GetDate(hrtc,&sDate,RTC_FORMAT_BIN)!=HAL_OK)){return;}sprintf(str,"RTC Time = %4d年%2d月%2d日 \r\n",2000+sDate.Year,sDate.Month,sDate.Date);HAL_UART_Transmit(&huart1,(const uint8_t *)str,strlen(str),100);sprintf(str,"RTC Time = %2d时%2d分%2d秒 \r\n",sTime.Hours,sTime.Minutes,sTime.Seconds);HAL_UART_Transmit(&huart1,(const uint8_t *)str,strlen(str),100);}

重写闹钟中断函数

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{char str[40] ={0};sprintf(str,"闹钟触发次数: %d \r\n",++alarmTrigger);HAL_UART_Transmit(&huart1,(const uint8_t *)str,strlen((const char *)str),100);}

STM32基础10--实时时钟(RTC)相关推荐

  1. 【STM32学习】实时时钟 —— RTC

    [STM32学习]实时时钟 -- RTC 零.参考 一.工作原理 1.RTC介绍 2.工作过程 二.相关寄存器 三.代码说明 1.rtc初始化 2.关于中断 3.中断配置代码(仅供参考) 3.1 秒中 ...

  2. stm32之实时时钟RTC(掉电计时保持、秒中断、闹钟中断、溢出中断)

    前言:stm32系列产品普遍都有实时时钟RTC模块,它提供一个掉电保持计时功能,掉电后由后备供电区域供电.除了提供时间和日期之外,还可以设置闹钟提醒,且可以在待机模式下设置闹钟唤醒系统.在一些小容量. ...

  3. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...

  4. 关于STM32驱动DS1302实时时钟的一点思考

    关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...

  5. 【嵌入式】MSP430系统实时时钟RTC学习日志(完善中)

    目录 MSP430系统实时时钟RTC [时钟初始化]系统时钟初始化需要注意的问题 MSP430F149时钟源选择(部分转) MSP430 系统时钟 ACLK.MCLK.SMCLK [MSP430时钟] ...

  6. linux设备树例程,iTOP-iMX6-设备树内核-实时时钟RTC以及Linux-c测试例程

    当 Linux 开发者谈论一个实时时钟,他们通常指的是某种能记录墙上时间,并且有备用电 池,以至于在系统关机的时候仍然可以工作的器件. Linux 有两个系列广泛兼容的用户空间 RTC 设备节点: • ...

  7. ESP32设备驱动-DS3231实时时钟(RTC)驱动

    DS3231实时时钟(RTC)驱动 1.DS3231介绍 DS3231 是一款低成本.极其精确的 I2C 实时时钟 (RTC),具有集成的温度补偿晶体振荡器 (TCXO) 和晶体. 该设备包含电池输入 ...

  8. ESP8266-Arduino编程实例-PCF8563实时时钟(RTC)驱动

    PCF8563实时时钟(RTC)驱动 1.PCF8563介绍 PCF8563 是针对低功耗优化的 CMOS 实时时钟 (RTC) 和日历. 还提供了可编程时钟输出.中断输出和低电压检测器. 所有地址和 ...

  9. imx6 linux 时钟,迅为-iMX6开发板-驱动-实时时钟RTC以及Linux-c测试例程

    当Linux开发者谈论一个实时时钟,他们通常指的是某种能记录墙上时间,并且有备用电 池,以至于在系统关机的时候仍然可以工作的器件. Linux 有两个系列广泛兼容的用户空间 RTC 设备节点: /de ...

最新文章

  1. redis是什么_什么是Redis?为什么我们要用Redis?
  2. python统计字符在文件中出现的次数_一文搞定统计字符串中某字符出现的频次
  3. C#:DataTable判断是否存在某列
  4. Atitit 常见面试问题回答法 原则与细则 目录 1.1. 1、工作多久了?为什么离职? 1 1.2. 、自我评价 1 1.3. 问你有什么缺点 2 1.4. 4、理想薪资 2 1.5. 职业规
  5. python爬取人口数据_爬取人口数据
  6. 【读书笔记】商业自传-PayPal程序员-硅谷钢铁侠-埃隆·马斯克,SpaceX CEO、特斯拉公司CEO、太阳城公司董事会主席。
  7. cad lisp 背景遮罩_AutoCAD心得体会
  8. PyAudio库简介
  9. python isupper_Python isupper()函数判断字符串字符是否都为大写形式
  10. GitHub代码上传失败的解决方法
  11. 基于Cocos2d-x游戏引擎实战开发炸弹超人
  12. Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册
  13. 简历中的工作经历怎么写?
  14. 为什么不吃米和面之后,体重掉得比较快?答案或许不是你想的那样
  15. WIN10下TensorFlow GPU版安装顺序
  16. QCC3040/QCC3046 ANC(主动降噪)调测
  17. 我们是“前端offer收割机”
  18. 【转】超星转PDF最佳方法(对打印机重新审视)
  19. 《Spring实战》读书笔记-第3章 高级装配,最新Java大厂高频面试题
  20. April.12.2022——折纸问题(微软面试题)

热门文章

  1. 你不可不知的Java引用类型之——SoftReference源码详解
  2. 双击.bat文件闪退
  3. circular 字体_Circular Regular
  4. python第三章_Python学习(第三章)
  5. 干货满满【JVM监控及诊断工具-GUI篇】
  6. 2017cad光标大小怎么调_AutoCAD 2010如何调整光标的大小?调整光标大小的方法
  7. 一年级古诗风语文知识心田花开汇总
  8. 饮料如何畅销市场?看农夫山泉如何玩转营销
  9. 10.业余无线电术语
  10. 《给青年的十二封信》1-谈读书—朱光潜