【硬件】
- Mini-F5330开发板
- OLED显示屏
- 复制OLED显示工程,重命为RTC_clock。
- 复制一份官方例程RTC_Calendar中的rt_calendar.c/h到新工程的RTC文件夹下。
3、把rt_calendar.c添加到工程中的RTC分组中,并把头文件添另进工程。
4、根据编译的提示,添加hal_rtc、hal_bkp、hal_pwr、hal_misc等必需的驱动库。
在mm32f5330_it.c中添加rtc的中断函数:
/***********************************************************************************************************************
* @brief This function handles RTC Handler
* @note none
* @param none
* @retval none
*********************************************************************************************************************/
void RTC_IRQHandler(void)
{
if (RESET != RTC_GetITStatus(RTC_IT_SEC))
{
RTC_UpdateCalendar();
RTC_PrintDateTime();
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_WaitForLastTask();
}
}
下载好程序后,我们在开发板上看到了串口打印出来的日期时间:
5、在main.c中,我们添加显示时间的函数代码如下:
#include "platform.h"
#include "main.h"
#include "oled.h"
#include "rtc_calendar.h"
#include "string.h"
#include <stdio.h>
extern uint8_t rtc_state;
extern RTC_CalendarTypeDef RTC_Calendar;
char data_buff[] = "2024-01-07";
char time_buff[] = "01:01:01";
int main(void)
{
PLATFORM_Init();
RTC_Configure();
OLED_Init();
OLED_ShowStr(10,0,"MM32F5330!",2);
OLED_RefreshRAM();
while (1)
{
if(rtc_state == 1)
{
rtc_state = 0;
sprintf(data_buff,"%04d-%02d-%02d",RTC_Calendar.year,RTC_Calendar.month, RTC_Calendar.day);
sprintf(time_buff,"%02d:%02d:%02d", RTC_Calendar.hour, RTC_Calendar.minute, RTC_Calendar.second);
OLED_ShowStr(10,16,data_buff,2);
OLED_ShowStr(10,32,time_buff,2);
OLED_RefreshRAM();
PLATFORM_LED_Toggle(LED1);
}
}
}
下载好程序后就可以看到时间可以动态显示了:
【添回动态显示时间】
添加动态显示的时钟draw_rolling_clock.c到工程中,并把头文件添加进工程,在主函数中,我们添加代码如下:
#define _MAIN_C_
/* Files include */
#include "platform.h"
#include "main.h"
#include "oled.h"
#include "rtc_calendar.h"
#include "string.h"
#include <stdio.h>
extern uint8_t rtc_state;
extern RTC_CalendarTypeDef RTC_Calendar;
char data_buff[] = "2024-01-07";
char time_buff[] = "01:01:01";
extern uint8_t H1,H2,M1,M2,S1,S2;
int main(void)
{
PLATFORM_Init();
RTC_Configure();
OLED_Init();
// OLED_ShowStr(10,0,"MM32F5330!",2);
// OLED_RefreshRAM();
while (1)
{
if(rtc_state == 1)
{
rtc_state = 0;
sprintf(data_buff,"%04d-%02d-%02d",RTC_Calendar.year,RTC_Calendar.month, RTC_Calendar.day);
OLED_ShowStr(10,0,data_buff,2);
OLED_RefreshPartRAM(0,1,0,127);
H1 = RTC_Calendar.hour/10;
H2 = RTC_Calendar.hour%10;
M1 = RTC_Calendar.minute/10;
M2 = RTC_Calendar.minute%10;
S1 = RTC_Calendar.second/10;
S2 = RTC_Calendar.second%10;
PLATFORM_LED_Toggle(LED1);
}
Draw_Rolling_Clock();
}
}
实现效果如下: