搜索
bottom↓
回复: 22

STM32 RTC应用 程序死在RTC_WaitForSynchro()函数中 晶振已经起振

[复制链接]

出0入0汤圆

发表于 2012-5-10 16:04:09 | 显示全部楼层 |阅读模式
已经使用了6pF的电容,且死机后测晶振管脚有32K波形。

出现的现象:
程序第一次上电时会配置RTC(RTC未配置过),此时程序正常运行。
当再次复位后,程序检查到RTC已经被配置过,执行 RTC_WaitForSynchro(); 函数,等待RTC时钟和中线时钟同步。程序就死在这个函数中。

很是疑惑。晶振都起振了,为什么会死在这里呢?
估计是我什么地方没有弄对,请大家指点下!

先谢过各位。

-----------------------------------------------------------------------------------

上电执行的初始化函数如下:
  1. void hal_rtc_init(void)
  2. {
  3.   uint32_t TempCnt = 0;
  4.   if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
  5.   {
  6.     /* Backup data register value is not correct or not yet programmed (when
  7.        the first time the program is executed) */
  8.     hal_debug_printf("RTC not yet configured....\r\n");

  9.     /* RTC Configuration */
  10.     hal_rtc_configuration();

  11.     TempCnt = ap_time_date2sec(&g_SysTime);

  12.     hal_rtc_timeset(TempCnt);

  13.     BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
  14.   }
  15.   else
  16.   {
  17.     /* Check if the Power On Reset flag is set */
  18.     if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
  19.     {
  20.       hal_debug_printf("Power On Reset occurred....\r\n");
  21.     }
  22.     /* Check if the Pin Reset flag is set */
  23.     else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
  24.     {
  25.       hal_debug_printf("External Reset occurred....\r\n");
  26.     }

  27.     hal_debug_printf("No need to configure RTC....\r\n");
  28.     /* Wait for RTC registers synchronization */
  29.     RTC_WaitForSynchro();

  30.     ap_time_sec2date(RTC_GetCounter(),&g_SysTime);//根据RTC计数器得到目前系统时间

  31.     /* Enable the RTC Second */
  32.     RTC_ITConfig(RTC_IT_SEC, ENABLE);

  33.     /* Wait until last write operation on RTC registers has finished */
  34.     RTC_WaitForLastTask();
  35.   }

  36. #ifdef RTCClockOutput_Enable
  37.   /* Enable PWR and BKP clocks */
  38.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  39.   /* Allow access to BKP Domain */
  40.   PWR_BackupAccessCmd(ENABLE);

  41.   /* Disable the Tamper Pin */
  42.   BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper
  43.                                  functionality must be disabled */

  44.   /* Enable RTC Clock Output on Tamper Pin */
  45.   BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
  46. #endif

  47.   /* Clear reset flags */
  48.   RCC_ClearFlag();

  49. }
复制代码
RTC的配置函数如下:
  1. u8 hal_rtc_configuration(void)
  2. {
  3.         u8 Temp=0;
  4.   
  5.   /* Enable PWR and BKP clocks */
  6.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  7.   /* Allow access to BKP Domain */
  8.   PWR_BackupAccessCmd(ENABLE);

  9.   /* Reset Backup Domain */
  10.   BKP_DeInit();
  11.   #warning 将外设BKP的全部寄存器重设为缺省值,该操作需要视应用情况而定

  12.   /* Enable LSE */
  13.   RCC_LSEConfig(RCC_LSE_ON);
  14.   /* Wait till LSE is ready */
  15.   while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  16.   {
  17.     Temp++;
  18.     delay_ms(10);
  19.   }
  20.   if(Temp>=250)return 1;//初始化时钟失败,晶振有问题     

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

  23.   /* Enable RTC Clock */
  24.   RCC_RTCCLKCmd(ENABLE);

  25.   /* Wait for RTC registers synchronization */
  26.   RTC_WaitForSynchro();

  27.   /* Wait until last write operation on RTC registers has finished */
  28.   RTC_WaitForLastTask();

  29.   /* Enable the RTC Second */
  30.   RTC_ITConfig(RTC_IT_SEC, ENABLE);

  31.   /* Wait until last write operation on RTC registers has finished */
  32.   RTC_WaitForLastTask();

  33.   /* Set RTC prescaler: set RTC period to 1sec */
  34.   RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  35.   /* Wait until last write operation on RTC registers has finished */
  36.   RTC_WaitForLastTask();
  37.   
  38.   return 0;
  39. }
复制代码

出0入0汤圆

发表于 2012-5-10 22:16:03 | 显示全部楼层
电池取下测试看看就知道,或是电池取下放入冰柜30分钟后装入测试看看

出0入0汤圆

发表于 2012-5-10 22:34:35 | 显示全部楼层
我现在用15pF的电容,圆柱体的晶振,能跑,加了电池。是不是如果把电池取下来之后,天气冷了就振不起来?如果把RTC的时钟改为8M晶振的分频,是否会不起振?

出0入30汤圆

发表于 2012-5-30 22:49:33 | 显示全部楼层
LZ问题解决了没?唉,我也碰到这个问题了。

出0入0汤圆

 楼主| 发表于 2012-6-6 08:53:49 | 显示全部楼层
lovelywwei 发表于 2012-5-30 22:49
LZ问题解决了没?唉,我也碰到这个问题了。

