首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F1 RTC_EnterConfigMode并不总是设置Config模式

STM32F1 RTC_EnterConfigMode并不总是设置Config模式
EN

Stack Overflow用户
提问于 2014-03-27 23:00:01
回答 1查看 976关注 0票数 2

前言:在IAR嵌入式工作台IDE中,当使用ST链接和调试模式连接到目标时,所有这些都会被评估。

STM提供的标准外围库支持STM32F1中的实时时钟。我正尝试使用RTC_SetCounter()将RTC设置为107301722,或称"Sat,2013年5月26日22:02:02格林尼治时间“。

代码语言:javascript
复制
void RTC_SetCounter(uint32_t CounterValue) /*From Std Periph Lib */
{ 
  RTC_EnterConfigMode();
  /* Set RTC COUNTER MSB word */
  RTC->CNTH = CounterValue >> 16;
  /* Set RTC COUNTER LSB word */
  RTC->CNTL = (CounterValue & RTC_LSB_MASK);
  RTC_ExitConfigMode();
}

注意,它调用RTC_EnterConfigMode(),这是修改RTC寄存器值的必要条件:“要在RTC_PRL、RTC_CNT、RTC_ALR寄存器中写入,外围设备必须进入配置模式。这是通过在RTC_CRL寄存器中设置CNF位来完成的。”

代码语言:javascript
复制
void RTC_EnterConfigMode(void) /*From Std Periph Lib */
{
  /* Set the CNF flag to enter in the Configuration Mode */
  RTC->CRL |= RTC_CRL_CNF;
}

这是输入配置模式的代码。很简单。下面是反汇编(没有启用优化)。0x10是CNF标志的位位置。

代码语言:javascript
复制
//  RTC->CRL |= RTC_CRL_CNF;
RTC_EnterConfigMode:
    0x8053ed6: 0x4829         LDR.N     R0, ??DataTable13_1     ; RTC_CRL
    0x8053ed8: 0x8800         LDRH      R0, [R0]
    0x8053eda: 0xf050 0x0010  ORRS.W    R0, R0, #16             ; 0x10
    0x8053ede: 0x4927         LDR.N     R1, ??DataTable13_1     ; RTC_CRL
    0x8053ee0: 0x8008         STRH      R0, [R1]
//}
    0x8053ee2: 0x4770         BX        LR

我发现,如果从对RTC_SetCounter()的调用中断到0x8053ee0行的反汇编,就会启用Config Mode,但是如果我将断点移动到行0x8053ee2或更高版本的反汇编,则Config Mode不会被设置,因此RTC不会被设置。

在试图分析非调试设置中所发生的事情方面,我没有尝试过任何事情,仅仅因为我所做的工作的一部分是一个涉及设置时间的单元测试。单元测试将需要调试器附件。

这严格地说是调试器问题吗?是否有任何合理的理由来解释这种行为,从而导致一个可行的解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-28 13:58:23

结果,我忽略了一个非常重要的函数,它是为了允许当前的RTC注册操作完成而提供的: RTC_WaitForLastTask()。

代码语言:javascript
复制
/**
  * @brief  Waits until last write operation on RTC registers has finished.
  * @note   This function must be called before any write to RTC registers.
  * @param  None
  * @retval None
  */
void RTC_WaitForLastTask(void)
{
  /* Loop until RTOFF flag is set */
  while ((RTC->CRL & RTC_FLAG_RTOFF) == (uint16_t)RESET)
  {
  }
}

如果我更多地关注在RTC_CRL中设置的其他寄存器标志,我可能已经注意到RTOFF是一个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22701003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档