| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Обработка прерываний в LPC1114
06.12.2011, 23:04
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Обработка прерываний в LPC1114
Добрый вечер. Вот решил разобраться в ARM и возник вопрос, как обработать прерывание? Использую среду Code red.
Настраиваю так:
|
Код:
|
GPIOInit();
GPIOSetDir(LED_PORT, LED_BIT, 1);
GPIOSetDir(BUTTON_PORT, BUTTON_BIT, 0);
LPC_IOCON-›PIO3_1 =32; //подтяжка к 0 и включение гистерезиса
GPIOSetInterrupt(BUTTON_PORT,BUTTON_BIT,0,0,0);
GPIOIntEnable(BUTTON_PORT,BUTTON_BIT); |
В справке не нашел по прерываниям ничего...
Буду благодарен за помощь
Последний раз редактировалось swat24; 06.12.2011 в 23:06.
|
|
|
|
06.12.2011, 23:13
|
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
|
Re: Обработка прерываний в LPC1114
А сам обработчик прерываний где???
|
|
|
|
06.12.2011, 23:21
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Обработка прерываний в LPC1114
Я это и спрашивал, как его писать? Для пика я использовал Mikropascal, mikroc, там это выглядело так: void interrupt(void); дальше обработка
а как тут?
В Keil как я понял пишется так:
|
Код:
|
__irq void Timer0ISR (void) //от чего прерывание
{
//выполение нужных действий
//сброс флага прерываний
return;
} |
В Code red такое не годится... Как такое написать в Code red ?
Последний раз редактировалось swat24; 07.12.2011 в 00:28.
|
|
|
|
08.12.2011, 01:03
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Обработка прерываний в LPC1114
Такая обработка прерывания не работает:
|
Код:
|
void PIOINT3_IRQHandler(void)
{
flag=1;
GPIOIntClear(BUTTON_PORT,BUTTON_BIT);
} |
Настройка:
|
Код:
|
GPIOSetDir(LED_PORT, LED_BIT, 1);
GPIOSetDir(BUTTON_PORT, BUTTON_BIT, 0);
LPC_IOCON-›PIO3_1 =32;
GPIOSetInterrupt(BUTTON_PORT,BUTTON_BIT,0,0,0);
GPIOIntEnable(BUTTON_PORT,BUTTON_BIT); |
что не так?
|
|
|
|
08.12.2011, 02:42
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Обработка прерываний в LPC1114
В 1114 имеется контроллер прерываний. Без его использования прерываний не будет.
Читайте UM - 21.5.2 Nested Vectored Interrupt Controller
|
|
|
|
08.12.2011, 11:01
|
|
|
Гражданин KAZUS.RUN
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Обработка прерываний в LPC1114
swat24,
Надо вызвать еще NVIC_EnableIRQ(.....)
и проверить что обработчик прерывания имеет правильное название. При несовпадении названий ошибки компиляции не будет, но и работть то же не будет.
|
|
|
|
08.12.2011, 20:05
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Обработка прерываний в LPC1114
Вроде немного разобрался, это работает:
|
Код:
|
void PIOINT3_IRQHandler(void){
flag=1;
GPIOIntClear(BUTTON_PORT,BUTTON_BIT);
//GPIOSetValue(LED_PORT,LED_BIT,LED_ON);
}
int main (void)
{ GPIOInit();
GPIOSetDir(LED_PORT, LED_BIT, 1);
GPIOSetDir(BUTTON_PORT, BUTTON_BIT, 0);
LPC_IOCON-›PIO3_1 =8;
GPIOSetInterrupt(BUTTON_PORT,BUTTON_BIT,1,1,0);
GPIOIntEnable(BUTTON_PORT,BUTTON_BIT);
GPIOSetValue(LED_PORT,LED_BIT,LED_OFF);
NVIC_EnableIRQ(28); // прерывание по порту 3 |
А для включения нескольких прерываний как писать?NVIC_EnableIRQ(); по порядку друг за другом? у меня так не заработало... вообще не одно прерывание тогда не пашит...
Последний раз редактировалось swat24; 08.12.2011 в 21:42.
|
|
|
|
09.12.2011, 01:11
|
|
|
Гражданин KAZUS.RUN
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Обработка прерываний в LPC1114
swat24,
Во-первых, я не рекомендую пользовать бибиотечные функции для работы с пинами. Они очень медленные.
Прерывания включаются по-отдельности. И еще для них есть NVIC_SetPriority и NVIC_SetPriorityGrouping (эта вызывается один раз).
Вместо числа 28 определена соответствующая константа, надо ее использовать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:40.
|
|