Исходные данные: KEIL322a, LPC2138
Исходник:
Код
void main ( void ) {
…
…
//выполняется обмен с модемом
GSMInit()
OutMenu( "Вывод меню пользователя через UART0" );
while (1);
}
Инициализация UART:
Код
//UART0 - 115200 - Отладочный порт
PINSEL0 |= 0x00000005; //Enable RxD and TxD pins
U0LCR = 0x83; //8 bits, no Parity, 1 Stop bit
U0DLL = (VPB_CLOCK/16/BAUD_RATE0) & 0xFF; //Setup Baudrate
U0DLM = ((VPB_CLOCK/16/BAUD_RATE0) >> 8) & 0xFF;
U0LCR = 0x03; //DLAB = 0
//настройка прерывания UART0
VICVectAddr6 = (unsigned long)uart0_interrupt; //прерывание на 6 векторе
VICVectCntl6 = 0x20 | 0x06;
VICIntEnable |= 0x00000040; //включить прерывание от UART0
U0IER = IER_RBR | IER_THRE; //конфигурация прерывания UART0
//приняты данные, буфер пуст
//UART1
PINSEL0 |= 0x00050000; //Enable RxD and TxD pins
U1LCR = 0x83; //8 bits, no Parity, 1 Stop bit
U1DLL = (VPB_CLOCK/16/BAUD_RATE1) & 0xFF; //Setup Baudrate
U1DLM = ((VPB_CLOCK/16/BAUD_RATE1) >> 8) & 0xFF;
U1FCR = 0x07; //Разрешение работы и сброс TX and RX FIFO, граница - 1 байт
U1LCR = 0x03; //DLAB = 0 разрешить работу порта
//настройка прерывания UART1
VICVectAddr7 = (unsigned long)uart1_interrupt;
VICVectCntl7 = 0x20 | 0x07;
VICIntEnable |= 0x00000080;
U1IER = IER_RBR | IER_THRE;
Обработка прерывания:
Код
__irq void uart1_interrupt( void ) {
int IIRValue, LSRValue;
char ch, RBRValue;
volatile char Dummy;
IIRValue = U1IIR;
IIRValue = (IIRValue & 0x0E) >> 1; // Выделяем информацию об источнике прерывания
if ( IIRValue == 0x03 ) {
//Изменился статус приемной линии
//сбросим времени счетчик последнего обмена
LSRValue = U1LSR;
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) {
//Пустое чтения для сброса флага прерывания
Dummy = U1RBR;
VICVectAddr = 0;
return;
}
}
if ( IIRValue == IIR_RDA || IIRValue == IIR_CTI ) {
//Принят новый байт данных и достигнута граница тригера
RBRValue = U1RBR;
GSMRecv( RBRValue );
}
if ( IIRValue == IIR_THRE ) {
//Прочитаем статус и убедимся, что действительно THR пуст
LSRValue = U1LSR;
if ( LSRValue & LSR_THRE )
//буфер передачи пуст
UART1TxEmpty = 1;
/*if ( GSMSendByte( &ch ) )
U1THR = ch;*/
else UART1TxEmpty = 0;
}
//сброс прерывания
VICVectAddr = 0;
}
GSMInit – отрабатывает нормально в main, передает несколько команд в модем, но как только попадаем в while(1) функция перестает отрабатывать, т.е. передается один байт и все. Вход в __irq void uart1_interrupt( void ) не происходит вообще, программа вешается. Второй вызов GSMInit выполняется по нажатию пользовательской кнопки или по команде с консоли. Если отключить вызов GSMInit в main а потом вызвать отдельно, ситуация повторяется, т.е. передача одного байта и ступор. Обмен по UART0 идет без проблен, пока не вызывать GSMInit

В чем может быть проблема, может что-то пропустил при инициализации !? Гляньте пожалуйста свежим взглядом !