用LSI配置rtc发现STM32F2xx RTC启动不了

2019-07-14 18:04发布


用LSI配置rtc的时候,发现配置不成功,配置失败后直接定时读rtc,发现时间没有增加,怀疑是时钟相关的问题。
我找到了ST官方1.0.0版本的STM32F2xx_StdPeriph_Lib,目前的配置基本和官方一样。常见的外设未配时钟的问题,我应该也避免了吧。

求各位大神看看问题在哪呢?


下面是首次配置部分的代码:

(失败在RCC_RTCCLKCmd(ENABLE);
if (ERROR == RTC_WaitForSynchro())
return 88;

如果注销掉这句同步,会继续失败在if(ERROR == RTC_Init(&RTC_InitTypeDef_Data))
return 233;
查看这个RTC_Init的代码实现,是在进入RTC_EnterInitMode中,查询出现超时)





代码如下:


#define RTC_MAGIC 0xA5A5
#define RTCClockSource_LSI


uint32_t rtc_config(void)
{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_AHB1Periph_BKPSRAM,  ENABLE);


PWR_BackupAccessCmd(ENABLE);


if (RTC_ReadBackupRegister(RTC_BKP_DR0) != RTC_MAGIC)
{
LOG(DEBUG_LOG, "RTC not yet configured....");
return rtc_config_firsttime();
}
else
{
LOG(DEBUG_LOG, "RTC have configured....");
return rtc_config_othertime();
}

}


static uint32_t rtc_config_firsttime(void)
{
RTC_InitTypeDef RTC_InitTypeDef_Data;
RTC_TimeTypeDef default_time;
RTC_DateTypeDef default_data;



RCC_BackupResetCmd(ENABLE);



RCC_LSICmd(ENABLE);


while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{
}


RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);




// E. Enable RTC Clock
RCC_RTCCLKCmd(ENABLE);
if (ERROR == RTC_WaitForSynchro())
return 88;

// F. enable second interrupt
//RTC_ITConfig(RTC_IT_TS, ENABLE);

// G. Set RTC prescaler: set RTC period to 1sec

RTC_InitTypeDef_Data.RTC_HourFormat = RTC_HourFormat_24;
RTC_InitTypeDef_Data.RTC_AsynchPrediv = 99;
RTC_InitTypeDef_Data.RTC_SynchPrediv = 319;
if(ERROR == RTC_Init(&RTC_InitTypeDef_Data))
return 233;



if (ERROR == RTC_WaitForSynchro())
return 100;

// I. set default time
default_time.RTC_Hours = DEFAULT_HOURS;
default_time.RTC_Minutes = DEFAULT_MINUTES;
default_time.RTC_Seconds = DEFAULT_SECONDS;
default_time.RTC_H12 = RTC_H12_PM;
if (ERROR == RTC_SetTime(RTC_Format_BIN, &default_time))
return 333;
if (ERROR == RTC_WaitForSynchro())
return 101;



default_data.RTC_WeekDay = DEFAULT_WEEKDAY;
default_data.RTC_Month = DEFAULT_MONTH;
default_data.RTC_Date = DEFAULT_DATE;
default_data.RTC_Year = DEFAULT_YEAR;
if (ERROR == RTC_SetDate(RTC_Format_BIN, &default_data))
return 334;
if (ERROR == RTC_WaitForSynchro())
return 102;



RTC_WriteBackupRegister(RTC_BKP_DR0, RTC_MAGIC);



PWR_BackupAccessCmd(DISABLE);



RCC_ClearFlag();

LOG(DEBUG_LOG, "RTC configured....");
return 0;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。