用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_first
time();
}
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;
}
查查看晶振有没有起振。
多谢多谢!
我就是怕不起振,换成了内部振荡器HSI,代码里检查时钟是否ok的地方过去了,死在了后面一步。。。。
一周热门 更多>