打印

STM32 RTC 对晶振的要求实在不地道

[复制链接]
楼主: zhwxc
手机看帖
扫描二维码
随时随地手机跟帖
21
liuyang219| | 2008-9-16 17:18 | 只看该作者 回帖奖励 |倒序浏览

第一次看到晶体和电容还有这么大关系,学习!!

使用特权

评论回复
22
eddia2000| | 2008-9-20 13:07 | 只看该作者

32.768K晶体6p比12.5p主要是起振时间要短

我用的是12.5P的晶振,也老是出现上电赶振难的问题.原来想换6P的,但是太难找.通达了解晶振参数.12.5P的晶振赶振到稳定比6P的晶振所需时间长.
而是我对RTC的初始化作而下调整:
这是Keil中RTC例程上修改
/*******************************************************************************
* Function Name  : RTC_Configuration
* Description    : Configures the RTC.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RTC_Configuration(void)
{
  /* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  
  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);

  /* Reset Backup Domain */
  BKP_DeInit();

  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }

  /* Select LSE as RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

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

  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro();

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* Enable the RTC Second */
  RTC_ITConfig(RTC_IT_SEC, ENABLE);

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* Set RTC prescaler: set RTC period to 1sec */
  RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
  
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
}
将/* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }
改动为:
  u32 delay;
  do
  {
      for(delay = 0;delay < 90000;delay++);
      RCC_LSEConfig(RCC_LSE_ON);
  }while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

现已很好的工作了.已测试好几天从没有再发生上电难振,每次都可以OK.但改回原来的方式则问题又再出现,大家可以试一试.

使用特权

评论回复
23
eddia2000| | 2008-9-20 13:15 | 只看该作者

12.5p晶振启动时间比6P的长可能才是主要的原因

使用特权

评论回复
24
eddia2000| | 2008-9-20 13:28 | 只看该作者

12.5p晶振启动时间比6P的长可能才是主要的原因

我的板上32.768K晶振(12.5P)也老是出现上电起振难的问题.看到楼主讲主换6P的,我找不到,后来想到也许是12.5P的晶振起动时所需时间要比6P的长,我对RTC的初始化作了一点改动...
这是KEIL RTC例程中的:

/*******************************************************************************
* Function Name  : RTC_Configuration
* Description    : Configures the RTC.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RTC_Configuration(void)
{
  /* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  
  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);

  /* Reset Backup Domain */
  BKP_DeInit();

  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }

  /* Select LSE as RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

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

  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro();

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* Enable the RTC Second */
  RTC_ITConfig(RTC_IT_SEC, ENABLE);

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* Set RTC prescaler: set RTC period to 1sec */
  RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
  
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
}

上上代码中的" /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }
"
改为:
  u32 delay;
  
  do
  {
       /* delay about 10ms */
      for(delay = 0;delay < 90000;delay++);
       /* Enable LSE */
      RCC_LSEConfig(RCC_LSE_ON);
  }while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) /* Wait till LSE is ready */

后测试1000次以上都没有上电赶振难发现.但改回原来又好易发生.
大家也可以试试此法是否对你有用.  

使用特权

评论回复
25
eddia2000| | 2008-9-20 13:31 | 只看该作者

同感

使用特权

评论回复
26
| | 2008-9-20 13:56 | 只看该作者

RTC我的产品必须用....看来还的慎重...

使用特权

评论回复
27
sheepbaa| | 2008-9-24 08:52 | 只看该作者

嗯...

希望芯片不要对外部器件要求过高.

使用特权

评论回复
28
栏杆| | 2008-10-8 10:55 | 只看该作者

嗯,谢谢LZ发现这个事情。

好就没来了,不少的进步啊。 

香版和ST工程师沟通得咋样了? 回个话吧。

使用特权

评论回复
29
香水城| | 2008-10-8 11:13 | 只看该作者

