Перейти к содержанию
    

STM32L Stop Mode

Всем доброго времени суток.

столкнулся с такой проблемой.

По смыслу задачи требуется сделать следующее:

Контроллер запускается, инициализирует всё что нужно, после этого переходит в Stop Mode with RTC. Просыпаться нужно по RTC таймеру, просыпается нормально. После этого выполняет нужные действия и снова надо засыпать.

И вот тут начинается проблема.

Для перехода в Stop mode я вызываю библиотечную функцию PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI). Так вот, в первый раз контроллер засыпает нормально, во второй - после вызова функции он просто отключается, как будто отключается питание. Происходит это после строчки __WFI() в функции PWR_EnterSTOPMode.

Что я делаю не так?

Спасибо всем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что бы выйти из STOP нужно сгенерить определенное прерывание.

Проверьте настройки RTC таймера, если он настроен на однократный режим нужно снова взвести курок в обработчике его прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да я уже что только ни пробовал. Выходил из stop mode и по таймеру, и по внешней линии - стопится и выходит нормально. Но только один раз. При втором входе в stop mode виснет намертво. Пробовал и с дебагом и без дебага. Результат один и тот же.

Может где-то есть какой-то флаг который надо куда-то сбросить, но я никак не пойму в чём дело.

 

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

Изменено пользователем T800

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

При возврате из STOP mode ядро переходит на тактирование от MSI RC. Нет каких то зависимостей в программе в плане инициализации или работы от тактирования?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При возврате я полностью повторяю процедуру инициализации, также как до первого входа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при настройке сбрасываете регистры в дефолт?

 

то есть иногда делают SET_REG |= 0x15; забывают что регистр равен 0, только после ресета, а если в ходе каких-то действий регистр смениться на 0x2A, то после этой строчки он будет не 0x15, а 0x3F.

 

Проверьте нет у вас чего-то подобного?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал после просыпания вообще не трогать инициализацию, оставил MSI, отключил дебаг.

Заработало!

Т.е. просыпается, пин переключает. Можно сказать проблема локализована. Почти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для отладки в STOP режиме нужно биты в служебном регистре выставить, о чем ранее писалось. Используйте поиск по форуму.

#if defined(DEBUG)
  DBGMCU_Config(DBGMCU_STOP, ENABLE);
#endif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Естественно у меня он был включен.

При этом в первый раз заходим в стоп - отладка работает, потом заходим ещё раз - уже не работает.

Заработало всё когда отключил режим отладки в стопе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какая модель микроконтроллера?

например в ерате на STM32L162xD/C/C-A

 

2.1.8 Debugging Stop mode with WFE entry

Description

When the Stop debug mode is enabled (DBG_STOP bit set in the DBGMCU_CR register)

this allows software debugging during Stop mode. However, if the application software uses

the WFE instruction to enter Stop mode, after wakeup some instructions could be missed if

the WFE is followed by sequential instructions. This affects only Stop debug mode with WFE

entry.

Workaround

To debug Stop mode with WFE entry, the WFE instruction must be inside a dedicated

function with 1 instruction (NOP) between the execution of the WFE and the Bx LR.

Example: __asm void _WFE(void) {

WFE

NOP

BX lr }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...