解决了。
请看这里 http://www.elecbench.com/?p=849

出0入0汤圆

发表于 2012-6-6 10:59:12 | 显示全部楼层
6pf是必要的,但不是必须的

出0入0汤圆

 楼主| 发表于 2012-6-7 10:30:01 | 显示全部楼层
soaringroc 发表于 2012-6-6 10:59
6pf是必要的,但不是必须的

恩,确实,我们试了不适用6pF也可工作,


但是!!数据手册上明确说了需要使用负载电容小于7pF的晶振。

出0入0汤圆

发表于 2012-7-20 09:37:17 | 显示全部楼层
问题还是没有解决

出0入0汤圆

发表于 2012-7-24 19:48:21 | 显示全部楼层
MARK,我也郁闷

出0入0汤圆

发表于 2012-8-28 11:56:24 | 显示全部楼层
gdmgb520 发表于 2012-6-6 08:53
解决了。
请看这里 http://www.elecbench.com/?p=849

LZ,链接打不开呀。可以详解一下怎么解决的吗?

出0入0汤圆

发表于 2012-8-28 14:29:01 | 显示全部楼层
我来转贴:
不论是否需要配置RTC寄存器,每次系统复位都需要执行如下操作:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_RTCCLKCmd(ENABLE);

出0入0汤圆

发表于 2012-8-28 14:50:21 | 显示全部楼层
请乖乖的使用6pF晶振+8pF或10pF电容。

出0入0汤圆

 楼主| 发表于 2012-8-30 14:40:17 | 显示全部楼层
skinzhan 发表于 2012-8-28 11:56
LZ,链接打不开呀。可以详解一下怎么解决的吗?

链接目前正常,欢迎访问我的博客 www.elecbench.com

该文内容如下:
----------------------------------------------------------------------------------
出现的现象:使用野火的RTC例程,在软件仿真时如果不需要配置,则程序会死在 RTC_WaitForSynchro() 函数中。而下载到硬件上时,有时候可以跑,有时候也会在该函数中死循环。

可能的原因:
首先,一定要确认是否使能了对后备寄存器和RTC的访问。
系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操
作。执行以下操作将使能对后备寄存器和RTC的访问:
● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问
PWR_BackupAccessCmd(ENABLE);
另外还要使能RTC时钟 RCC_RTCCLKCmd(ENABLE); 虽然该函数的说明中说只在RCC_RTCCLKConfig()函数调用之后才能调用,但是实际上如果不调用该函数,仿真时就会在 RTC_WaitForSynchro() 函数中死循环,等待RTC时钟同步。
也就是说,不论是否需要配置RTC寄存器,每次系统复位都需要执行如下操作:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_RTCCLKCmd(ENABLE);

其次,STM32的RTC对外部LSE要求比较高,最好使用负载电容为6pF的晶振。在芯片的DataSheet中有明确的说明,不能使用12.5pF的晶振。“ To avoid exceeding the maximum value of CL1 and CL2 (15 pF) it is strongly recommended to use a resonator with a load capacitance CL≤ 7 pF. Never use a resonator with a load
capacitance of 12.5 pF.”

出0入0汤圆

发表于 2012-11-28 18:07:21 | 显示全部楼层
我试了一下,还是不行,我用的是内部时钟

出0入0汤圆

发表于 2012-11-29 09:19:10 | 显示全部楼层
我把内部时钟再配置了一下就可以了

出0入0汤圆

 楼主| 发表于 2012-11-29 11:35:22 | 显示全部楼层
zishuangfei 发表于 2012-11-29 09:19
我把内部时钟再配置了一下就可以了

怎样配置的?
原因是什么?
能分享下吗?

出0入0汤圆

发表于 2012-12-3 13:20:29 | 显示全部楼层
gdmgb520 发表于 2012-11-29 11:35
怎样配置的?
原因是什么?
能分享下吗?

就是将RTC重新配置一下,不要配置BKP了,就可以了,不过我用的是内部时钟,我的RTC外部时钟还是不行,想换个独立的外部RTC

出0入0汤圆

发表于 2012-12-3 16:04:19 | 显示全部楼层
不关程序的事情。建议拿个热水袋捂一下就好了 天冷了 stm32也要多穿点衣服哦

出0入0汤圆

 楼主| 发表于 2012-12-4 08:40:19 | 显示全部楼层
zishuangfei 发表于 2012-12-3 13:20
就是将RTC重新配置一下,不要配置BKP了,就可以了,不过我用的是内部时钟,我的RTC外部时钟还是不行,想 ...

晶振有按要求用6pF的吗?

出0入0汤圆

发表于 2012-12-7 15:58:35 | 显示全部楼层
gdmgb520 发表于 2012-12-4 08:40
晶振有按要求用6pF的吗?

最好要,我现在不想用内部RTC了,老板可以,新板就不行,打算换外部独立RTC,我老板中,用12PF的都可以,我在广州,可能天气好。呵呵

出0入0汤圆

发表于 2012-12-20 03:14:34 | 显示全部楼层
问题解决了,,,,火哥威武………………

出0入0汤圆

发表于 2013-10-30 10:20:54 | 显示全部楼层
mark,楼上怎么解决的?

出0入0汤圆

发表于 2017-2-18 14:54:06 | 显示全部楼层
也碰到这个问题,请教大侠,有彻底解决的吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 05:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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