在这个初始化函数里,没有见到熟悉的初始化结构体,对RTC的每一个初始化参数都是使用相应的库函数来配置的.RTC作为备份域的一份子,在访问前首先要使能备份域、电源管理外设的时钟,设置备份域访问权限,作为定时器,初始化时必须要选择好时钟来源,时钟分频.
时间调节Time_Adjust():
void Time_Adjust(struct rtc_time *tm)
{
/* 等待前面可能的 RTC 写操作完成 */
RTC_WaitForLastTask();
/* 利用串口,在终端向用户询问当前北京时间(年月日时分秒),
写入到 rtc_time 型结构体 */
Time_Regulate(tm);
/* 计算输入的日期是星期几,把rtc_time型结构体填充完整 */
GregorianDay(tm);
/* 根据输入日期,计算出 UNIX 时间戳,修改当前 RTC 计数寄存器内容*/
RTC_SetCounter(mktimev(tm));
/* 等待 RTC 写操作完成 */
RTC_WaitForLastTask();
}
这里流程就是使用Time_Regulate()从终端获取当前北京时间,然后根据用户的输入,调用函数mktimev()根据用户输入的年,月,日,时,.分,秒数据,计算出相应的UNIX时间戳,最后调用库函数RTC_SetCounter()把这个UNIX时间戳写入到计数器RTC_CNT,RTC就正式运行了.
获取时间Time_Regulate():
void Time_Reglate(struct rtc_time *tm)
{
u32 Tmp_YY = 0xFF, Tmp_MM = 0xFF, Tmp_DD = 0xFF, Tmp_HH =0xFF, Tmp_MI = 0xFF, Tmp_SS = 0xFF;
printf("\r\n==========Time Settings=================="); printf("\r\n 请输入年份(Please Set Years): 20"); while (Tmp_YY == 0xFF) { Tmp_YY = USART_Scanf(99); } printf("\n\r 年份被设置为: 20%0.2d\n\r", Tmp_YY); tm->tm_year = Tmp_YY+2000; Tmp_MM = 0xFF; printf("\r\n 请输入月份(Please Set Months): "); while (Tmp_MM == 0xFF) { Tmp_MM = USART_Scanf(12); } printf("\n\r 月份被设置为: %d\n\r", Tmp_MM); tm->tm_mon= Tmp_MM; Tmp_DD = 0xFF; printf("\r\n 请输入日期(Please Set Dates): "); while (Tmp_DD == 0xFF) { Tmp_DD = USART_Scanf(31); } printf("\n\r 日期被设置为: %d\n\r", Tmp_DD); tm->tm_mday= Tmp_DD; Tmp_HH = 0xFF; printf("\r\n 请输入时钟(Please Set Hours): "); while (Tmp_HH == 0xFF) { Tmp_HH = USART_Scanf(23); } printf("\n\r 时钟被设置为: %d\n\r", Tmp_HH ); tm->tm_hour= Tmp_HH; Tmp_MI = 0xFF; printf("\r\n 请输入分钟(Please Set Minutes): "); while (Tmp_MI == 0xFF) { Tmp_MI = USART_Scanf(59); } printf("\n\r 分钟被设置为: %d\n\r", Tmp_MI); tm->tm_min= Tmp_MI; Tmp_SS = 0xFF; printf("\r\n 请输入秒钟(Please Set Seconds): "); while (Tmp_SS == 0xFF) { Tmp_SS = USART_Scanf(59); } printf("\n\r 秒钟被设置为: %d\n\r", Tmp_SS); tm->tm_sec= Tmp_SS;
}
这里就是在里面从终端获取用户输入的时间,要留意的是,从终端输入的ASCII码,而不是实际数值(在USART_Scanf里面做处理)
PS:这里补上USART_Scanf()的代码,之前串口篇的时候好像没有附上
static uint8_t USART_Scanf(uint32_t value)
{
uint32_t index = 0;
uint32_t tmp[2] = {0, 0};
while (index