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

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个回答

所属标签

相似分享

官网相关资源

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