用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;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
tianhua23
1楼-- · 2019-07-14 21:51
回复第 2 楼 于2014-07-04 20:40:15发表:
查查看晶振有没有起振。 

多谢多谢!
我就是怕不起振,换成了内部振荡器HSI,代码里检查时钟是否ok的地方过去了,死在了后面一步。。。。
gungmng
2楼-- · 2019-07-14 23:44
勘误手册中提到了,RTC晶振在潮湿的情况下会不起振,pcb设计的时候需要特殊关注,还要加辅助起振的电阻。lse晶振一定要选7pf的。勘误手册上有。我用103做开发的时候遇到过这个问题。
gungmng
3楼-- · 2019-07-15 04:04
 精彩回答 2  元偷偷看……
gungmng
4楼-- · 2019-07-15 04:35
看错了,呵呵 你用的lsi呀 不好意思
Sabrina_cc
5楼-- · 2019-07-15 07:55
是时钟还没稳定就使能吧
阿什顿信道
6楼-- · 2019-07-15 10:01
启动主要看晶振..

一周热门 更多>