在CH32V307内部配有RTC计时器,用它来计时可免除计时中的进制转换问题,将RTC与OLED屏相结合可轻松地实现电子时钟的功能。
以RTC实现电子时钟功能的步骤如下:
1. 创建一个基于CH32V307开发板的RT-Thread新项目
2. 在左侧项目资源管理器中点击“RT-Thread Setting”
3. 点击“软件模拟RTC”并选取“配置项”,然后按图1所示进行设置。
图1 RTC设置
4. 按“Ctrl + S”进行保存,以使RT Thread的配置生效。
5. 在主程序main.c中添加函数rtc_sample(),其内容如下:
int rtc_test(void){ rt_err_t ret = RT_EOK; /* 设置日期 */ ret = set_date(2021, 06, 02); if (ret != RT_EOK) { rt_kprintf("set RTC date failed\n"); } return ret; /* 设置时间 */ ret = set_time(11, 15, 50); if (ret != RT_EOK) { rt_kprintf("set RTC time failed\n"); } return ret; }
复制代码 6. 修改主程序的内容,是其为:
int main(void){ time_t now; rt_kprintf("MCU: CH32V307\n"); rt_kprintf("SysClk: %dHz\n",SystemCoreClock); rt_kprintf("www.wch.cn\n"); LED1_BLINK_INIT(); GPIO_ResetBits(GPIOA,GPIO_Pin_0); rtc_test(); while(1) { GPIO_SetBits(GPIOA,GPIO_Pin_0); rt_thread_mdelay(500); GPIO_ResetBits(GPIOA,GPIO_Pin_0); rt_thread_mdelay(500); now = time(RT_NULL); rt_kprintf("%s\n", ctime(&now)); } }
复制代码7. 经编译,其编译结果如图2所示。
图2完成编译
8. 下载程序,则测试结果如图3所示。
图3 测试结果
9. 若调整RTC的初始时间,可使用如下语句来完成:
ret =set_date(2022, 07, 02);
ret =set_time(10, 42, 00);
10. 若以OLED屏进行显示,在添加显示函数的情况下,则实现电子时钟的功能。
电子时钟的显示函数为:
void OLED_ShowStringk(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size){ unsigned char j=0; uint8_t b; while (j<24) { if(j==11) { y=6; b=x; x=0; } if(j==20) { y=4; x=b; } if(j>3) { OLED_ShowChar(x,y,chr[j],Char_Size); x+=8; } j++; } }
复制代码实现图4所示效果的主程序为:
int main(void){ time_t now; LED1_BLINK_INIT(); GPIO_ResetBits(GPIOA,GPIO_Pin_0); rtc_test(); app_OLED_Init(); OLED_Init(); OLED_Clear(); OLED_ShowString(0,0,"CH32V307 TEST",16); OLED_ShowString(0,2,"OLED & RTC",16); while(1) { GPIO_SetBits(GPIOA,GPIO_Pin_0); rt_thread_mdelay(500); GPIO_ResetBits(GPIOA,GPIO_Pin_0); rt_thread_mdelay(500); now = time(RT_NULL); OLED_ShowStringk(0,4,ctime(&now),16); } }
复制代码图4 运行效果