RTC时钟
- RTC
- 什么是RTC?
- RTC结构框图
- CubeMX配置
- RTC代码配置
- 实战——简易时钟
- 任务要求
- 代码实现
- 实验结果
- 补充
- 唤醒功能配置
- 代码如下:
RTC
什么是RTC?
RTC(Real Time Clock):实时时钟
RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。
简单来说,RTC是一个特殊的定时器,通常作为闹钟、日历、以及定时自动唤醒功能。这一期我们来讲以下RTC的闹钟功能
RTC结构框图
以上是RTC使用时钟功能的部分结构框图,具体流程如下:
- 选择时钟源,我们通常使用LSE(32.768KHz)
- 对时钟源进行分频得到1Hz的频率,通常设置异步分频器为128分频,同步分频器为256分频。
- 每来一个时钟信号,时间加增加,当时间寄存器的值与闹钟寄存器的值相同时,产生中断。
注意:这里我们不需要对时间的进位进行计算,只需要控制计数器的时钟信号为1Hz即可保证RTC准确走时。
关于RTC的基本知识,我们这里不做介绍,大家可以自行学习
下面我们来讲讲CubeMX的配置
CubeMX配置
-
首先我们要在RCC选项开启LSE(外部低速晶振)
-
开启RTC
-
配置 RTC
-
时钟配置
以上就是RTC的配置过程,接下来是代码的配置过程:
RTC代码配置
- RTC基本驱动步骤
- RTC闹钟配置
实战——简易时钟
任务要求
- 通过实现NANO板上的RTC功能,设计一个简易时钟,
- 闹钟要求具有闹钟功能,当到达闹钟设置时间是,执行相应动作
- 通过串口打印相印信息,1s打印一次
代码实现
1. main函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* 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)
{
HAL_RTC_GetDate(&hrtc,&GET_Date,RTC_FORMAT_BIN); //获取日期
printf("%02d/%02d/%02d\r\n",2000 + GET_Date.Year,GET_Date.Month,GET_Date.Date); //打印日期
HAL_RTC_GetTime(&hrtc,&GET_Time,RTC_FORMAT_BIN); //获取时间
printf("%02d:%02d:%02d\r\n",GET_Time.Hours,GET_Time.Minutes,GET_Time.Seconds); //打印时间
printf("\r\n"); //换行
HAL_Delay(1000); //1s执行一次以上内容
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
2 . 闹钟事件中断服务函数
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
if(hrtc->Instance == RTC)
{
printf("CLOCK_EVENT");
}
}
实验结果
以上就是RTC闹钟的全部内容…………
补充
唤醒功能配置
这里是设置每10s触发一次唤醒中断。
代码如下:
编写如下中断服务函数,即可在唤醒中断执行相应动作。
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
printf("WKUP_EVENT");
}