SZ0 0 15 марта, 2019 Опубликовано 15 марта, 2019 · Жалоба При подаче питания STM8L151K4T6 по HALT переходит в powed down. Дальше проц ожидается выхода из него по нажатию кнопки. Нажали, проц проснулся и перешёл на следующую команду после HALT. Здесь всё хорошо работает. В дальнейшем, через некоторое время, проц либо сам засыпает по таймеру, либо принудительно по кнопке переходе в powed down. Далее начинаются "глюки". Программа после обработки прерывания по нажатию клавиши переходит не на следующую команду после HALT, а несколькими командами раньше. Понятно, что это приводит к бесконечному сну программы. В отладчике, если всё делать пошагово, до HALT, просыпание будет корректным. Но, стоит точку останова поставить на HALT или при выходе из обработчика кнопки, в стеке виден неправильный адрес возврата. Полез в erratu. Оказывается, при частоте выше 8 МГц при выходе из HALT программа может некорректно читать таблице векторов прерываний. Рекомендация: CLK_CKDIVR = 0x01; _asm(“HALT”); CLK_CKDIVR = 0x00; Не помогает. Делитель также больше делал. Возникают вопросы. Почему же тогда при подаче питания первый HALT нормально обрабатывается? При медленном пошаговом выполнении также всё нормально. Приходит простая мысль ,может перед выходом из прерывания обработки кнопки в стеке адрес возврата менять на правильный принудительно? А то пока не вижу, как можно ещё устранить эту проблему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SZ0 0 15 марта, 2019 Опубликовано 15 марта, 2019 · Жалоба Сейчас повозился в отладке. Перед HALT настраиваю прерывание по кнопке, чтобы выходить из сна. GPIOA->DDR = 0xFF & ~PIN_KEY; // кнопка GPIOA->CR2 = PIN_KEY; В прерывание попадает спутся пару команд после команды GPIOA->CR2 = PIN_KEY Почему-то возникает прерывание от кнопки, хотя она уже обработана и времени между её отпусканием и командой проходит несколько секунд. В общем, больше вопросов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться