Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Внешнее прерывание от ножек GPIO на LPC2478
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
M_Andrey
Пытаюсь запустить внешнее прерывание от ножек GPIO на LPC2478, точнее с P2[15]. Плата LPC2478STK от Olimex - там разведен разъем стандартной клавиатуры PS/2.
Вот кусок кода, но в прерывание он входить вообще не хочет. Клавиатура и ножки GPIO исправны - по опросу все работает без ошибок. Подскажите где у меня неправильно.
CODE
</P><P>void KeyboardCLK(void)
{
static unsigned char data; // Holds the received scan code

LED2SET = 1;
VICADDRESS = 0;
VICINTENCLEAR_bit.EINT3 = 1;

if (IOINTSTATUS_bit.P2INT)
{
if (IO2INTSTATF_bit.P2_15)
{
{
if ( (bitcount < 11) && (bitcount > 2) ) // Bit 3 to 10 is data. Parity bit,
{ // start and stop bits are ignored.
data = (data >> 1);
if (FIO2PIN_bit.P2_14) data = data | 0x80; // Store a '1'
}

if (--bitcount == 0)
{ // All bits received
decode(data);
bitcount = 11;
}
}
}
IO2INTCLR_bit.P2_15 = 1;
}

LED2CLR = 1;
}

void init_keyboard_ps2(void)
{
// 33222222 22221111 11111100 00000000
// 10987654 32109876 54321098 76543210
//FIOnDIR = BIN32(00000000,00000000,00000000,00000000);
FIO2DIR &= BIN32(11111111,11111111,00111111,11111111); //0 - input / 1 - output
FIO2MASK &= BIN32(11111111,11111111,00111111,11111111); //0 - read/write / 1 - no effect

PINSEL4 &= BIN32(00001111,11111111,11111111,11111111); //GPIO
PINMODE4 &= BIN32(00001111,11111111,11111111,11111111); //pull-up resistor enabled.

IO2INTENR &= BIN32(11111111,11111111,00111111,11111111);
IO2INTENF = ( IO2INTENF & BIN32(11111111,11111111,00111111,11111111) ) | BIN32(00000000,00000000,10000000,00000000);
IO2INTCLR_bit.P2_15 = 1;

PCLKSEL1_bit.PCLK_GPIO = 1;

VIC_SetVectoredIRQ(KeyboardCLK,0,VIC_EINT3);
VICINTENABLE |= 1UL << VIC_EINT3;

bitcount = 11;
}
M_Andrey
Сегодня случайно включил плату без JTAG-а и, о чудо, все заработало. Запустил под JTAG-ом - опять не работает - чудеса. Прерывание от таймера к примеру под JTAG-ом работает и отслеживается.

Сейчас правда вылезло другое (пока еще не успел поковырять) - прерывания идут непрерывно, а кто источник без JTAG-а сложно определить.

Код
корректировка
//VICINTENCLEAR_bit.EINT3 = 1;
 
M_Andrey
Ну в общем тема закрыта, разобрался сам. Если кому интересно вот код:

CODE
void KeyboardCLK(void)
{
static unsigned char data;

LED2SET = 1;
VICADDRESS = 0;

if (IOINTSTATUS_bit.P2INT)
{
if (IO2INTSTATF_bit.P2_15)
{
{
if ( (bitcount < 11) && (bitcount > 2) )
{ // Bit 3 to 10 is data. Parity bit, start and stop bits are ignored.
data >>= 1;
if (FIO2PIN_bit.P2_14) data = data | 0x80;// Store a '1'
}
if (--bitcount == 0)// All bits received
{
decode(data);
bitcount = 11;
}
}
}
IO2INTCLR_bit.P2_15 = 1;
}
else
{
EXTINT = 0x08;
}
LED2CLR = 1;
}

void init_keyboard_ps2(void)
{
FIO2DIR &= BIN32(11111111,11111111,00111111,11111111); //0 - input / 1 - output
FIO2MASK &= BIN32(11111111,11111111,00111111,11111111); //0 - read/write / 1 - no effect

PINSEL4 &= BIN32(00001111,11111111,11111111,11111111); //GPIO
PINMODE4 &= BIN32(00001111,11111111,11111111,11111111); //pull-up resistor enabled.

IO2INTENR &= BIN32(11111111,11111111,00111111,11111111);
IO2INTENF = ( IO2INTENF & BIN32(11111111,11111111,00111111,11111111) ) | BIN32(00000000,00000000,10000000,00000000);

IO2INTCLR_bit.P2_15 = 1;

EXTINT = 0x08;
EXTMODE = 0;
INTWAKE_bit.GPIO2WAKE = 1;

PCLKSEL1_bit.PCLK_GPIO = 1; // set divider to /1

VIC_SetVectoredIRQ(KeyboardCLK,1,VIC_EINT3);

inpt = kb_buffer;// Initialize buffer
outpt = kb_buffer;
buffcnt = 0;
new_char = 0;
bitcount = 11;

VICINTENABLE_bit.EINT3 = 1;
}


Но вот поведение JTAG-а меня настораживает. Сейчас-то он работает нормально, но его неадекватное поведение привело к потере уймы времени. По крайней мере теперь если что буду его отключать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.