你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX系列|RTC实时时钟

[复制链接]
STMCU 发布时间:2020-9-24 10:45
RTC实时时钟
1. RTC实时时钟简介

STM32的实时时钟RTC是一个独立的定时器,RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能,修改计数器的值可以重新设置系统当前的时间和日期


RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后背区域,即在系统复位或从待机模式唤醒后RTC的设置和事件维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外操作。所以在要设置时间之前,要先取消备份区域写保护。RTC的简化框图如下所示:



1_meitu_1.jpg


RTC由两个主要部分组成:第一部分(APB1接口)用来和APB1总线相连,此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作;另一部分(RTC核心)由一组可编程计数器组成,分为两个主要模块,第一个模块是RTC的预分频模块,可编程产生1秒的RTC时间基准TR_CLK。第二个模块是一个32位的可编程计数器(RTC_CNT),可被初始化为当前的系统时间,一个32位的时钟计数器按秒钟计算可以记录4294967296秒,约136年左右,一般应用已经足够


RTC还有一个闹钟寄存器RTC_ALR,用于产生闹钟。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CNT = RTC_ALR将产出一个闹钟中断,从而实现闹钟功能


2. 硬件设计

本实验通过RTC的秒中断来持续输出时间通过串口1打印出来,并通过设置闹钟中断实现一个闹钟提醒,D1指示灯提示系统正常运行

  • D1指示灯
  • USART1串口
  • RTC



3. 软件设计3.1 STM32CubeMX设置
  • RCC设置中开启外部高速晶振(HSE)以及外部低速晶振(LSE),时钟树中将RTC的频率设置为32.768KHz




2_meitu_2.jpg


3_meitu_3.jpg



  • PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
  • 激活时钟源,激活日历,选择No RTC Output,设置初始日期和时间



4_meitu_4.jpg


  • 使能RTC全局中断和闹钟中断



5_meitu_5.jpg


  • 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码



3.2 MDK-ARM编程

  • 在rtc.c文件中编写秒中断处理回调函数和闹钟中断处理函数


  1. extern RTC_DateTypeDef GetDate;
  2. extern RTC_TimeTypeDef GetTime;

  3. void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc){
  4.         HAL_RTC_GetTime(hrtc,&GetTime,RTC_FORMAT_BIN);
  5.         HAL_RTC_GetDate(hrtc,&GetDate,RTC_FORMAT_BIN);
  6.         printf("Date:%02d-%02d-%02d\r\n",2000+GetDate.Year,GetDate.Month,GetDate.Date);
  7.         printf("Time:%02d:%02d:%02d\r\n",GetTime.Hours,GetTime.Minutes,GetTime.Seconds);
  8.         printf("\r\n");        
  9. }

  10. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
  11.         printf("Alarm Active...!!!\n");
  12. }
复制代码


  • 在main.c文件中编写闹钟设置相关代码并开启相关中断


  1. /* USER CODE BEGIN PV */
  2. RTC_DateTypeDef GetDate;
  3. RTC_TimeTypeDef GetTime;
  4. RTC_AlarmTypeDef sAlarm;
  5. /* USER CODE END PV */
  6. /* Private function prototypes -----------------------------------------------*/
  7. void SystemClock_Config(void);

  8. int main(void){
  9.   HAL_Init();
  10.   SystemClock_Config();
  11.   /* Initialize all configured peripherals */
  12.   MX_GPIO_Init();
  13.   MX_RTC_Init();
  14.   MX_USART1_UART_Init();
  15.   /* USER CODE BEGIN 2 */
  16.   __HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启秒中断
  17.   sAlarm.Alarm = RTC_ALARM_A;
  18.   sAlarm.AlarmTime.Hours = 16;
  19.   sAlarm.AlarmTime.Minutes = 20;
  20.   sAlarm.AlarmTime.Seconds = 30;
  21.   HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BIN);  //设置闹钟并使能闹钟中断
  22.   /* USER CODE END 2 */
  23.   while (1){
  24.     HAL_Delay(1000);
  25.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
  26.   }
  27. }
复制代码


4. 下载验证

编译无误后下载到开发板,可以看到D1指示灯每1s闪烁一次,串口助手每1s会打印出相应的日期和时间,闹钟设置的时间到后会打印出闹钟中断函数里的相关语句


6_meitu_6.jpg




收藏 评论0 发布时间:2020-9-24 10:45

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版