当前位置:首页 > 嵌入式智能万年历设计
#elif defined RTCClockSource_LSE
/*允许LSE*/
RCC_LSEConfig(RCC_LSE_ON);
/*等待LSE准备好*/
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET) { }
/*选择LSE作为RTC时钟源*/
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #endif
/* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE);
#ifdef RTCClockOutput_Enable /*禁止Tamper引脚*/
BKP_TamperPinCmd(DISABLE);/*为了将RTCCLK/64在Tamper引脚输出,Tamper功能必须被禁止*/
/*允许RTC时钟在Tamper引脚上输出*/
BKP_RTCCalibrationClockOutputCmd(ENABLE); #endif
/*等待寄存器同步*/ RTC_WaitForSynchro();
/*等待上次RTC寄存器写操作完成*/ RTC_WaitForLastTask();
/*允许RTC秒中断*/
RTC_ITConfig(RTC_IT_SEC, ENABLE);
/*等待上次RTC寄存器写操作完成*/ RTC_WaitForLastTask();
#ifdef RTCClockSource_LSI /*设置分频系数*/
RTC_SetPrescaler(31999); /*RTC周期=RTCCLK/RTC_PR=(32.000kHz/(31999+1))*/
#elif defined RTCClockSource_LSE
RTC_SetPrescaler(32767); /*RTC周期=RTCCLK/RTC_PR=(32.768kHz/(31767+1))*/ #endif
/*等待上次RTC寄存器写操作完成*/ RTC_WaitForLastTask(); }
void Time_Regulate(struct rtc_time *tm) {
u32 Tmp_YY = 0xFF, Tmp_MM = 0xFF, Tmp_DD = 0xFF, Tmp_HH = 0xFF, Tmp_MI = 0xFF, Tmp_SS = 0xFF;
printf(\
printf(\请输入年份(Please Set Years): 20\
while (Tmp_YY == 0xFF) {
Tmp_YY = USART_Scanf(99); }
printf(\年份被设置为: 20%0.2d\\n\\r\
tm->tm_year = Tmp_YY+2000;
Tmp_MM = 0xFF;
printf(\请输入月份(Please Set Months): \
while (Tmp_MM == 0xFF) {
Tmp_MM = USART_Scanf(12); }
printf(\月份被设置为: %d\\n\\r\
tm->tm_mon= Tmp_MM;
Tmp_DD = 0xFF;
printf(\请输入日期(Please Set Dates): \
while (Tmp_DD == 0xFF) {
Tmp_DD = USART_Scanf(31); }
printf(\日期被设置为: %d\\n\\r\
tm->tm_mday= Tmp_DD;
Tmp_HH = 0xFF;
printf(\请输入时钟(Please Set Hours): \
while (Tmp_HH == 0xFF) {
Tmp_HH = USART_Scanf(23); }
printf(\时钟被设置为: %d\\n\\r\
tm->tm_hour= Tmp_HH;
Tmp_MI = 0xFF;
printf(\请输入分钟(Please Set Minutes): \
while (Tmp_MI == 0xFF) {
Tmp_MI = USART_Scanf(59); }
printf(\分钟被设置为: %d\\n\\r\
tm->tm_min= Tmp_MI;
Tmp_SS = 0xFF;
printf(\请输入秒钟(Please Set Seconds): \
while (Tmp_SS == 0xFF) {
Tmp_SS = USART_Scanf(59); }
printf(\秒钟被设置为: %d\\n\\r\
tm->tm_sec= Tmp_SS; }
void Time_Adjust() {
RTC_WaitForLastTask();
Time_Regulate(&systmtime);
GregorianDay(&systmtime);
RTC_SetCounter(mktimev(&systmtime));
RTC_WaitForLastTask(); }
void Time_Display(uint32_t TimeVar) {
to_tm(TimeVar, &systmtime);
printf(\当前时间为: %d年 %d月 %d日 (星期%s) %0.2d:%0.2d:%0.2d\
systmtime.tm_year, systmtime.tm_mon, systmtime.tm_mday, WEEK_STR[systmtime.tm_wday], systmtime.tm_hour, systmtime.tm_min, systmtime.tm_sec); }
void Time_Show() {
printf(\
/* Infinite loop */ while (1) {
/* 每过1s */
if (TimeDisplay == 1) {
Time_Display(RTC_GetCounter()); TimeDisplay = 0; } } }
u8 USART_Scanf(u32 value) {
u32 index = 0;
u32 tmp[2] = {0, 0};
while (index < 2)
共分享92篇相关文档