STM32F1 RTC_EnterConfigMode не всегда устанавливает режим конфигурации

Предисловие: все это оценивается при подключении к цели с помощью 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 не устанавливается.

Я ничего не пробовал в области анализа того, что происходит в неотладочной среде, просто потому, что частью того, над чем я работаю, является модульный тест, включающий установку времени. Для модульного теста потребуется подключение отладчика.

Это строго проблема отладчика? Существуют ли какие-либо рациональные причины для объяснения такого поведения, которые могли бы привести к работоспособному решению?


person natille    schedule 27.03.2014    source источник


Ответы (1)


Выяснилось, что я упустил из виду очень важную функцию, позволяющую завершить незавершенные текущие действия регистра 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 является проблемой.

person natille    schedule 28.03.2014