前言:当使用ST-Link连接到目标并在IAR Embedded Workbench IDE中以调试模式进行评估时,这一切都在进行评估。
STM提供的标准外设库支持STM32F1中的实时时钟。我尝试使用RTC_SetCounter()将RTC设置为107301722,或者#34;星期六,2013年5月26日22:02:02 GMT&#34 ;.
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或更高版本的反汇编,则Config模式没有设置,因此RTC没有设置。
在尝试分析非调试设置中发生的事情时,我没有尝试过任何事情,因为我正在努力的一部分是涉及设置时间的单元测试。单元测试需要调试器附件。
这严格来说是调试器问题吗?是否有任何合理的理由来解释这种可能导致可行解决方案的行为?
答案 0 :(得分:2)
事实证明,我忽略了一个非常重要的功能,它允许当前的RTC寄存器操作无法完成:RTC_WaitForLastTask()。
/**
* @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是一个问题。