本帖最后由 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(),其内容如下:
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所示。
    image.png
    图2完成编译
    8. 下载程序,则测试结果如图3所示。
    image.png
    图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);
  •     }
  • }
  • 复制代码
    image.png
    图4 运行效果