本帖最后由 jinglixixi_457498010 于 2022-7-5 10:01 编辑

在CH32V307内部配有RTC计时器,用它来计时可免除计时中的进制转换问题,将RTC与OLED屏相结合可轻松地实现电子时钟的功能。
以RTC实现电子时钟功能的步骤如下:
1. 创建一个基于CH32V307开发板的RT-Thread新项目
2. 在左侧项目资源管理器中点击“RT-Thread Setting”
3. 点击“软件模拟RTC”并选取“配置项”,然后按图1所示进行设置。
image.png
图1  RTC设置
4. 按“Ctrl + S”进行保存,以使RT Thread的配置生效。
5. 在主程序main.c中添加函数rtc_sample(),其内容如下:
  1. int rtc_test(void)
  2. {
  3.      rt_err_t ret = RT_EOK;
  4.      /* 设置日期 */
  5.      ret = set_date(2021, 06, 02);
  6.      if (ret != RT_EOK)
  7.      {
  8.          rt_kprintf("set RTC date failed\n");
  9.      }
  10.      return ret;
  11.      /* 设置时间 */
  12.      ret = set_time(11, 15, 50);
  13.      if (ret != RT_EOK)
  14.      {
  15.          rt_kprintf("set RTC time failed\n");
  16.      }
  17.      return ret;
  18. }

6. 修改主程序的内容,是其为:
  1. int main(void)
  2. {
  3.          time_t now;
  4.          rt_kprintf("MCU: CH32V307\n");
  5.          rt_kprintf("SysClk: %dHz\n",SystemCoreClock);
  6.          rt_kprintf("www.wch.cn\n");
  7.          LED1_BLINK_INIT();
  8.          GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  9.          rtc_test();
  10.          while(1)
  11.          {
  12.              GPIO_SetBits(GPIOA,GPIO_Pin_0);
  13.              rt_thread_mdelay(500);
  14.              GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  15.              rt_thread_mdelay(500);
  16.              now = time(RT_NULL);
  17.              rt_kprintf("%s\n", ctime(&now));
  18.          }
  19. }

7. 经编译,其编译结果如图2所示。
image.png
图2完成编译
8. 下载程序,则测试结果如图3所示。
image.png
图3 测试结果
9. 若调整RTC的初始时间,可使用如下语句来完成:
ret =set_date(2022, 07, 02);
ret =set_time(10, 42, 00);
10. 若以OLED屏进行显示,在添加显示函数的情况下,则实现电子时钟的功能。
电子时钟的显示函数为:
  1. void OLED_ShowStringk(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
  2. {
  3.     unsigned char j=0;
  4.     uint8_t b;
  5.     while (j<24)
  6.     {
  7.           if(j==11)
  8.           {
  9.              y=6;
  10.              b=x;
  11.              x=0;
  12.           }
  13.           if(j==20)
  14.           {
  15.              y=4;
  16.              x=b;
  17.           }
  18.           if(j>3)
  19.           {
  20.              OLED_ShowChar(x,y,chr[j],Char_Size);
  21.              x+=8;
  22.           }
  23.           j++;
  24.     }
  25. }

实现图4所示效果的主程序为:
  1. int main(void)
  2. {
  3.     time_t now;
  4.     LED1_BLINK_INIT();
  5.     GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  6.     rtc_test();
  7.     app_OLED_Init();
  8.     OLED_Init();
  9.     OLED_Clear();
  10.     OLED_ShowString(0,0,"CH32V307 TEST",16);
  11.     OLED_ShowString(0,2,"OLED & RTC",16);
  12.     while(1)
  13.     {
  14.              GPIO_SetBits(GPIOA,GPIO_Pin_0);
  15.              rt_thread_mdelay(500);
  16.              GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  17.              rt_thread_mdelay(500);
  18.              now = time(RT_NULL);
  19.              OLED_ShowStringk(0,4,ctime(&now),16);
  20.     }
  21. }

image.png
图4 运行效果