本帖最后由 jinglixixi 于 2023-9-28 09:46 编辑
#申请原创# @21小跑堂
在CW32L031内部配有RTC计时器,通过与串行数码管相配合,可实现RTC电子时钟的计时显示功能。 在使用例程进行测试时,需连接一个USB转TTL的通讯模块,具体的连接关系为: PA8-----RX PA9-----TX 在对程序进行编译下载后,其输出内容如图1所示,但并没有后续的计时效果输出。
图1 输出内容
后经程序的修改,终于实现了计时值的显示输出,其测试效果如图2所示,其之所以出现多个相同的计时值是因为延时值过短的原因。 图2 输出测试
经输出延时值的调整,其输出效果如图3所示,达到了单一计时值的输出。 图3 输出测试
在此基础上,通过添加串行数码管显示驱动及时间显示函数的修改即可达到计时显示功能。
修改后的时间显示函数为: void ShowTime(void)
{
RTC_TimeTypeDef RTC_TimeStruct = {0};
RTC_DateTypeDef RTC_DateStruct = {0};
static uint8_t *WeekdayStr[7]= {"SUN","MON","TUE","WED","THU","FRI","SAT"};
static uint8_t *H12AMPMStr[2][2]= {{"AM","PM"},{"",""}};
RTC_GetDate(&RTC_DateStruct);
RTC_GetTime(&RTC_TimeStruct);
Write_Max7219(1,RTC_TimeStruct.Second%16);
Write_Max7219(2,RTC_TimeStruct.Second/16);
Write_Max7219(3,0x0a);
Write_Max7219(4,RTC_TimeStruct.Minute%16);
Write_Max7219(5,RTC_TimeStruct.Minute/16);
Write_Max7219(6,0x0a);
Write_Max7219(7,RTC_TimeStruct.Hour%16);
Write_Max7219(8,RTC_TimeStruct.Hour/16);
}
相应的主程序为: int32_t main(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
__RCC_GPIOC_CLK_ENABLE();
MAX7219_gpio();
Init_MAX7219();
RTC_InitTypeDef RTC_InitStruct = {0};
RTC_AlarmTypeDef RTC_AlarmStruct = {0};
/* System Clocks Configuration */
RCC_Configuration();
LogInit();
printf("RTC Init...\r\n");
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);
//RCC_HSE_Enable(RCC_HSE_MODE_OSC, RCC_HSE_FREQ_GT24M,RCC_HSE_DRIVER_NORMAL, RCC_HSE_FLT_CLOSE); //选择HSE为RTC时钟
RCC_LSE_Enable(RCC_LSE_MODE_OSC, RCC_LSE_AMP_NORMAL, RCC_LSE_DRIVER_NORMAL); // 选择LSE为RTC时钟
//RCC_LSI_Enable(); // 选择LSI为RTC时钟
RTC_InitStruct.DateStruct.Day = 0x21; //设置日期,DAY、MONTH、YEAR必须为BCD方式,星期为0~6,代表星期日,星期一至星期六
RTC_InitStruct.DateStruct.Month = RTC_Month_June;
RTC_InitStruct.DateStruct.Week = RTC_Weekday_Monday;
RTC_InitStruct.DateStruct.Year = 0x21;
printf("-------Set Date as 20%x/%x/%x\r\n", RTC_InitStruct.DateStruct.Year,RTC_InitStruct.DateStruct.Month,RTC_InitStruct.DateStruct.Day);
RTC_InitStruct.TimeStruct.Hour = 0x11; //设置时间,HOUR、MINIUTE、SECOND必须为BCD方式,用户须保证HOUR、AMPM、H24之间的关联正确性
RTC_InitStruct.TimeStruct.Minute = 0x58;
RTC_InitStruct.TimeStruct.Second = 0x59;
RTC_InitStruct.TimeStruct.AMPM = 0;
RTC_InitStruct.TimeStruct.H24 = 0;
printf("-------Set Time as %02x:%02x:%02x\r\n", RTC_InitStruct.TimeStruct.Hour,RTC_InitStruct.TimeStruct.Minute,RTC_InitStruct.TimeStruct.Second);
RTC_InitStruct.RTC_ClockSource = RTC_RTCCLK_FROM_LSE;
RTC_Init(&RTC_InitStruct); // 用户需选定需要使用的时钟源
while(1)
{
ShowTime();
delay(2000);
}
}
经程序的编译与下载,其测试效果如图4和图5所示。 图4 显示效果1
图5 显示效果2
|