打印

在STM32F103C8T6上奇怪的RTC Alarm问题

[复制链接]
9355|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
只要执行过RTC_SetAlarm(alarm),后面的RTC_WaitForLastTask()函数就会陷入内部的死循环,RTOFF永远是0,这是什么原因呢?
……
RTC_SetAlarm(alarm);
RTC_WaitForLastTask();
……
在这之前已经配置好了系统时钟(8MHz, HSE)和RTC时钟源(LSE)及中断
已经验证过RTC正在运行(LSE工作正常),RTC_GetCounter()返回的秒计数没有问题。
程序中使用的固件库是3.3.0版
沙发
cool_coder|  楼主 | 2012-4-16 09:52 | 只看该作者
看来大家都没有遇到过?有过成功经验的也给分享一下吧,免得以后再有人走弯路。
如果我找到问题原因,会及时更新此贴,和大家分享。当然更希望能够在此得到高手的帮助。
再补充一点,测试程序是在固件库提供的模板上改的。

使用特权

评论回复
板凳
yixin1937| | 2012-4-16 10:08 | 只看该作者
我没有用过stm32的内库~ 都是自己写的库~我没有发现过这个问题~应该是那个步骤~你还没有闹对

使用特权

评论回复
地板
lut1lut| | 2012-4-16 11:41 | 只看该作者
STM32F1的固件库,最新V3.5.0。

LZ你从库里找一个RTC的例子跑一下,自己比较一下代码么。

使用特权

评论回复
5
cool_coder|  楼主 | 2012-4-16 13:52 | 只看该作者
我没有用过stm32的内库~ 都是自己写的库~我没有发现过这个问题~应该是那个步骤~你还没有闹对
yixin1937 发表于 2012-4-16 10:08
现在看起来肯定是这样的。非常感谢你提供的帮助。
我现在遇到的问题是什么条件下会造成这种后果一时难以确定,还没有理清头绪。

使用特权

评论回复
6
cool_coder|  楼主 | 2012-4-16 13:55 | 只看该作者
STM32F1的固件库,最新V3.5.0。

LZ你从库里找一个RTC的例子跑一下,自己比较一下代码么。
lut1lut 发表于 2012-4-16 11:41

V3.3.0和V3.5.0的固件库我都看过了,刚好缺少关于RTC Alarm相关的范例。现在我的测试程序里,RTC的初始化,秒中断等等都是正常的,就剩下Alarm这里没解决。

使用特权

评论回复
7
lut1lut| | 2012-4-16 16:00 | 只看该作者
RTC初始化代码里  

/* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

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

之类的配置过没有?

使用特权

评论回复
8
cool_coder|  楼主 | 2012-4-16 19:41 | 只看该作者
RTC初始化代码里  

/* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

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

之类的 ...
lut1lut 发表于 2012-4-16 16:00

lut1lut: 太感谢你了, 就是这个问题.
我的程序里把这两条语句写到InitRTC()里面了, 结果随着BKP_DR1取值的判断被略过了. 现在改成下面的样子, 可以正常调用RTC_SetAlarm()函数了. 不过我还有一点没弄明白: 为什么只有写alarm寄存器会出错呢?

使用特权

评论回复
9
cool_coder|  楼主 | 2012-4-16 19:42 | 只看该作者
唉, ST的网站真是慢啊, 晚上基本上打不开网页.

使用特权

评论回复
10
海东青电子| | 2013-11-19 17:58 | 只看该作者
cool_coder 发表于 2012-4-16 19:41
lut1lut: 太感谢你了, 就是这个问题.
我的程序里把这两条语句写到InitRTC()里面了, 结果随着BKP_DR1取值 ...

其实不止是SetAlarm(),所有针对RTC寄存器的设置都会出错,因为RTC在备份域、寄存器是挂在APB1总线上的,所以访问RTC寄存器需要2个先决条件:
1)APB1时钟使能
2)允许访问BKP区域,就是PWR_CR的 DPB 位需要置1。
这就是那2条语句的作用。

使用特权

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

本版积分规则

39

主题

1582

帖子

4

粉丝