此限制是由于所用的芯片工艺所致,没有什么特别之处

鉴于2P<CL<7P的晶振与其它晶振在成本上没有明显的差别,此项限制并不会对用户产生成本负担。

使用特权

评论回复
30
栏杆| | 2008-10-8 11:31 | 只看该作者

力源板子上焊下来测了一下

分别是10P 和22p.(电桥测的)

为什么会这样! 8M的就是13P的。LS很多同仁说道:关键是买家就拿13P的说是6P的,哪又咋办? 或者根本就不知道。特别是去采购的人,这玩意又没个型号区别----绝大多数单位是无法直接从EPSON拿晶体的!!

使用特权

评论回复
31
wjxwjx| | 2008-10-9 12:47 | 只看该作者

做个标记,以备查阅!

使用特权

评论回复
32
ijk| | 2008-10-9 13:12 | 只看该作者

从EPSON拿晶体

  为什么要从EPSON拿晶体?国产也有符合这样要求的晶体:7pF,13pF,...

使用特权

评论回复
33
simon87155| | 2008-10-9 14:56 | 只看该作者

STM32有事你说话

我们是ST的代理,已与多家STM32客人在合作,经验丰富,可以提供你需要的帮助,需要在STM32上了解的请与我联系,谢谢!

邓世宏 
Simon Deng
  文晔集团/庆成企业有限公司
*************************************************************************************
地址:深圳南山区科技园**区南区南一道创维大厦C区3楼
TEL:0755-2674 3880 转6139   FAX:0755-2674 4053
M/P:13602587155
E-mail: simon.deng@wtmec.com
Http: www.qce.co.hk    www.wtmec.com
MSN: Sac87155@hotmail.com
Skype: pcicsz

使用特权

评论回复
34
mytempid| | 2008-10-10 09:08 | 只看该作者

to eddia2000同学

按照eddia2000同学的指点,上电后循环启动RTC晶振,并加延时500ms,如下
  unsigned char err_cnt;

  err_cnt = 0;
  do
  {
      RCC_LSEConfig(RCC_LSE_ON);
       /* delay about 500ms */
      delay (500);
      if (err_cnt++ > 20)
          break;  // rtc时钟启动出错
  } while (RCC_GetFlagStatus (RCC_FLAG_LSERDY) == RESET);

目前
测试样本:1份
测试次数:约50次
测试结果:正常。

注:
1、测试中发现,rtc启动时间有时会超过100ms。
2、样本rtc使用12pF晶振,按例程运行时有无法启动现象。

使用特权

评论回复
35
zz2513| | 2008-10-13 13:34 | 只看该作者

STM32 RTC 对晶振的要求实在不地道

……学习了!

使用特权

评论回复
36
lucky_000| | 2008-10-25 13:39 | 只看该作者

我用的是最普通的圆柱体的晶振

用手放到晶振的腿上, 秒定时中断就进不了, 怀疑是晶振停振了, 不知道你们有没有碰到过这个情况

使用特权

评论回复
37
makesoft| | 2008-10-26 11:19 | 只看该作者

呵呵,不仅仅腿上,拿着壳也一样停

建议谁弄一批6P的钟振到这个论坛上销售,一定畅销的

使用特权

评论回复
38
freefish| | 2008-11-10 22:28 | 只看该作者

贵得没边

乘兴而去,败兴而归,贵得没边了。比如AD7656,要400,还是抢银行好了。

使用特权

评论回复
39
psr| | 2009-1-14 08:37 | 只看该作者

抛砖:AVR042: AVR Hardware Design Considerations

听说象STM32这样低功耗的片子,起振都是要小心考虑的,对32768频率,最主要还是晶振的选择。

我觉得ST开发人员应该知道究竟是什么原因,所以在此抛砖引玉吧!

使用特权

评论回复
40
LiangXinJi| | 2009-9-21 09:09 | 只看该作者
这样真的挺不好的!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则