本帖最后由 eltonchang2001 于 2022-11-9 13:59 编辑
在ESK32-30519 开发板上配置有RTC,将它与数码管相结合可构成电子时钟,其形式如图1所示。 图1 电子时钟 对于RTC 的例程,它是提供时间设置功能的,并由串口来输入,其内容如下:- u32 Time_Regulate(void)
- {
- u32 Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;
- printf("\r\n==============Time Settings=====================================");
- printf("\r\n Please Set Hours");
- printf("\r\n");
- do
- {
- Tmp_HH = ScanUnsignedDecimal();
- } while (Tmp_HH> 23);
- printf(": %u", (unsigned int)Tmp_HH);
- printf("\r\n Please Set Minutes");
- printf("\r\n");
- do
- {
- Tmp_MM = ScanUnsignedDecimal();
- } while (Tmp_MM> 59);
- printf(": %u", (unsigned int)Tmp_MM);
- printf("\r\n Please Set Seconds");
- printf("\r\n");
- do
- {
- Tmp_SS = ScanUnsignedDecimal();
- } while (Tmp_SS> 59);
- printf(": %u", (unsigned int)Tmp_SS);
- return((Tmp_HH * 3600 + Tmp_MM * 60 + Tmp_SS));
- }
其时间的输入发送如图2所示,值得指出的是在输入数值后,需要以一个数字符号外字符来作为结束符。但不能使用回车符,否则会出现参数遗失的现象。
图2 时间设置及运行效果 当然,为了省去参数输入的麻烦,也可以通过修改函数Time_Regulate()以指定值来设置RTC初始值。修改后的函数Time_Regulate()其形式如下:- u32 Time_Regulate(void)
- {
- u32 Tmp_HH = 0x18, Tmp_MM = 0x30, Tmp_SS = 0x00;
- return((Tmp_HH * 3600 + Tmp_MM * 60 + Tmp_SS));
- }
其中参数Tmp_HH、Tmp_MM和Tmp_SS分别为设置的时、分、秒的值。配置数码管显示函数后,实现电子时钟功能的主程序为:- int main(void)
- {
- CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
- CKCUClock.Bit.BKP = 1;
- CKCU_PeripClockConfig(CKCUClock, ENABLE);
- #if (!LIBCFG_NO_PWRCU_TEST_REG)
- if (PWRCU_CheckReadyAccessed() != PWRCU_OK)
- {
- while (1);
- }
- #endif
- HT32F_DVB_LEDInit(HT_LED1);
- RETARGET_Configuration();
- GPIO_Configuration();
- LEDC_Configuration();
- NVIC_EnableIRQ(RTC_IRQn);
- RTC_Configuration();
- printf("\r\n RTC configured....");
- TimeReg = Time_Regulate();
- RTC_Cmd(ENABLE);
- printf("\r\n");
- while (1)
- {
- if (gwTimeDisplay == 1)
- {
- Time_Display(RTC_GetCounter() + TimeReg);
- gwTimeDisplay = 0;
- }
- }
- }
对应的RTC显示函数为:- void Time_Display(u32 wTimeVar)
- {
- u32 THH = 0, TMM = 0, TSS = 0;
- unsigned int m,s;
- wTimeVar %= 86400;
- THH = wTimeVar/3600;
- TMM = (wTimeVar % 3600)/60;
- TSS = (wTimeVar % 3600)% 60;
- m=TMM;
- s=TSS;
- LEDC_SetData(HTCFG_LEDC_COM_D1, NumberChar[m/10]);
- LEDC_SetData(HTCFG_LEDC_COM_D2, NumberChar[m%10]|0x02);
- LEDC_SetData(HTCFG_LEDC_COM_D3, NumberChar[s/10]);
- LEDC_SetData(HTCFG_LEDC_COM_D4, NumberChar[s%10]);
|