打印

RTC中的ALR寄存器复位时不保存,怎么回事

[复制链接]
5003|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
E精灵小店|  楼主 | 2009-2-18 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在RTC调试过程中,出现ALR寄存器数据复位不保存的情况,而CNT可以保存.按手册上讲,这两个寄存器都在后备域中,在未发生后备域复位的情况下,这些数据应该不保存才对啊,而现在ALR不保存,CNT却可以,这是为何??以下先贴初始化程序,后贴图,望有人能解决及回答.

程序如下 :
main()
{     
    u32 temp;

    RCC_init();    
    Gpio_int();    
     Usart_int();
    BKP_init();
    Timer_init();
    NVIC_init();
     
    USART_Start_Recieive(USART1,USART1_datas);  

      while(1)
…………………………………………………………….

void BKP_init(void)
{
  /* Enable PWR and BKP clocks */ 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  
  /* Allow access to BKP Domain in order to enable rtc registers*/
  PWR_BackupAccessCmd(ENABLE);     
    
  /* Clear Tamper pin Event(TE) pending flag */
  BKP_ClearFlag();
                      
  /* Enable Tamper pin */
  BKP_TamperPinCmd(DISABLE);
   
  if(BKP_ReadBackupRegister(BKP_DR1) != 0xA6A7)
  {    /* Backup data register value is not correct or not yet programmed (when
       the first time the program is executed) */

    /* RTC Configuration */
    GPIO_CPLBits(GPIOC,GPIO_Pin_6);
    RTC_init();
    RTC_WaitForLastTask(); RTC_SetAlarm(80);    RTC_WaitForLastTask();   
    BKP_WriteBackupRegister(BKP_DR1, 0xA6A7);
  }
  else
  {
    /* Wait for RTC registers synchronization */
    RTC_WaitForLastTask(); 
    //RTC_SetAlarm(BKP_ReadBackupRegister(BKP_DR2));    
    RTC_WaitForLastTask(); 

    RTC_WaitForSynchro();    

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

void RTC_init(void)
{
   /* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  
  /* Allow access to BKP Domain in order to enable rtc registers*/
  PWR_BackupAccessCmd(ENABLE);

  //Reset Backup Domain,此执令会将备份域数据清零,建议初始化时屏蔽掉
  BKP_DeInit();

  #ifdef RTCClockSource_LSI       
  RCC_LSICmd(ENABLE);    /* Enable LSI */     
  while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);  /* Wait till LSI is ready */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* Select LSI as RTC Clock Source */ 
  
  #elif defined    RTCClockSource_LSE  
  RCC_LSEConfig(RCC_LSE_ON);  /* Enable LSE */
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);   /* Wait till LSE is ready */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);/* Select LSE as RTC Clock Source */  
  #endif

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

  #ifdef RTCClockOutput_Enable  
  /* Disable the Tamper Pin */
  BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper
                               functionality must be disabled */
  BKP_RTCCalibrationClockOutputCmd(ENABLE);    /* Enable RTC Clock Output on Tamper Pin */
  #endif 

  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro();
  RTC_WaitForLastTask();
  /* Enable the RTC Second */  
  RTC_ITConfig(RTC_IT_SEC, ENABLE);

  
  /* Set RTC prescaler: set RTC period to 1sec */
  #ifdef RTCClockSource_LSI
  RTC_SetPrescaler(39999); /* RTC period = RTCCLK/RTC_PR = (40.000 KHz)/(39999+1) */
  #elif defined    RTCClockSource_LSE
  RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
  #endif
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
}
……………………………………………………………………………..
沙发
E精灵小店|  楼主 | 2009-2-18 11:32 | 只看该作者

调试图如下,

http://www.itmcu.com/taobao/01.jpg

使用特权

评论回复
板凳
E精灵小店|  楼主 | 2009-2-18 11:38 | 只看该作者

贴片不成功?

http://www.itmcu.com/taobao/02.jpg
相关链接:http://www.itmcu.com/taobao/02.jpg

使用特权

评论回复
地板
E精灵小店|  楼主 | 2009-2-18 11:44 | 只看该作者

贴图真麻烦


http://www.itmcu.com/taobao/03.jpg
相关链接:http://www.itmcu.com/taobao/03.jpg

使用特权

评论回复
5
E精灵小店|  楼主 | 2009-2-18 11:53 | 只看该作者

。。

http://www.itmcu.com/taobao/04.jpg
相关链接:http://www.itmcu.com/taobao/04.jpg

使用特权

评论回复
6
香水城| | 2009-2-18 12:15 | 只看该作者

请注意,调试软件上的复位键不能产生硬件复位

通常这个复位键只是把PC指针设置到复位向量的值,在硬件信号上并没有产生复位信号。

使用特权

评论回复
7
E精灵小店|  楼主 | 2009-2-18 16:41 | 只看该作者

我就是按的硬件复位键

我按的是开发板上的复位键,程序自动停在第一条语句中, 
不仿真连续运行时,按复位键,也是只有CNT保存,LAR不保存。
无论怎样,都无法保证LAR寄存器。。。除非在BKP域里单独做保存和上电读取,,但这根本没有解决问题,,

使用特权

评论回复
8
香水城| | 2009-2-18 17:15 | 只看该作者

我看不出你的RTC时钟使用的是LSI还是LSE

而且从你贴出的程序段看,你并没有判断RTC是否已经初始化过,每次程序从main开始运行时都要初始化RTC,这可能是一个重要的原因。

正确的做法是,程序从main开始运行后,应该先判断RTC是否曾经在上次断电之前已经初始化了,如果已经初始化好,不必再做;如果不曾初始化,才执行初始化。

使用特权

评论回复
9
E精灵小店|  楼主 | 2009-2-18 19:47 | 只看该作者

RTC肯定没问题啊,不然时钟怎么走起,

使用特权

评论回复
10
E精灵小店|  楼主 | 2009-2-18 19:47 | 只看该作者

再说CNT是保存的起的,而且闹钟时间到的时候也可以闹的啊

使用特权

评论回复
11
E精灵小店|  楼主 | 2009-2-18 19:51 | 只看该作者

我觉得RTC选什么时钟无所谓啊,只要运行的起就行。

跟CB就更没关系吧,用串口助手也是一样的效果,,

使用特权

评论回复
12
E精灵小店|  楼主 | 2009-2-18 19:56 | 只看该作者

TO 香版主

你说的问题都不存在,

而且从你贴出的程序段看,你并没有判断RTC是否已经初始化过,每次程序从main开始运行时都要初始化RTC,这可能是一个重要的原因。

正确的做法是,程序从main开始运行后,应该先判断RTC是否曾经在上次断电之前已经初始化了,如果已经初始化好,不必再做;如果不曾初始化,才执行初始化。”
这个我做了啊,BKP初始化不就是吗?主程序并没有运行RTC初始化,而是运行的BKP,RTC的初始化在BKP初始化中,
无论怎么CNT没问题,ALR有问题,我感觉是芯片不稳定,,,

使用特权

评论回复
13
香水城| | 2009-2-18 21:52 | 只看该作者

如果你怀疑芯片有问题,我们也不必再讨论了

请写一个最简单的程序,只包括你认为有问题的部分,这个程序能够重现你说的问题,然后发上来我们测试一下,谢谢。

使用特权

评论回复
14
香水城| | 2009-2-18 22:33 | 只看该作者

请发上来重现错误的程序同时,把你的线路图发上来

到目前为止,还不知道你的硬件环境是什么。

使用特权

评论回复
15
香水城| | 2009-2-18 22:45 | 只看该作者

再次看了一下楼主的贴图,感觉你的论据有问题

回顾楼主的几张贴图,你的论据是:当按RST键后,程序停止回到main的开始部分,此时没有执行任何初始化,然后在RTC的寄存器窗口察看RTC的寄存器内容,发现ALR寄存器不是你写入的数据。

如果我上面的理解正确,我只能说你这个论据有问题!

请看STM32参考手册中的描述,读取RTC的内容时,必须保证APB1时钟处于开启状态,如果刚刚开启APB1时钟,则必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1。

但是,当你按下RST键后,你的APB1时钟是否还在正常运行?RTC_CRL寄存器中的RSF位是否已被置1?如果答案是否定的,RTC的寄存器窗口中的内容还有意义吗?

使用特权

评论回复
16
E精灵小店|  楼主 | 2009-2-19 14:35 | 只看该作者

那为什么CNT的数据没问题呢?

再说,如果我脱机运行也是同样问题啊,,

使用特权

评论回复
17
E精灵小店|  楼主 | 2009-2-19 14:43 | 只看该作者

无论什么理由,CNT与ALR寄存器应该保持最后一次的数据?

我用的优易特的EDU开发板
也没用到什么资源,就是串口和内部RTC,内部RTC是运行正常的,因为上下位机同步OK,串口就更没问题了,
调试是这样的:
用仿真器(USB供电)JTAG调试开发板,开发板的串口接电脑串口,MDKG下编程调试程序。
两种情况:
不仿真时:上下位机只要不复位,闹钟,时间等可同步,数据也同步,也正确。但一按到硬件复位键时,上位机读取下位机数据,此时时间正确,闹钟复位。
仿真时:连续运行情况下,上下位机只要不复位,闹钟,时间等可同步,数据也同步,也正确,但一按到硬件复位时,上位机自动停止运行,进行主程序第一条语句,此时CNT数据正确,ALR复位。
无论如何,都不行。两种情况,相同结果。

使用特权

评论回复
18
E精灵小店|  楼主 | 2009-2-19 14:48 | 只看该作者

发个源程序!

使用特权

评论回复
19
E精灵小店|  楼主 | 2009-2-19 14:50 | 只看该作者

上位机程序及协议

使用特权

评论回复
20
E精灵小店|  楼主 | 2009-2-19 14:51 | 只看该作者

协议

使用特权

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

本版积分规则

5

主题

77

帖子

0

粉丝