[开发板] 【CW32L031CxTx StartKit评估板测评】+RTC电子时钟

[复制链接]
653|0
 楼主| jinglixixi 发表于 2023-9-28 09:39 | 显示全部楼层 |阅读模式
RTC, cw, tc
本帖最后由 jinglixixi 于 2023-9-28 09:46 编辑

#申请原创#   @21小跑堂
在CW32L031内部配有RTC计时器,通过与串行数码管相配合,可实现RTC电子时钟的计时显示功能。
在使用例程进行测试时,需连接一个USB转TTL的通讯模块,具体的连接关系为:
PA8-----RX
PA9-----TX
在对程序进行编译下载后,其输出内容如图1所示,但并没有后续的计时效果输出。
1.jpg
图1 输出内容

后经程序的修改,终于实现了计时值的显示输出,其测试效果如图2所示,其之所以出现多个相同的计时值是因为延时值过短的原因。
2.jpg
图2 输出测试

经输出延时值的调整,其输出效果如图3所示,达到了单一计时值的输出。
3.jpg
3 输出测试

在此基础上,通过添加串行数码管显示驱动及时间显示函数的修改即可达到计时显示功能。

修改后的时间显示函数为:
  1. void ShowTime(void)
  2. {
  3.     RTC_TimeTypeDef RTC_TimeStruct = {0};
  4.     RTC_DateTypeDef RTC_DateStruct = {0};
  5.     static uint8_t *WeekdayStr[7]= {"SUN","MON","TUE","WED","THU","FRI","SAT"};
  6.    static uint8_t *H12AMPMStr[2][2]= {{"AM","PM"},{"",""}};
  7.     RTC_GetDate(&RTC_DateStruct);
  8.     RTC_GetTime(&RTC_TimeStruct);
  9.     Write_Max7219(1,RTC_TimeStruct.Second%16);
  10.     Write_Max7219(2,RTC_TimeStruct.Second/16);
  11.     Write_Max7219(3,0x0a);
  12.     Write_Max7219(4,RTC_TimeStruct.Minute%16);
  13.     Write_Max7219(5,RTC_TimeStruct.Minute/16);
  14.     Write_Max7219(6,0x0a);
  15.     Write_Max7219(7,RTC_TimeStruct.Hour%16);
  16.     Write_Max7219(8,RTC_TimeStruct.Hour/16);
  17. }


相应的主程序为:
  1. int32_t main(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.     RCC_HSI_Enable(RCC_HSIOSC_DIV6);
  5.     __RCC_GPIOC_CLK_ENABLE();
  6.     MAX7219_gpio();
  7.     Init_MAX7219();
  8.     RTC_InitTypeDef RTC_InitStruct = {0};
  9.     RTC_AlarmTypeDef RTC_AlarmStruct = {0};
  10.     /* System Clocks Configuration */
  11.     RCC_Configuration();
  12.     LogInit();
  13.     printf("RTC Init...\r\n");
  14.     printf("    (RTC CR0:%04x,CR1:%04x,CR2:%04x,RESET FLAG:0x%08x)\r\n",CW_RTC->CR0,CW_RTC->CR1,CW_RTC->CR2,CW_SYSCTRL->RESETFLAG);
  15.     //RCC_HSE_Enable(RCC_HSE_MODE_OSC, RCC_HSE_FREQ_GT24M,RCC_HSE_DRIVER_NORMAL, RCC_HSE_FLT_CLOSE);  //选择HSE为RTC时钟
  16.     RCC_LSE_Enable(RCC_LSE_MODE_OSC, RCC_LSE_AMP_NORMAL, RCC_LSE_DRIVER_NORMAL);  // 选择LSE为RTC时钟
  17.     //RCC_LSI_Enable();                                                           // 选择LSI为RTC时钟
  18.     RTC_InitStruct.DateStruct.Day = 0x21;             //设置日期,DAY、MONTH、YEAR必须为BCD方式,星期为0~6,代表星期日,星期一至星期六
  19.     RTC_InitStruct.DateStruct.Month = RTC_Month_June;
  20.     RTC_InitStruct.DateStruct.Week = RTC_Weekday_Monday;
  21.     RTC_InitStruct.DateStruct.Year = 0x21;
  22.     printf("-------Set Date as 20%x/%x/%x\r\n", RTC_InitStruct.DateStruct.Year,RTC_InitStruct.DateStruct.Month,RTC_InitStruct.DateStruct.Day);
  23.     RTC_InitStruct.TimeStruct.Hour = 0x11;         //设置时间,HOUR、MINIUTE、SECOND必须为BCD方式,用户须保证HOUR、AMPM、H24之间的关联正确性
  24.     RTC_InitStruct.TimeStruct.Minute = 0x58;
  25.     RTC_InitStruct.TimeStruct.Second = 0x59;
  26.     RTC_InitStruct.TimeStruct.AMPM = 0;
  27.     RTC_InitStruct.TimeStruct.H24 = 0;
  28.     printf("-------Set Time as %02x:%02x:%02x\r\n", RTC_InitStruct.TimeStruct.Hour,RTC_InitStruct.TimeStruct.Minute,RTC_InitStruct.TimeStruct.Second);
  29.     RTC_InitStruct.RTC_ClockSource = RTC_RTCCLK_FROM_LSE;
  30.     RTC_Init(&RTC_InitStruct);    //  用户需选定需要使用的时钟源
  31.     while(1)
  32.     {
  33.                  ShowTime();
  34.                 delay(2000);
  35.     }
  36. }

经程序的编译与下载,其测试效果如图4和图5所示。
4.jpg
图4 显示效果1

5.jpg
图5 显示效果2






您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部