|
|
  |
STM32L Stop Mode, Непонятная проблема |
|
|
|
Oct 13 2014, 06:25
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-12-13
Пользователь №: 79 453

|
Всем доброго времени суток. столкнулся с такой проблемой. По смыслу задачи требуется сделать следующее: Контроллер запускается, инициализирует всё что нужно, после этого переходит в Stop Mode with RTC. Просыпаться нужно по RTC таймеру, просыпается нормально. После этого выполняет нужные действия и снова надо засыпать. И вот тут начинается проблема. Для перехода в Stop mode я вызываю библиотечную функцию PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI). Так вот, в первый раз контроллер засыпает нормально, во второй - после вызова функции он просто отключается, как будто отключается питание. Происходит это после строчки __WFI() в функции PWR_EnterSTOPMode. Что я делаю не так? Спасибо всем.
|
|
|
|
|
Oct 14 2014, 13:17
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-12-13
Пользователь №: 79 453

|
Да я уже что только ни пробовал. Выходил из stop mode и по таймеру, и по внешней линии - стопится и выходит нормально. Но только один раз. При втором входе в stop mode виснет намертво. Пробовал и с дебагом и без дебага. Результат один и тот же. Может где-то есть какой-то флаг который надо куда-то сбросить, но я никак не пойму в чём дело.
Не совсем понял про прерывание. Как это выглядит у меня. После функции PWR_EnterSTOPMode ничего не выполняется, программа ждёт прерывания (в моём случае внешняя линия или RTC timer) для выхода из стоп режима. Потом происходит нужное событие, запускается обработчик прерывания и программа возвращается туда где остановилась. Потом она по циклу приходит опять к PWR_EnterSTOPMode и всё благополучно виснет.
Сообщение отредактировал T800 - Oct 14 2014, 13:24
|
|
|
|
|
Oct 15 2014, 05:22
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 28-06-13
Пользователь №: 77 311

|
Цитата(T800 @ Oct 14 2014, 17:17)  Как это выглядит у меня. После функции PWR_EnterSTOPMode ничего не выполняется, программа ждёт прерывания (в моём случае внешняя линия или RTC timer) для выхода из стоп режима. Потом происходит нужное событие, запускается обработчик прерывания и программа возвращается туда где остановилась. Потом она по циклу приходит опять к PWR_EnterSTOPMode и всё благополучно виснет. При возврате из STOP mode ядро переходит на тактирование от MSI RC. Нет каких то зависимостей в программе в плане инициализации или работы от тактирования?
|
|
|
|
|
Oct 15 2014, 07:32
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-12-13
Пользователь №: 79 453

|
При возврате я полностью повторяю процедуру инициализации, также как до первого входа.
|
|
|
|
|
Oct 15 2014, 11:31
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-12-13
Пользователь №: 79 453

|
Попробовал после просыпания вообще не трогать инициализацию, оставил MSI, отключил дебаг. Заработало! Т.е. просыпается, пин переключает. Можно сказать проблема локализована. Почти.
|
|
|
|
|
Oct 16 2014, 13:32
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 16-08-06
Из: Москва
Пользователь №: 19 581

|
Для отладки в STOP режиме нужно биты в служебном регистре выставить, о чем ранее писалось. Используйте поиск по форуму. Код #if defined(DEBUG) DBGMCU_Config(DBGMCU_STOP, ENABLE); #endif
|
|
|
|
|
Oct 20 2014, 14:06
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-12-13
Пользователь №: 79 453

|
Естественно у меня он был включен. При этом в первый раз заходим в стоп - отладка работает, потом заходим ещё раз - уже не работает. Заработало всё когда отключил режим отладки в стопе.
|
|
|
|
|
Oct 24 2014, 09:21
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 16-08-06
Из: Москва
Пользователь №: 19 581

|
Какая модель микроконтроллера? например в ерате на 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 }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|