Предисловие: все это оценивается при подключении к цели с помощью ST-Link и в режиме отладки в IAR Embedded Workbench IDE.
Часы реального времени в STM32F1 поддерживаются стандартными библиотеками периферийных устройств, предоставляемыми STM. Я пытаюсь установить RTC на 107301722 или «Сб, 26 мая 2013 г., 22:02:02 по Гринвичу», используя RTC_SetCounter().
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 периферийное устройство должно войти в режим конфигурации. Это делается путем установки бита CNF в регистре RTC_CRL. "
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 не устанавливается.
Я ничего не пробовал в области анализа того, что происходит в неотладочной среде, просто потому, что частью того, над чем я работаю, является модульный тест, включающий установку времени. Для модульного теста потребуется подключение отладчика.
Это строго проблема отладчика? Существуют ли какие-либо рациональные причины для объяснения такого поведения, которые могли бы привести к работоспособному решению?