Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
09.02.2012, 18:01
|
|
Частый гость
Регистрация: 01.11.2009
Сообщений: 29
Сказал спасибо: 2
Сказали Спасибо 13 раз(а) в 7 сообщении(ях)
|
LPC13xx Внешнее прерывание
Я пытаюсь, симулировать внешнее прерывание на lpc1343 посредством KEIL.
Пробую код с http://ics.nxp.com/products/lpc1000/lpc13xx/
Там выставляются все 4 внешних прерывания для портов EINT0-3.
Но когда я пытаюсь имитировать его, это не работает.
Прерывания настраиваются по нарастающему фронту и включаются, NVIC тоже.
Когда меняю внешнюю ножку в порту ввода/вывода, бит в GPIO1RIS (для первого порта) устанавливается.
Но прерывания не происходит.
Когда я устанавливаю бит "Pending" в блоке NVIC для этого обработчика прерываний всё работает нормально.
Тот же результат с другим проектом с внешним прерыванием.
Тот же результат с аппаратным моделирования этого проекта.
В Errdata инфы нет.
Кто посоветует, что нет так или даст кусок кода рабочего для отладки внешних прерываний?
Может быть, это ошибка аппаратная?
|
|
|
|
09.02.2012, 22:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: LPC13xx Внешнее прерывание
Сообщение от Sinopteek
|
Пробую код с
|
А чё не просто с nxp.com?
Конкретный участок кода - конкретный вопрос - конкретный ответ.
|
|
|
|
10.02.2012, 06:02
|
|
Частый гость
Регистрация: 01.11.2009
Сообщений: 29
Сказал спасибо: 2
Сказали Спасибо 13 раз(а) в 7 сообщении(ях)
|
Re: LPC13xx Внешнее прерывание
Сообщение от omercury
|
А чё не просто с nxp.com?
Конкретный участок кода - конкретный вопрос - конкретный ответ.
|
Сообщение от main.c
|
GPIOInit();
/* use port0_1 as input event, interrupt test. */
GPIOSetDir( PORT0, 1, 0 );
/* port0_1, single trigger, active high. */
GPIOSetInterrupt( PORT0, 1, 0, 0, 0 );
GPIOIntEnable( PORT0, 1 );
|
Сообщение от gpio.c
|
void GPIOInit( void )
{
/* Enable AHB clock to the GPIO domain. */
LPC_SYSCON-›SYSAHBCLKCTRL |= (1‹‹6);
/* Set up NVIC when I/O pins are configured as external interrupts. */
NVIC_EnableIRQ(EINT0_IRQn);
NVIC_EnableIRQ(EINT1_IRQn);
NVIC_EnableIRQ(EINT2_IRQn);
NVIC_EnableIRQ(EINT3_IRQn);
return;
}
void GPIOSetInterrupt( uint32_t portNum, uint32_t bitPosi, uint32_t sense,
uint32_t single, uint32_t event )
{
switch ( portNum )
{
case PORT0:
if ( sense == 0 )
{
LPC_GPIO0-›IS &= ~(0x1‹‹bitPosi);
/* single or double only applies when sense is 0(edge trigger). */
if ( single == 0 )
LPC_GPIO0-›IBE &= ~(0x1‹‹bitPosi);
else
LPC_GPIO0-›IBE |= (0x1‹‹bitPosi);
}
else
LPC_GPIO0-›IS |= (0x1‹‹bitPosi);
if ( event == 0 )
LPC_GPIO0-›IEV &= ~(0x1‹‹bitPosi);
else
LPC_GPIO0-›IEV |= (0x1‹‹bitPosi);
break;
case PORT1:
if ( sense == 0 )
{
LPC_GPIO1-›IS &= ~(0x1‹‹bitPosi);
/* single or double only applies when sense is 0(edge trigger). */
if ( single == 0 )
LPC_GPIO1-›IBE &= ~(0x1‹‹bitPosi);
else
LPC_GPIO1-›IBE |= (0x1‹‹bitPosi);
}
else
LPC_GPIO1-›IS |= (0x1‹‹bitPosi);
if ( event == 0 )
LPC_GPIO1-›IEV &= ~(0x1‹‹bitPosi);
else
LPC_GPIO1-›IEV |= (0x1‹‹bitPosi);
break;
case PORT2:
if ( sense == 0 )
{
LPC_GPIO2-›IS &= ~(0x1‹‹bitPosi);
/* single or double only applies when sense is 0(edge trigger). */
if ( single == 0 )
LPC_GPIO2-›IBE &= ~(0x1‹‹bitPosi);
else
LPC_GPIO2-›IBE |= (0x1‹‹bitPosi);
}
else
LPC_GPIO2-›IS |= (0x1‹‹bitPosi);
if ( event == 0 )
LPC_GPIO2-›IEV &= ~(0x1‹‹bitPosi);
else
LPC_GPIO2-›IEV |= (0x1‹‹bitPosi);
break;
case PORT3:
if ( sense == 0 )
{
LPC_GPIO3-›IS &= ~(0x1‹‹bitPosi);
/* single or double only applies when sense is 0(edge trigger). */
if ( single == 0 )
LPC_GPIO3-›IBE &= ~(0x1‹‹bitPosi);
else
LPC_GPIO3-›IBE |= (0x1‹‹bitPosi);
}
else
LPC_GPIO3-›IS |= (0x1‹‹bitPosi);
if ( event == 0 )
LPC_GPIO3-›IEV &= ~(0x1‹‹bitPosi);
else
LPC_GPIO3-›IEV |= (0x1‹‹bitPosi);
break;
default:
break;
}
return;
}
void GPIOIntEnable( uint32_t portNum, uint32_t bitPosi )
{
switch ( portNum )
{
case PORT0:
LPC_GPIO0-›IE |= (0x1‹‹bitPosi);
break;
case PORT1:
LPC_GPIO1-›IE |= (0x1‹‹bitPosi);
break;
case PORT2:
LPC_GPIO2-›IE |= (0x1‹‹bitPosi);
break;
case PORT3:
LPC_GPIO3-›IE |= (0x1‹‹bitPosi);
break;
default:
break;
}
return;
}
void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir )
{
if(dir)
LPC_GPIO[portNum]-›DIR |= 1‹‹bitPosi;
else
LPC_GPIO[portNum]-›DIR &= ~(1‹‹bitPosi);
}
|
По функциям всё работает - устанавливаются биты в соответствии с даташитом. В симуляторе видно.
По логике вроде тоже =)
Однако, в прерывание не входит при изменении состояния бита порта. Хотя, бит прерывания и устанавливается.
Принудительное программное прерывание(Pending через окошко настройки NVIC) работает, следовательно указатель на обработчик прерывания верен, в противном случае был бы HardFault.
Что я делаю не так?
p.s. смайлы тут, уж, больно весёлые
Последний раз редактировалось Sinopteek; 10.02.2012 в 06:30.
|
|
|
|
17.02.2012, 10:23
|
|
Частый гость
Регистрация: 01.11.2009
Сообщений: 29
Сказал спасибо: 2
Сказали Спасибо 13 раз(а) в 7 сообщении(ях)
|
Re: LPC13xx Внешнее прерывание
Таки оказалось, что косяк в симуляторе. Суппорт KEIL'а подтвердил на следующий день, как в железе заработало =)
Почему не работало в оригинальном варианте так и не понял. Единственное, что сделал - оставил одно прерывание с одной ножки, остальные - в комментарии.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:29.
|
|