【ACM32G103RCT6开发板测评】+ RTC测试
[复制链接]
测试ACM32G103RCT6的RTC时钟,设置和读取日期时间,串口和OLED显示。
一、RTC时钟内部框图
1.1、主要特性
可计算 00~99 年之间的秒、分、时、日、周、月、年
>BCD 时间显示
>自动闰年调整
>数字校准功能:通过调整最小时间单位(最大可调精度 0.95ppm)来进行日历
校准,调校后理论精度+/-0.477ppm
>周期唤醒中断
>闹钟功能
>可从管脚输出 XTLF 时钟信号供用户校准
>RTC 计时器部分不复位
>2 路输入上下沿(侵入)时间戳功能
>16 个 32 位 (共 64 字节) 通用备份寄存器,能够在省电模式下保存数据。当有
外部侵入事件发生时,备份寄存器可复位(可配置)。
1.2、内部框图
二、程序部分
2.1、rtc.c
#include "main.h"
RTC_ConfigTypeDef RTC_Handle;
RTC_TimeTypeDef temp_Time_Set;
RTC_DateTypeDef temp_Date_Set;
RTC_WUTimerTypeDef WuTimer_Handler;
RTC_TimeTypeDef temp_Time_Get;
RTC_TimeTypeDef temp_Time_Get_Again;
RTC_DateTypeDef temp_Date_Get;
void init_rtc(void)
{
RTC_Handle.ClockSource = RTC_CLOCK_XTL;
RTC_Handle.Compensation = COMPENSATION_INCREASE; // 开启时钟误差补偿
RTC_Handle.CompensationValue = 0x05; // 开启时钟误差补偿,该参数只针对ACM32G103 LQFP64 Core板XTL电路
HAL_RTC_Config(&RTC_Handle);
/* Set RTC Time、Date */
temp_Time_Set.Hour = 0x08;
temp_Time_Set.Minute = 0x30;
temp_Time_Set.Second = 0x00;
HAL_RTC_SetTime(&temp_Time_Set);
temp_Date_Set.Year = 0x24; // 2024-01-17
temp_Date_Set.Month = RTC_MONTH_JANUARY;
temp_Date_Set.Date = 0x17;
temp_Date_Set.WeekDay = RTC_WEEKDAY_WEDNESDAY;
HAL_RTC_SetDate(&temp_Date_Set);
NVIC_ClearPendingIRQ(RTC_IRQn);
NVIC_EnableIRQ(RTC_IRQn);
__HAL_RTC_ENABLE_MIN_IT;
}
void rtc_read(void)
{
uint32_t fu32_Seconds;
char date[20];
char time[20];
HAL_RTC_GetTime(&temp_Time_Get);
HAL_RTC_GetDate(&temp_Date_Get);
HAL_RTC_GetTime(&temp_Time_Get_Again);
if (fu32_Seconds != temp_Time_Get.Second)
{
fu32_Seconds = temp_Time_Get.Second;
printf("Date: 20%x-%x-%x week:%x \r\n", temp_Date_Get.Year, temp_Date_Get.Month, temp_Date_Get.Date, temp_Date_Get.WeekDay);
printf("Time: %2x:%2x:%02x \r\n", temp_Time_Get.Hour, temp_Time_Get.Minute, temp_Time_Get.Second);
sprintf(date,"20%x/%02x/%02x Week%x",temp_Date_Get.Year,temp_Date_Get.Month,temp_Date_Get.Date,temp_Date_Get.WeekDay);
sprintf(time,"%02x:%02x:%02x",temp_Time_Get.Hour, temp_Time_Get.Minute, temp_Time_Get.Second);
OLED_ShowStr(0,0,"ACM32G103RCT6",2);
OLED_ShowStr(0,2,"RTC-TEST",2);
OLED_ShowStr(0,4, date, 2);
OLED_ShowStr(0,6, time, 2);
}
}
2.2、main.c
#include "main.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
usart_init(115200);
printf("\r\n\r\n====== ACM32G103 MCU is runing ======\r\nSysCoreClk: %dHz, HCLK:%dHz\r\nPCLK1:%dHz, PCLK2:%dHz\r\n\r\n",g_SystemCoreClock, HAL_RCC_GetHCLKFreq(),HAL_RCC_GetPCLK1Freq(),HAL_RCC_GetPCLK2Freq());
init_led();
init_tim2();
init_key();
I2C_Init();
//adc_test();
//eeprom_test();
//oled_test();
init_rtc();
OLED_Init();
OLED_Fill(0x00);
while(1)
{
rtc_read();
//HAL_Delay(500);
//led1_tog();
//printf("https://bbs.eeworld.com.cn/\r\n");
}
}
三、程序运行
下载程序后,复位开发板,串口输出
3.2、oled显示
rtc
|