STM32F407VG Причина выхода из режима ожидания - флаг WUTF всегда установлен - PullRequest
1 голос
/ 11 ноября 2019

Я пишу приложение с низким энергопотреблением для STM32F407VG. Он переходит в режим ожидания и может активироваться двумя способами:

  • Периодически, используя таймер пробуждения RTC;
  • Нажатием кнопки, подключенной к выводу PA0-WKUP.

В зависимости от того, разбудило ли приложение RTC или кнопку, мне нужно выполнить две разные задачи. Поэтому, когда прошивка сбрасывается после выхода из режима ожидания, я должен выяснить причину активации (RTC или кнопка).

Я сделал необходимые конфигурации для выхода из режима ожидания из любого источникаи они работают - процессор периодически просыпается или когда я нажимаю кнопку. Проблема заключается в выяснении причины пробуждения.

Документация для WUTF регистра RTC_ISR гласит следующее:

Бит 10 WUTF: флаг таймера пробуждения

Thisфлаг устанавливается аппаратно, когда счетчик автоматической перезагрузки достигает 0.

Этот флаг сбрасывается программным обеспечением путем записи 0.

Этот флаг должен сбрасываться программным обеспечением как минимум за 1,5 периода RTCCLK доWUTF снова устанавливается на 1.

Это кажется мне идеальным - если флаг установлен, то это должно быть потому, что таймер включения достиг 0 и разбудил процессор.

Iвставил какой-то код в начале моей прошивки, чтобы прочитать WUTF и установить светодиод в соответствии с ним, а затем сразу же сбросить флажок. К сожалению, этот флаг всегда устанавливается, не только при выходе из режима ожидания из-за RTC, но также при пробуждении из-за кнопки и даже при первом включении цепи.

Я проверил список ошибок для этого MCU и не нашел упоминания об этой проблеме.

Я действительно понимаю, что обходной путь должен был бы прочитать состояние кнопки, и если это соответствует нажатому состоянию, предположим,причина пробуждения вызвана нажатием кнопки. Тем не менее, моя прошивка работает в течение всего лишь нескольких микросекунд в режиме работы, прежде чем вернуться в режим ожидания, и из-за проблем с отскоком с помощью кнопки, этот тип обнаружения не является надежным, если я не растяну время режима работы до нескольких микросекунд,Это, в свою очередь, влияет на среднее энергопотребление моего приложения (и, следовательно, время автономной работы). Хотя добавление конденсатора может помочь, я бы хотел реализовать программное решение, если это возможно.

1 Ответ

1 голос
/ 13 ноября 2019

Это было совсем плохо. Я читал флаг через следующий макрос HAL:

 __HAL_RTC_WAKEUPTIMER_GET_FLAG(&hRTC, RTC_FLAG_WUTF);

Оказывается, я использовал его до инициализации hRTC.Instance, поэтому вместо доступа к регистрам RTC он просто читал некоторую случайную память (вероятно,адрес 0). После исправления флаг работает надежно.

...