前言:这一切都在使用 ST-Link 连接到目标并在 IAR Embedded Workbench IDE 中处于调试模式时进行评估。
STM32F1 中的实时时钟在 STM 提供的标准外设库中得到支持。我正在尝试使用 RTC_SetCounter() 将 RTC 设置为 107301722,或“周六,2013 年 5 月 26 日 22:02:02 GMT”。
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 位来完成的。 "
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 标志的位位置。
// 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。
我没有尝试过任何尝试分析在非调试设置中发生的事情,因为我正在努力的部分内容是涉及设置时间的单元测试。单元测试将需要调试器附件。
这严格来说是调试器问题吗?是否有任何合理的理由来解释这种可能导致可行解决方案的行为?