RTC

关于STM32F4的RTC疑问

发布于 2019-11-16 11:00:00
    本帖最后由 kuailedeluojie 于 2019-11-16 11:32 编辑


/*******************************************************************************
* Function Name : RTC_Configuration
* Description : Configures the RTC.
* Input : None
* Output : None
* Return : 0 reday,-1 error.
*******************************************************************************/
int RTC_Configuration(void)
{
RTC_InitTypeDef RTC_InitStructure;
/* Enable the PWR clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

/* Allow access to RTC */
PWR_BackupAccessCmd(ENABLE);

#if defined (RTC_CLOCK_SOURCE_LSI) /* LSI used as RTC source clock*/
/* The RTC Clock may varies due to LSI frequency dispersion */
/* Enable the LSI OSC */
RCC_LSICmd(ENABLE);

/* Wait till LSI is ready */
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{
}

/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

/* ck_spre(1Hz) = RTCCLK(LSI) /(uwAsynchPrediv + 1)*(uwSynchPrediv + 1)*/
//uwSynchPrediv = 0xFF;
//uwAsynchPrediv = 0x7F;

#elif defined (RTC_CLOCK_SOURCE_LSE) /* LSE used as RTC source clock */
/* Enable the LSE OSC */
RCC_LSEConfig(RCC_LSE_ON);

/* Wait till LSE is ready */
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
}
/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

#else
#error Please select the RTC Clock source inside the main.c file
#endif /* RTC_CLOCK_SOURCE_LSI */

/* Enable the RTC Clock */
RCC_RTCCLKCmd(ENABLE);

/* Wait for RTC APB registers synchronisation */
RTC_WaitForSynchro();



z这是RTC的配置代码,用的是RTC_CLOCK_SOURCE_LSE,之前能正常运行的,设置了一次之后,重启一下,就获取不了正常时间了。
void RTC_TimeAndDate_Set(void)
{
RTC_TimeTypeDef RTC_TimeStructure;
RTC_DateTypeDef RTC_DateStructure;

// 初始化时间
RTC_TimeStructure.RTC_H12 = RTC_H12_AMorPM;
RTC_TimeStructure.RTC_Hours = HOURS;
RTC_TimeStructure.RTC_Minutes = MINUTES;
RTC_TimeStructure.RTC_Seconds = SECONDS;
RTC_SetTime(RTC_Format_BINorBCD, &RTC_TimeStructure);
RTC_WriteBackupRegister(RTC_BKP_DRX, RTC_BKP_DATA);

// 初始化日期
RTC_DateStructure.RTC_WeekDay = WEEKDAY;
RTC_DateStructure.RTC_Date = DATE;
RTC_DateStructure.RTC_Month = MONTH;
RTC_DateStructure.RTC_Year = YEAR;
RTC_SetDate(RTC_Format_BINorBCD, &RTC_DateStructure);
RTC_WriteBackupRegister(RTC_BKP_DRX, RTC_BKP_DATA);
}


以上是时间设置函数
void show_time(void)
{
RTC_TimeTypeDef t;
RTC_DateTypeDef d;
/* Get the current Date */
RTC_GetDate(RTC_Format_BIN,&d);
/* Get the current Time */
RTC_GetTime(RTC_Format_BIN, &t);
/* Display time Format : hh:mm:ss */
rt_kprintf("Now Time = 20%02d %02d %02d[%02d]-%0.2d:%0.2d:%0.2d \r\n", \
d.RTC_Year,d.RTC_Month,d.RTC_Date,d.RTC_WeekDay,t.RTC_Hours, t.RTC_Minutes, t.RTC_Seconds);
}

这是获取时间函数
以下是RTC配置相关函数

void rt_hw_rtc_init(void)
{
rtc.type = RT_Device_Class_RTC;

if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)
{
rt_kprintf("rtc is not configured\n");
rt_kprintf("please configure with set_date and set_time\n");
if ( RTC_Configuration() != 0)
{
rt_kprintf("rtc configure fail...\r\n");
return ;
}
}
else
{
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro();
}

/* register rtc device */
rtc.init = RT_NULL;
rtc.open = rt_rtc_open;
rtc.close = RT_NULL;
rtc.read = rt_rtc_read;
rtc.write = RT_NULL;
rtc.control = rt_rtc_control;

/* no private */
rtc.user_data = RT_NULL;

rt_device_register(&rtc, "rtc", RT_DEVICE_FLAG_RDWR);
show_time();
return;
}

每次都打印一样的结果,请大神指点一下
Now Time = 2000 01 01[01]-00:00:00


查看更多

关注者
0
被浏览
410
7 个回答
aozima
aozima 2019-11-16
    本帖最后由 aozima 于 2019-11-16 11:28 编辑


RTC的32K晶振起振了没?
aozima
aozima 2019-11-16
    本帖最后由 aozima 于 2019-11-16 11:29 编辑


楼主从来不管乱码的吗?别人会认真看?
kuailedeluojie
kuailedeluojie 2019-11-16
    本帖最后由 kuailedeluojie 于 2019-11-16 11:33 编辑


aozima 发表于 2019-11-16 11:23
楼主重来不管乱码的吗?别人会认真看?

乱码的改好了
MikeCai
MikeCai 2019-11-16

实在不行,您要不用cubeMX 自行设置 RTC,生成 RTC 代码试试。
参考这篇文章
STM32Cube 学习之十二:RTC
kuailedeluojie
kuailedeluojie 2019-11-16
MikeCai 发表于 2019-11-16 11:56
实在不行,您要不用cubeMX 自行设置 RTC,生成 RTC 代码试试。
参考这篇文章
STM32Cube 学习之十二:RTC ...


晚点吧,先把这个问题解决啊

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友