T800 0 13 октября, 2014 Опубликовано 13 октября, 2014 · Жалоба Всем доброго времени суток. столкнулся с такой проблемой. По смыслу задачи требуется сделать следующее: Контроллер запускается, инициализирует всё что нужно, после этого переходит в Stop Mode with RTC. Просыпаться нужно по RTC таймеру, просыпается нормально. После этого выполняет нужные действия и снова надо засыпать. И вот тут начинается проблема. Для перехода в Stop mode я вызываю библиотечную функцию PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI). Так вот, в первый раз контроллер засыпает нормально, во второй - после вызова функции он просто отключается, как будто отключается питание. Происходит это после строчки __WFI() в функции PWR_EnterSTOPMode. Что я делаю не так? Спасибо всем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex5 0 14 октября, 2014 Опубликовано 14 октября, 2014 · Жалоба Что бы выйти из STOP нужно сгенерить определенное прерывание. Проверьте настройки RTC таймера, если он настроен на однократный режим нужно снова взвести курок в обработчике его прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T800 0 14 октября, 2014 Опубликовано 14 октября, 2014 (изменено) · Жалоба Да я уже что только ни пробовал. Выходил из stop mode и по таймеру, и по внешней линии - стопится и выходит нормально. Но только один раз. При втором входе в stop mode виснет намертво. Пробовал и с дебагом и без дебага. Результат один и тот же. Может где-то есть какой-то флаг который надо куда-то сбросить, но я никак не пойму в чём дело. Не совсем понял про прерывание. Как это выглядит у меня. После функции PWR_EnterSTOPMode ничего не выполняется, программа ждёт прерывания (в моём случае внешняя линия или RTC timer) для выхода из стоп режима. Потом происходит нужное событие, запускается обработчик прерывания и программа возвращается туда где остановилась. Потом она по циклу приходит опять к PWR_EnterSTOPMode и всё благополучно виснет. Изменено 14 октября, 2014 пользователем T800 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 15 октября, 2014 Опубликовано 15 октября, 2014 · Жалоба Как это выглядит у меня. После функции PWR_EnterSTOPMode ничего не выполняется, программа ждёт прерывания (в моём случае внешняя линия или RTC timer) для выхода из стоп режима. Потом происходит нужное событие, запускается обработчик прерывания и программа возвращается туда где остановилась. Потом она по циклу приходит опять к PWR_EnterSTOPMode и всё благополучно виснет. При возврате из STOP mode ядро переходит на тактирование от MSI RC. Нет каких то зависимостей в программе в плане инициализации или работы от тактирования? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T800 0 15 октября, 2014 Опубликовано 15 октября, 2014 · Жалоба При возврате я полностью повторяю процедуру инициализации, также как до первого входа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 15 октября, 2014 Опубликовано 15 октября, 2014 · Жалоба при настройке сбрасываете регистры в дефолт? то есть иногда делают SET_REG |= 0x15; забывают что регистр равен 0, только после ресета, а если в ходе каких-то действий регистр смениться на 0x2A, то после этой строчки он будет не 0x15, а 0x3F. Проверьте нет у вас чего-то подобного? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T800 0 15 октября, 2014 Опубликовано 15 октября, 2014 · Жалоба Попробовал после просыпания вообще не трогать инициализацию, оставил MSI, отключил дебаг. Заработало! Т.е. просыпается, пин переключает. Можно сказать проблема локализована. Почти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex5 0 16 октября, 2014 Опубликовано 16 октября, 2014 · Жалоба Для отладки в STOP режиме нужно биты в служебном регистре выставить, о чем ранее писалось. Используйте поиск по форуму. #if defined(DEBUG) DBGMCU_Config(DBGMCU_STOP, ENABLE); #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
T800 0 20 октября, 2014 Опубликовано 20 октября, 2014 · Жалоба Естественно у меня он был включен. При этом в первый раз заходим в стоп - отладка работает, потом заходим ещё раз - уже не работает. Заработало всё когда отключил режим отладки в стопе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex5 0 24 октября, 2014 Опубликовано 24 октября, 2014 · Жалоба Какая модель микроконтроллера? например в ерате на 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться