Полная версия этой страницы:
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 и всё благополучно виснет.
Zeal0t
Oct 15 2014, 05:22
Цитата(T800 @ Oct 14 2014, 17:17)

Как это выглядит у меня. После функции PWR_EnterSTOPMode ничего не выполняется, программа ждёт прерывания (в моём случае внешняя линия или RTC timer) для выхода из стоп режима. Потом происходит нужное событие, запускается обработчик прерывания и программа возвращается туда где остановилась. Потом она по циклу приходит опять к PWR_EnterSTOPMode и всё благополучно виснет.
При возврате из STOP mode ядро переходит на тактирование от MSI RC. Нет каких то зависимостей в программе в плане инициализации или работы от тактирования?
При возврате я полностью повторяю процедуру инициализации, также как до первого входа.
Golikov A.
Oct 15 2014, 08:30
при настройке сбрасываете регистры в дефолт?
то есть иногда делают 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 }
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.