本帖最后由 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]);
|