本次实验是在I2C接口的OLED驱动成功的基础上进行了RTC实验,将实时时钟数据送至OLED进行显示。
一、实验资源
1、AT-START-F407开发板;
2、keil v5.31.0.0;
3、BSP等相关资源;
4、0.91'OLED
二、相关知识学习
AT32F407VGT7的RTC模块功能比较强大,应用比较灵活。其工作时钟可配置为HSELSELSI三种中的一种;支持闹钟、秒、溢出等中断:
RTC操作所涉及到的寄存数量不多、操作也是比较简便:
三、硬件连接
硬件部分只是在I2C1端口连接了一只0.91'、分辨率为128*32的OLED显示器,详见上篇实验https://bbs.21ic.com/icview-3068734-1-1.html
四、程序实现
程序代码主要源自“BSP”中的“RTC”部分,只是在本次实验中进行了小的修改。主要代码:
int main(void)
{
uint8_t hour,min,sec;
AT32_Board_Init();
UART_Print_Init(115200);
I2Cx_Init(I2C1);
OLED_Init();
RTC_Init();
OLED_Clear();
// OLED_ShowCHinese(24,0,0);//雅
// OLED_ShowCHinese(40,0,1);//特
// OLED_ShowCHinese(56,0,2);//力
// OLED_ShowCHinese(72,0,3);//科
// OLED_ShowCHinese(88,0,4);//技
//
// OLED_ShowString(12,2,"AT-START-F407",16);
while(1)
{
if(RTC_GetFlagStatus(RTC_FLAG_PACE) != RESET)
{
/* Update current time */
RTC_Get();
hour = calendar.hour;
min = calendar.min;
sec = calendar.sec;
OLED_ShowF16X32(0,0,hour/10);
OLED_ShowF16X32(16,0,hour%10);
OLED_ShowF16X32(32,0,10);
OLED_ShowF16X32(48,0,min/10);
OLED_ShowF16X32(64,0,min%10);
OLED_ShowF16X32(80,0,10);
OLED_ShowF16X32(96,0,sec/10);
OLED_ShowF16X32(112,0,sec%10);
/* print the current time */
// printf("\r\n");
// printf("%d/%d/%d ", calendar.w_year, calendar.w_month, calendar.w_date);
// printf("%02d:%02d:%02d %s", calendar.hour, calendar.min, calendar.sec, weekday_table[calendar.week]);
/* Clear the RTC Second flag */
RTC_ClearFlag(RTC_FLAG_PACE);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
}
}
五、实验结果
六、总结
RTC实验看上去很简单,其实这主要得意于"BSP"提供的RTC实验例程,这部分代码非常值得借鉴学习。
|