目录

  • 一、RTC时钟原理
  • 二、新建工程
  • 三、修改代码
  • 四、烧录运行
  • 参考文献

了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求:
1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒;
2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次;
3)如果输出内容中需加入“星期x”,请修改代码。

一、RTC时钟原理

1.简介
RTC (Real Time Clock):实时时钟
RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。

在断电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。

RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。

两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。

上电复位后,所有RTC寄存器都会受到保护,以防止可能的非正常写访问。

无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC使不会停止工作。
2.特征
①可编程的预分频系数:分频系数高为220。
②32位的可编程计数器,可用于较长时间段的测量。
③2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟 频率的四分之一以上)。

  • 三种RTC的时钟源:
    ①HSE时钟除以128;
    ②LSE振荡器时钟;
    ③LSI振荡器时钟

  • 2个独立的复位类型:
    ①APB1接口由系统复位;
    ②RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位

  • 3个专门的可屏蔽中断:
    ①闹钟中断,用来产生一个软件可编程的闹钟中断。
    ②秒中断,用来产生一个可编程的周期性中断信号(长可达1秒)。
    ③溢出中断,指示内部可编程计数器溢出并回转为0的状态。

3.框图

RTC时钟的框图还是比较简单的,这里我们把他分成两个部分:

  • APB1 接口:用来和 APB1 总线相连。 此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总 线时钟驱动,用来与 APB1 总线连接。通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。
  • RTC 核心接口:由一组可编程计数器组成,分成两个主要模块。第一个模块是 RTC 的 预分频模块,它可编程产生 1 秒的 RTC 时间基准TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。第二个模块是一个 32 位的可编程计数器 (RTC_CNT),可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记 录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。

二、新建工程

选择芯片

RCC

RTC


串口

时钟树

项目文件

点击GENERATE CODE创建工程

三、修改代码

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "rtc.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
int fputc(int ch,FILE *f){uint8_t temp[1]={ch};HAL_UART_Transmit(&huart1,temp,1,2);return ch;}
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */
RTC_DateTypeDef GetData;//获取日期结构体RTC_TimeTypeDef GetTime;//获取时间结构体/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_RTC_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */
HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//获取时间/* Get the RTC current Date */HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);//获取日期/* Display date Format : yy/mm/dd */printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);if(GetData.WeekDay==01){printf("星期一\r\n");}else if(GetData.WeekDay==02){printf("星期二\r\n");}else if(GetData.WeekDay==03){printf("星期三\r\n");}else if(GetData.WeekDay==04){printf("星期四\r\n");}else if(GetData.WeekDay==05){printf("星期五\r\n");}else if(GetData.WeekDay==06){printf("星期六\r\n");}else if(GetData.WeekDay==07){printf("星期日\r\n");}/* Display time Format : hh:mm:ss */printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);printf("\r\n");HAL_Delay(1000);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.LSIState = RCC_LSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

四、烧录运行

参考文献

【STM32】HAL库 STM32CubeMX教程十三—RTC时钟
实现STM32的日历读取、设置和输出
基于STM32CubeMX(HAL库)制作RTC时钟

