Debugging STM32F1 RTC_EnterConfigMode不总是设置配置模式

Debugging STM32F1 RTC_EnterConfigMode不总是设置配置模式,debugging,stm32,rtc,iar,real-time-clock,Debugging,Stm32,Rtc,Iar,Real Time Clock,前言:在IAR Embedded Workbench IDE中,当使用ST链接连接到目标并处于调试模式时,将对所有这些进行评估 STM提供的标准外设库支持STM32F1中的实时时钟。我正在尝试使用RTC_SetCounter()将RTC设置为107301722,或“2013年5月26日星期六22:02:02 GMT” 请注意,它调用RTC_EnterConfigMode(),这是修改RTC寄存器值的要求:“要写入RTC_PRL、RTC_CNT、RTC_ALR寄存器,外围设备必须进入配置模式。这是

前言:在IAR Embedded Workbench IDE中,当使用ST链接连接到目标并处于调试模式时,将对所有这些进行评估

STM提供的标准外设库支持STM32F1中的实时时钟。我正在尝试使用RTC_SetCounter()将RTC设置为107301722,或“2013年5月26日星期六22:02:02 GMT”

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

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

//  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行的反汇编的任何地方,配置模式将被启用,但如果我将断点移动到第0x8053ee2行或更高版本的反汇编,则配置模式不会被设置,因此RTC不会被设置

在分析非调试设置中发生的情况方面,我没有尝试过任何东西,因为我正在进行的部分工作是涉及设置时间的单元测试。单元测试将需要调试器附件


这完全是一个调试器问题吗?是否有任何合理的理由来解释这种行为,从而得出可行的解决方案?

结果是,我忽略了一个非常重要的函数,该函数用于允许当前未完成的RTC注册操作完成:RTC_WaitForLastTask()

如果我更加注意RTC_CRL中设置的其他寄存器标志,我可能会注意到RTOFF是一个问题

void RTC_EnterConfigMode(void) /*From Std Periph Lib */
{
  /* Set the CNF flag to enter in the Configuration Mode */
  RTC->CRL |= RTC_CRL_CNF;
}
//  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
/**
  * @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)
  {
  }
}