【上海航芯 ACM32F070开发板+触控功能评估板】—— RTC例程
[复制链接]
RTC例程1
Keil-Options_SVD
使用SystemViewer观察RTC寄存器,在Debug状态的Run模式下,可以看到RTC的时间寄存器在更新。
2.1. RTC_TIME_DATE_SET_GET
/* RTC计时功能 */
case RTC_TIME_DATE_SET_GET:
{
printfS("This is RTC_TIME_DATE_SET_GET Test!\n");
RTC_Handle.u32_ClockSource = RTC_CLOCK_XTL;
RTC_Handle.u32_Compensation = COMPENSATION_INCREASE; // 开始时钟补偿,如不需补偿设置补偿值为0
RTC_Handle.u32_CompensationValue = 0x05; // 开始时钟补偿,如不需补偿设置补偿值为0
HAL_RTC_Config(&RTC_Handle);
/* Set RTC Time、Date */
gstr_Time_Set.u8_Hours = 0x12;
gstr_Time_Set.u8_Minutes = 0x30;
gstr_Time_Set.u8_Seconds = 0x00;
HAL_RTC_SetTime(&gstr_Time_Set);
gstr_Date_Set.u8_Year = 0x21; // 2021
gstr_Date_Set.u8_Month = RTC_MONTH_MARCH;
gstr_Date_Set.u8_Date = 0x20;
gstr_Date_Set.u8_WeekDay = RTC_WEEKDAY_FRIDAY;
HAL_RTC_SetDate(&gstr_Date_Set);
while (1)
{
HAL_RTC_GetTime(&gstr_Time_Get);
HAL_RTC_GetDate(&gstr_Date_Get);
HAL_RTC_GetTime(&gstr_Time_Get_Again);
if (gstr_Time_Get.u8_Seconds != gstr_Time_Get_Again.u8_Seconds)
{
continue;
}
if (fu32_Seconds != gstr_Time_Get.u8_Seconds)
{
fu32_Seconds = gstr_Time_Get.u8_Seconds;
printfS("Date: 20%x-%x-%x week:%x \n", gstr_Date_Get.u8_Year, gstr_Date_Get.u8_Month, gstr_Date_Get.u8_Date, gstr_Date_Get.u8_WeekDay);
printfS("Time: %02x:%02x:%02x \n", gstr_Time_Get.u8_Hours, gstr_Time_Get.u8_Minutes, gstr_Time_Get.u8_Seconds);
}
}
}break;
-
本段代码首先配置RTC,然后设置时间、日期,然后进入while(1)无限循环,
-
在无限循环中,获取RTC的时间和日期,然后再次获取时间,如果这两次时间的秒数不同,则跳过之后的代码,重新开始新的循环,
-
只有两次获得的RTC时间都相同才继续往下执行,确保是进入新的一秒才执行之后的代码。
-
对比上次保存的秒数和这次秒数,如果不同(意味着进入了新的一秒),就打印出获取到的RTC的日期和时间,
执行效果如图:
2.2. RTC_ALARM
/* RTC闹钟功能 */
case RTC_ALARM:
{
/********************************************/
/**************** RTC Config ****************/
/********************************************/
printfS("This is RTC_ALARM Test!\n");
RTC_Handle.u32_ClockSource = RTC_CLOCK_XTL;
RTC_Handle.u32_Compensation = COMPENSATION_INCREASE; // 开始时钟补偿,如不需补偿设置补偿值为0
RTC_Handle.u32_CompensationValue = 0x05; // 开始时钟补偿,如不需补偿设置补偿值为0
HAL_RTC_Config(&RTC_Handle);
/* Set RTC Time、Date */
gstr_Time_Set.u8_Hours = 0x12;
gstr_Time_Set.u8_Minutes = 0x29;
gstr_Time_Set.u8_Seconds = 0x50;
HAL_RTC_SetTime(&gstr_Time_Set);
gstr_Date_Set.u8_Year = 0x21; // 2021
gstr_Date_Set.u8_Month = RTC_MONTH_MARCH;
gstr_Date_Set.u8_Date = 0x20;
gstr_Date_Set.u8_WeekDay = RTC_WEEKDAY_FRIDAY;
HAL_RTC_SetDate(&gstr_Date_Set);
/********************************************/
/**************** Alarm Config ****************/
/********************************************/
gstr_Alarm.u32_AlarmMode = RTC_ALARM_WEEK_MODE; // 使用星期模式
gstr_Alarm.u32_AlarmInterrupt = RTC_ALARM_INT_ENABLE; // 开启闹钟中断
gstr_Alarm.u32_DayMask = RTC_ALARM_DAY_MASK_DISABLE; // 天 屏蔽关闭
gstr_Alarm.u32_HourMask = RTC_ALARM_HOUR_MASK_DISABLE; // 小时屏蔽关闭
gstr_Alarm.u32_MinMask = RTC_ALARM_MIN_MASK_DISABLE; // 分钟屏蔽关闭
gstr_Alarm.u32_AlarmWeek = RTC_ALARM_WEEK_FRIDAY | RTC_ALARM_WEEK_SATURDAY; // 周五、周六
gstr_Alarm.u32_Hours = 0x12; // 时间 12:30:00
gstr_Alarm.u32_Minutes = 0x30;
gstr_Alarm.u32_Seconds = 0x00;
HAL_RTC_AlarmConfig(&gstr_Alarm);
NVIC_ClearPendingIRQ(RTC_IRQn);
NVIC_EnableIRQ(RTC_IRQn);
HAL_RTC_AlarmEnable();
while (1)
{
HAL_RTC_GetDate(&gstr_Date_Get);
HAL_RTC_GetTime(&gstr_Time_Get);
HAL_RTC_GetTime(&gstr_Time_Get_Again);
if (gstr_Time_Get.u8_Seconds != gstr_Time_Get_Again.u8_Seconds)
{
continue;
}
if (fu32_Seconds != gstr_Time_Get.u8_Seconds)
{
fu32_Seconds = gstr_Time_Get.u8_Seconds;
printfS("Date: 20%x-%x-%x week:%x \n", gstr_Date_Get.u8_Year, gstr_Date_Get.u8_Month, gstr_Date_Get.u8_Date, gstr_Date_Get.u8_WeekDay);
printfS("Time: %02x:%02x:%02x \n", gstr_Time_Get.u8_Hours, gstr_Time_Get.u8_Minutes, gstr_Time_Get.u8_Seconds);
}
if (true == gb_AlarmFlag)
{
gb_AlarmFlag = false;
printfS("This is RTC Alarm!!! \r\n");
HAL_RTC_AlarmDisable();
break;
}
}
}break;
-
本段代码整体上与前一段代码 RTC_TIME_DATE_SET_GET 类似,不再赘叙,以下分析新增的功能代码。
-
在配置RTC时,配置了ALARM模式的中断,闹钟时间设置为每周五/六的12:30:00。(为了快速调试,将RTC当前时间设置为12:29:50,即10秒钟后即触发闹钟)
-
当RTC计时器达到设定的ALARM时间点,暂停当前执行程序(主函数),进入RTC_IRQHandler。
2.3. RTC_Tamper
未达到预期运行测试效果,正在排查中。
|