本次实验是在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实验例程,这部分代码非常值得借鉴学习。
|