STM32CubeMX学习笔记11 ---RTC实时时钟

1、RTC实时时钟简介

STM32的实时时钟RTC是一个独立的定时器,RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能,修改计数器的值可以重新设置系统当前的时间和日期 RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后背区域,即在系统复位或从待机模式唤醒后RTC的设置和事件维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外操作。所以在要设置时间之前,要先取消备份区域写保护。RTC的简化框图如下所示:

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、 STM32CubeMX设置

  • PE5设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
  • RCC设置中开启外部高速晶振(HSE)以及外部低速晶振(LSE),时钟树中将RTC的频率设置为32.768KHz

  • 激活时钟源,激活日历,RTC Out选择Disable开启闹钟中断,设置初始日期和时间,数据格式选择BCD。(BCD码即每4位二进制转十进制,如BCD码“0x13”,转十进制为“13” )

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

  • 时钟树种将RTC的时钟源选择外部低速晶振,如果没有外部晶振,2这里选择内部时钟源。

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

4、程序编程

  • 在main.c文件中编写秒中断处理回调函数和闹钟中断处理函数,并在main函数中启动中断。
/* USER CODE BEGIN 0 */

 RTC_DateTypeDef GetDate;
 RTC_TimeTypeDef GetTime;
 RTC_AlarmTypeDef sAlarm;


//RTC 秒中断回调函数
void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc){
    HAL_RTC_GetTime(hrtc,&GetTime,RTC_FORMAT_BIN);
    HAL_RTC_GetDate(hrtc,&GetDate,RTC_FORMAT_BIN);
    printf1("Date:%02d-%02d-%02d\r\n",2000+GetDate.Year,GetDate.Month,GetDate.Date);
    printf1("Time:%02d:%02d:%02d\r\n",GetTime.Hours,GetTime.Minutes,GetTime.Seconds);
    printf1("\r\n"); 
}

//RTC闹钟中断回调函数
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
    printf1("Alarm Active...!!!\n");
	RTC_TimeTypeDef settime;
	settime.Hours=0x23;
	settime.Minutes=0x59;
	settime.Seconds=0x55;
	HAL_RTC_SetTime(hrtc,&settime,RTC_FORMAT_BCD);//重新设置时间为23:59:55,数据类型为BCD码
	
	RTC_DateTypeDef setday;
	setday.Year=25;
	setday.Month=9;
	setday.Date=30;
	
	HAL_RTC_SetDate(hrtc,&setday,RTC_FORMAT_BIN);//设置年月日为:25年9月30日,数据类型为二进制
}




/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
///*****省略*****///
  /* USER CODE BEGIN 2 */
	
  printf1("RTC时钟测试\r\n");
  __HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启秒中断

//设置闹钟为AM 9:30:20
  sAlarm.Alarm = RTC_ALARM_A;
  sAlarm.AlarmTime.Hours = 9;
  sAlarm.AlarmTime.Minutes = 30;
  sAlarm.AlarmTime.Seconds = 10;
  HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BIN);  //设置闹钟并使能闹钟中断

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */*/
  while (1)
  {
    HAL_Delay(500);
    HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

5、下载验证

可以看到每秒输出时间信息,当达到9:30:10时触发闹钟中断,输出闹钟信息,并将时间设置为25年9月30日24:59:55秒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值