OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6794|回复: 6

STM32F030 库函数RTC初始化失败

[复制链接]

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
发表于 2017-10-16 09:22:31 | 显示全部楼层 |阅读模式
1金钱
STM32F0303C8T6 在使用RTC的过程中发现,概率性RTC初始化失败;但是LSE 是成功起振;
最终的原因是ISR寄存器的INTF 标志位写失败;

1.png

我用的是F0 V1.5的库函数;
发现 枚举类型RTC_Init;返回值是ERROR

/**
  * @brief  Initializes the RTC registers according to the specified parameters
  *         in RTC_InitStruct.
  * @param  RTC_InitStruct: pointer to a RTC_InitTypeDef structure that contains
  *         the configuration information for the RTC peripheral.
  * @note   The RTC Prescaler register is write protected and can be written in
  *         initialization mode only.  
  * @retval An ErrorStatus enumeration value:
  *          - SUCCESS: RTC registers are initialized
  *          - ERROR: RTC registers are not initialized  

  */
ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct)
{
  ErrorStatus status = ERROR;
  /* Check the parameters */
  assert_param(IS_RTC_HOUR_FORMAT(RTC_InitStruct->RTC_HourFormat));
  assert_param(IS_RTC_ASYNCH_PREDIV(RTC_InitStruct->RTC_AsynchPrediv));
  assert_param(IS_RTC_SYNCH_PREDIV(RTC_InitStruct->RTC_SynchPrediv));
  /* Disable the write protection for RTC registers */
  RTC->WPR = 0xCA;
  RTC->WPR = 0x53;
  /* Set Initialization mode */
  if (RTC_EnterInitMode() == ERROR)
  {
    status = ERROR;
  }
  else
  {
    /* Clear RTC CR FMT Bit */
    RTC->CR &= ((uint32_t)~(RTC_CR_FMT));
    /* Set RTC_CR register */
    RTC->CR |=  ((uint32_t)(RTC_InitStruct->RTC_HourFormat));
  
    /* Configure the RTC PRER */
    RTC->PRER = (uint32_t)(RTC_InitStruct->RTC_SynchPrediv);
    RTC->PRER |= (uint32_t)(RTC_InitStruct->RTC_AsynchPrediv << 16);
    /* Exit Initialization mode */
    RTC_ExitInitMode();
    status = SUCCESS;
  }
  /* Enable the write protection for RTC registers */
  RTC->WPR = 0xFF;
  return status;
}


最后附上 整个RTC初始化的代码;
RTC_InitTypeDef  RTC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,DISABLE);
PWR_BackupAccessCmd(DISABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);

/* Allow access to RTC */
PWR_BackupAccessCmd(ENABLE);
// RTC->WPR = 0x000000CA;
// RTC->WPR = 0x00000053;//取消写保护

RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == 0)
{
  //printf("\r\n LSE Error!");
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

RTC_DeInit();
  /* Calendar Configuration */
RTC_InitStructure.RTC_AsynchPrediv = 0x7f;//127
RTC_InitStructure.RTC_SynchPrediv = 0xFF;//255
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
RTC_Init(&RTC_InitStructure);//进入初始化模式,

//RTC->ISR |= RTC_ISR_INIT; //进入初始化模式
  //while (!(RTC->ISR | RTC_ISR_INITF));


RTC_DateInitStructure.RTC_Year = 17;
RTC_DateInitStructure.RTC_Month = 1;
RTC_DateInitStructure.RTC_Date = 1;
RTC_DateInitStructure.RTC_WeekDay = 5;
RTC_SetDate(RTC_Format_BIN,&RTC_DateInitStructure);

RTC_TimeInitStructure.RTC_H12 = RTC_H12_AM;
RTC_TimeInitStructure.RTC_Hours = 0;
RTC_TimeInitStructure.RTC_Minutes = 0;
RTC_TimeInitStructure.RTC_Seconds = 0;
RTC_SetTime(RTC_Format_BIN,&RTC_TimeInitStructure);//
RCC_RTCCLKCmd(ENABLE);//使能RTC

RTC_WaitForSynchro();//等待时钟同步


其实,关键我在想为什么是概率性的;
对其他方面也没什么影响,就是初始化的时间没写进去;
INTF标志位写入失败,到底是什么原因导致的







最佳答案

查看完整内容[请看2#楼]

有关系吧,我后来完全按照库DEMO写就没问题了
与其感慨路难行,不如马上出发
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
 楼主| 发表于 2017-10-16 09:22:32 | 显示全部楼层
依宝 发表于 2018-3-22 09:43
你好,想问一下,这个跟程序有关系吗?怎么修改?我也有这个问题

有关系吧,我后来完全按照库DEMO写就没问题了
与其感慨路难行,不如马上出发
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-9-28
在线时间
19 小时
发表于 2017-10-16 09:28:57 | 显示全部楼层
对于RTC初始化失败,考虑LSE是否起振,后备区域Vbat是否有供电。
回复

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
 楼主| 发表于 2017-10-17 09:00:35 | 显示全部楼层
lin993586486 发表于 2017-10-16 09:28
对于RTC初始化失败,考虑LSE是否起振,后备区域Vbat是否有供电。

LSE,起振成功;我修改了程序之后貌似又好了;还在观察中
与其感慨路难行,不如马上出发
回复

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2017-8-23
在线时间
34 小时
发表于 2018-3-22 09:43:21 | 显示全部楼层
xueshawu 发表于 2017-10-17 09:00
LSE,起振成功;我修改了程序之后貌似又好了;还在观察中

你好,想问一下,这个跟程序有关系吗?怎么修改?我也有这个问题
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-6-3
在线时间
5 小时
发表于 2019-7-9 21:54:29 | 显示全部楼层
你好,请问可以分享一下代码参考吗?我也要用相关的
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-5-13
在线时间
3 小时
发表于 2020-3-29 18:40:01 | 显示全部楼层
我也有碰到这个问题,我是使用LSI,断电重启后配置就失败,改用LSE后再改成LSI,就又好了,但一断电又不行了。具体怎么解决的?有范例吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 23:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表