打印
[STM32F2]

STM32F2的备份寄存器和RTC可读不可写

[复制链接]
4193|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ticomi|  楼主 | 2014-5-13 19:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用F2的内部RTC和备份寄存器,初始化后遇到可以读出数据,但是不能写入数据。不知道什么原因?

下面是备份寄存器的初始化代码:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                                //开启Backp_Sram电源
  
  PWR_BackupAccessCmd(ENABLE);                                                                                                                        //允许操作备份寄存器       
  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);                //开启backup SRAM时钟
              
        PWR_BackupRegulatorCmd(ENABLE);                                                                                                                //开启Backup SRAM  
  
  // Wait until the Backup SRAM low power Regulator is ready
  while(PWR_GetFlagStatus(PWR_FLAG_BRR) == RESET)
  {
  }

这个应该是可以读写的,还有可以关闭读写的代码?

谢谢!
沙发
airwill| | 2014-5-13 20:33 | 只看该作者
楼主看看, 是不是跟这个有关哦

RTC register write protection
After power-on reset, all the RTC registers are write-protected. Writing to the RTC registers is enabled by writing a key into the Write Protection register, RTC_WPR. The following steps are required to unlock the write protection on all the RTC registers except for RTC_ISR[13:8], RTC_TAFCR, and RTC_BKPxR.
1. Write ‘0xCA’ into the RTC_WPR register.
2. Write ‘0x53’ into the RTC_WPR register.
Writing a wrong key reactivates the write protection. The protection mechanism is not affected by system reset.

使用特权

评论回复
板凳
ticomi|  楼主 | 2014-5-14 11:35 | 只看该作者
airwill 发表于 2014-5-13 20:33
楼主看看, 是不是跟这个有关哦

RTC register write protection

你好,谢谢。
不是这个问题,每次写的时候已经自动将其设置为写保护关闭,我测试了下,同样的代码在IAR下是不能正常写入的,而在KEIL下是可以正常的,初步怀疑是IAR的问题造成的。现在不能切换会KEIL开发工具了。

不知道有没有人遇到这样的问题,很郁闷!

使用特权

评论回复
地板
airwill| | 2014-5-14 11:54 | 只看该作者
那也许和代码优化有关.
我一般遇到实在搞不定的问题时, 打开调试窗口的 Disassembly 窗口看指令执行过程

使用特权

评论回复
5
ticomi|  楼主 | 2014-5-14 12:36 | 只看该作者
airwill 发表于 2014-5-14 11:54
那也许和代码优化有关.
我一般遇到实在搞不定的问题时, 打开调试窗口的 Disassembly 窗口看指令执行过程 ...

你好,我发现这样一个问题向你请教:

在设置时间时需要将RTC解锁:即RTC_WPR寄存器写入OXCA然后再写入0X53指令,我的理解应该是对同一个地址进行写操作,但是汇编看到的是三个地址:

写0xCA的是0x80052E0
写0x53的是0x80052e8

最后上锁的的数据0xFF写入的是0x800531A

这个怎么解决,我对汇编不太理解的,非常感谢!

使用特权

评论回复
6
airwill| | 2014-5-14 12:55 | 只看该作者
看来你对汇编真的不了解

RTC_WPR寄存器写入通常是这样的指令.
STR      r0,[r1]
数据在 R0 里, 地址在 R1 里.
对汇编还是要适当了解一下哦.

使用特权

评论回复
7
ticomi|  楼主 | 2014-5-14 13:09 | 只看该作者
airwill 发表于 2014-5-14 12:55
看来你对汇编真的不了解

RTC_WPR寄存器写入通常是这样的指令.

你好,非常感谢!

是向同一个地址里写的数据:0x8001180 但是结果还是不能写入数据,不知道为什么?

使用特权

评论回复
8
ticomi|  楼主 | 2014-5-14 13:16 | 只看该作者
airwill 发表于 2014-5-14 12:55
看来你对汇编真的不了解

RTC_WPR寄存器写入通常是这样的指令.

(RTC_EnterInitMode()这个函数返回错误,不能Init RTC->ISR 寄存器

使用特权

评论回复
9
ticomi|  楼主 | 2014-5-14 17:37 | 只看该作者
找到原因了,初始化RTC之前,执行了这个 RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE) 函数,导致RTC只能读取,不能写入!

使用特权

评论回复
10
zxm19820916| | 2014-6-11 18:23 | 只看该作者
难道不应该先执行这个函数吗?

使用特权

评论回复
11
ticomi|  楼主 | 2014-6-11 18:59 | 只看该作者
zxm19820916 发表于 2014-6-11 18:23
难道不应该先执行这个函数吗?

我现在也不确定什么原因,现在是RTC能正常工作了,但是仍然有问题,所以我还需要再看下具体的原因。

使用特权

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

本版积分规则

50

主题

852

帖子

4

粉丝