【实验器材】
CH32V208WBU6 评估板
【开发环境】 MounRiver Studio Version: v1.91
OS: Windows 10, v.10.0, x86 / win32 Java version: 1.8.0_221 【实验程序】 1、RTC实始化,函数如下:
u8 RTC_Init(void) { u8temp=0; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE);BKP_DeInit(); RCC_LSEConfig(RCC_LSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) ==RESET&&temp<250) {temp++; Delay_Ms(20); }if(temp>=250)return1; RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); RTC_WaitForLastTask(); RTC_WaitForSynchro(); // RTC_ITConfig(RTC_IT_ALR,ENABLE); RTC_ITConfig(RTC_IT_SEC,ENABLE); RTC_WaitForLastTask(); RTC_EnterConfigMode(); RTC_SetPrescaler(32767); RTC_WaitForLastTask(); RTC_Set(2024,7,30,13,58,55);RTC_ExitConfigMode(); BKP_WriteBackupRegister(BKP_DR1,0XA1A1); RTC_NVIC_Config(); RTC_Get();return0; }
函数初期打开时钟与RTC的备份域电源,接着启用LSE时钟,并等待时钟就绪,如果超时,则返回错误码,接着设置初始化日期时间。 接着写入备份寄存器0xA1A1保存参数。 开启RTC中断。
在中断函数中,判断是进入哪个中断,并读取时间,其代码如下:
/********************************************************************* *@fn RTC_IRQHandler * * [url=home.php?mod=space&uid=2666770]@Brief[/url] This function handles RTC Handler. * * [url=home.php?mod=space&uid=1141835]@Return[/url] none */ void RTC_IRQHandler(void) {if (RTC_GetITStatus(RTC_IT_SEC) != RESET) /* Seconds interrupt */ { RTC_Get(); } if(RTC_GetITStatus(RTC_IT_ALR)!= RESET) /* Alarm clock interrupt */ { RTC_ClearITPendingBit(RTC_IT_ALR); RTC_Get(); }RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); RTC_WaitForLastTask(); }
在主程序中,初始化RTC后,周期打印时间:
intmain(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); SystemCoreClockUpdate(); Delay_Init(); USART_Printf_Init(115200);printf("SystemClk:%d\r\n", SystemCoreClock);printf("ChipID:%08x\r\n", DBGMCU_GetCHIPID() );printf("RTC Test\r\n"); RTC_Init();while(1) { Delay_Ms(1000);printf("year/month/day/week/hour/min/sec:\r\n");printf("%d-%d-%d %d %d:%d:%d\r\n", calendar.w_year, calendar.w_month, calendar.w_date, calendar.week, calendar.hour, calendar.min, calendar.sec); } }
实验效果:
|