Полная версия этой страницы:
STM32 проблема с прерываниями
Exeland
May 4 2009, 12:41
Проблема в следующем:
Писал я прошивку на микроконтроллер STM32F103CB. Пока писал прошивку проверял ее в стимуляторе, стандартном Keil`а. Все работало отлично. Потом собрал девайс. Подключился к нему через Seger, начал эмулить. Почему-то не работают прерывания, хотя в симуляторе они работают. В чем дело? Где подвох?
А что в регистрах (если посомтреть в отладчике)
BASEPRI
SETENAx
приотритеты?
в прерываниях брейкпоинты стоят? а то при single step у кортекса есть возможность обходить прерывания.
Exeland
May 4 2009, 13:29
В прерываниях брейкпоинты не стоят. Эмулирую в пошаговом режиме. Но в прерывания не входит, т. к. у меня стоит цикл из которого можно выйти набрав определенное количество прерываний.
А где эти регистры BASEPRI и SETENAx. В окне настройки отладчика не нашел. Если что у меня Seger J-Link.
Цитата(Exeland @ May 4 2009, 17:29)

В прерываниях брейкпоинты не стоят. Эмулирую в пошаговом режиме. Но в прерывания не входит, т. к. у меня стоит цикл из которого можно выйти набрав определенное количество прерываний.
А где эти регистры BASEPRI и SETENAx. В окне настройки отладчика не нашел. Если что у меня Seger J-Link.
BASEPRI - это системный регистр процессора
SETENA - разрешение прерываний, прироитеты... это часть NVIC ( контроллера прерываний)
с Keil не работаю, где там находятся не знаю. Но точно должны быть!
вы попробуйте для начала брейкпоинты в обработчиках прерывания поставить!
Exeland
May 6 2009, 09:19
Да действительно. Выставил брейкпоинты и вижу что прерывания выполняютс. Наверно, действительно в пошаговом режиме Cortex обходит прерывания.
Цитата(Exeland @ May 6 2009, 13:19)

Да действительно. Выставил брейкпоинты и вижу что прерывания выполняютс. Наверно, действительно в пошаговом режиме Cortex обходит прерывания.
Т.к. я сам делал отладчик (на FT232R) - могу сказать, что single step происходит аппаратно и настраивается пропускать прерывания или нет. Тут уже была тема, как раз жаловались, что невозможно отлаживать потому что в прерывания все время попадает.
Exeland
May 6 2009, 13:41
Не могу понять как микроконтроллер в режиме эмуляции работает. Я настроил 4 таймера каждый на определенное время. Первым должен заканчивать подсчет 1-ый и запускаться заново на подсчет , вторым второй, затем третий и четвертый. В симуляторе Keil`a все проходит нормально. А при эмуляции через JTAG все флаги переполнения таймеров поднимаются одновременно, как будто они настроены на один интервал времени.
Цитата(Exeland @ May 6 2009, 17:41)

В симуляторе Keil`a все проходит нормально. А при эмуляции через JTAG все флаги переполнения таймеров поднимаются одновременно, как будто они настроены на один интервал времени.
Просто в симуляторе вы делаете single step... команда выполняется за несколько тактов симулятор останавливается, счетчики таймеров увеличиваются на несколько тиков (в зависимости от времени выполнения команды 1, 2 такта обычно)
А в реальном процессоре ядро то останавливается, а периферия продолжает работать, пока вы сделаете шаг... уже все таймеры и истекли! Риал тайм так не отладить нужны другие подходы!
lehacheb
May 7 2009, 09:37
У меня на STM32 не работали прерывания, когда я саму программу записывал во FLASH,
а вектор прерывания располагался в RAM, потому что был задан при компиляции define VECT_TAB_RAM,
а в программе такой кусок
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
Exeland
May 7 2009, 10:15
To KRS А я думал, что отладчик умножитель PLL притормаживает и при этом вся периферия тормозит вместе с ядром.
То lehacheb У меня вектора прерываний во флеше.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.