10274|39

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

RTC中的ALR寄存器复位时不保存,怎么回事 [复制链接]

在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();
}
……………………………………………………………………………..
此帖出自stm32/stm8论坛

最新回复

                                 这说明注意看手册是多么的重要,注意看手册可以少走很多弯路。   详情 回复 发表于 2009-3-17 13:58
点赞 关注
 

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

调试图如下,

                                 http://www.itmcu.com/taobao/01.jpg
此帖出自stm32/stm8论坛
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

贴片不成功?

http://www.itmcu.com/taobao/02.jpg
相关链接:http://www.itmcu.com/taobao/02.jpg
此帖出自stm32/stm8论坛
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 

贴图真麻烦


http://www.itmcu.com/taobao/03.jpg
相关链接:http://www.itmcu.com/taobao/03.jpg
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

5
 

。。

http://www.itmcu.com/taobao/04.jpg
相关链接:http://www.itmcu.com/taobao/04.jpg
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 

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

                                 通常这个复位键只是把PC指针设置到复位向量的值,在硬件信号上并没有产生复位信号。
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 

我就是按的硬件复位键

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

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 

手册上说了闹钟ALR可以保存吗?

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 

Not powered in standby mode

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 

可能是自己的程序清了吧?

现在C++ BUILDER还有新的吗?
6.0以后的好像没什么升级,那个BCB 2008、2009不知是啥来的?
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 

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

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

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

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 

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

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

13
 

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

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 

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

                                 跟CB就更没关系吧,用串口助手也是一样的效果,,
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

15
 

TO 香版主

你说的问题都不存在,

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

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

回复

89

帖子

0

TA的资源

一粒金砂(初级)

16
 

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

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

回复

68

帖子

0

TA的资源

一粒金砂(初级)

17
 

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

                                 到目前为止,还不知道你的硬件环境是什么。
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

18
 

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

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

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

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

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

回复

74

帖子

0

TA的资源

一粒金砂(初级)

19
 

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

                                 再说,如果我脱机运行也是同样问题啊,,
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

20
 

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

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

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表