STM32F103C8T6基于HAL库制作RTC时钟相关推荐

  1. 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

    系列文章目录 一.基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 二.基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发 三.实战 ...

  2. 基于stm32cubeMX的stm32f103c8t6的HAL库开发的智能小车------小车接线和材料准备

    我的第一辆智能小车 提示:小编也是初学者,本文适用于想完成一个基础智能四轮车的初学者,大佬还请勿喷,欢迎各位指出错误的地方 暑假在家无聊,刚好也在学习STM32的HAL库,就想着做个小车巩固自己学到的 ...

  3. 单片机 STM32F103C8T6 cubeMX HAL库 从环境到开发 正点原子工程移植 freeRTOS

    文章目录 0 准备材料 1 闪烁PC13的小灯 2 正点原子工程移植 注意点以及细节 3 freeRTOS 3.1 LED KEY 串口1 的一个实验 0 准备材料 1.需要正点原子的HAL介绍书籍可 ...

  4. 正点原子STM32(基于HAL库)3

    目录 高级定时器实验 高级定时器简介 高级定时器输出指定个数PWM 实验 高级定时器输出指定个数PWM原理 TIM1/TIM8 寄存器 硬件设计 课堂源码(输出指定个数PWM灯就闪几次) 程序设计 下 ...

  5. STM32外挂FLASH模拟U盘(基于HAL库)

    STM32外挂FLASH模拟U盘(基于HAL库) 1.背景 1.1这篇文章能给你带来什么 1.2根据你要解决的问题,精确快速跳转到相应位置 1.3我在做完这个后还有不明白的地方,希望能有大触解答困惑 ...

  6. stm32+HAL库制作转速仪

    stm32+HAL库制作转速仪 前言 电机在运行过程中,需要实时检测其转速的稳定性,有效反映电机的运行情况. 本文介绍了基于stm32的转速仪的设计,可以用光电门传感器和红外对管传感器测量,可以设置选 ...

  7. STM32F4 HAL库开发 -- RTC

    一.STM32F407 RTC时钟简介 STM32F407的RTC,是一个独立的BCD定时器/计数器.RTC提供了一个日历时钟(包含年月日时分秒信息).两个可编程闹钟(ALARM A和ALARM B) ...

  8. STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)

    目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...

  9. STM32F1系列HAL库配置系统时钟

    STM32F1系列HAL库配置系统时钟 其实一开始对于时钟我也是知之甚少,在MSP432中我就一直忽视时钟配置,其实也是在STM32学习时落下的病根,现在趁有空补一下. 时钟简单讲解 对于时钟系统,在 ...

最新文章

  1. matlab 信号的原子产生,MATLAB随机产生原子结构代码
  2. 【黑客免杀攻防】读书笔记4 - 壳在免杀中的应用
  3. Firefox3.0火速前进 比2.0版快2到3倍
  4. rtmp推流直播流程
  5. fiddler手机端抓包配置
  6. Win11系统自动暂停更新后想继续怎么办 Win11系统重新启动更新教程
  7. 怎么调节手机的刷新率_价格均在2000元内,5G网络配高刷新率屏幕手机怎么选
  8. 学一下HDFS,很不错(大数据技术原理及应用)
  9. 搭建一个简单的SpringBoot项目
  10. MFC程序设计——标尺的例子
  11. 2021年11款最佳的开源 Kubernetes 工具
  12. w7计算机应用放大按键,Win7窗口最大化和最小化快捷键是什么
  13. 【K8S系列】快速初始化⼀个最⼩集群
  14. PS 2019 Mac版 自学入门系列(十二)—— 应用滤镜
  15. 003 大数据4V特征
  16. 苹果Mac合上屏幕怎样才能不休眠?
  17. 算法笔记(599. 两个列表的最小索引总和)
  18. pythonreader下载_使用Python的pandas-datareader包下载雅虎财经股价数据
  19. 2.1 深度学习常用软件包和环境配置
  20. 每日一笑20200529

热门文章

  1. 线性空间2--子空间
  2. 客户管理是企业利润的根本,企业如何进行客户管理呢?
  3. 欢乐的票圈重构——九宫格控件(上)
  4. 什么拦截软件都挡不住?教你如何杜绝流氓软件弹窗!
  5. VCP回声调试参数说明
  6. 嵌入式和Linux知识总结
  7. 碳纤维复合材料加固钢筋混凝土的极化作用
  8. MQTT之十一 阿里云物联网平台网址
  9. 随着裁员浪潮滚滚而来,科技工作者的泡沫是否即将破灭?
  10. 神经风格转移:Anaconda快速搭建DL框架学梵高(Van Gogh)绘画Ubuntu16.04 CPUGPU版