ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
66604 Топик полностью
by-pass (25.08.2006 11:58, просмотров: 1) ответил igor_m на помогите поднять прерывания от uart для lpc2138 - пишу на иаре 4.31
Пример. ИНИЦИАЛИЗАЦИЯ <pre> /*************************************************************************/ //UART Driving functions /*************************************************************************/ void UART0Init(U16 baud) { U16 divisor = getperipheralClockFreq() / (16 * baud);//узнали частоту шины перефирии PINSEL0 = PINSEL0 & ~0xF | 0x5; //функция порта UART //IO0DIR|= 1<<0; //линия TX0 на выход U0IER = 0x00; // disable all interrupts U0LCR_bit.WLS=3; //8 bits //настроили U0LCR_bit.SBS=0; //0 - 1 stop bit || 1 - 2 stop bit U0LCR_bit.DLAB=1; //Enable DLAB //открыли доступ к U0DLL, U0DLM U0DLL = LSB(divisor); //baud rate U0DLM = MSB(divisor); U0LCR_bit.DLAB=0; //Disable DLAB //залочили обратно U0DLL, U0DLM //--------------------------------------------------------------- //Set the FIFO enable bit in the FCR register. This bit must be set for //proper UART operation. U0FCR=0xC1; // 14 символов буфер || enable the FIFO's // Set Interrupt Enable Register U0IER_bit.RDAIE =1 ; //разрешили прерывания по приему (Receive Data Interrupt Enable) //U0IER_bit.RXLSIE =1 ; //разрешили прерывания по изменению статуса Rx(Rx Line StatusInterrupt Enable) // 0: Disable the Rx line status interrupts. // 1: Enable the Rx line status interrupts. //U0IER_bit.THREIE =1 ; //разрешили прерывания по отправке (Tx Data Interrupt Enable) } /*************************************************************************/ //UART INTERRUPTS functions /*************************************************************************/ void UART0_INTERRUPTS_init(void) { VICIntSelect &= ~(1<<VIC_UART0); // IRQ on UART0. VICVectAddr6 = (unsigned int) & ISR_UART0Interrupt; VICVectCntl6 = 0x20 | VIC_UART0; // Enable vector interrupt for UART1. VICIntEnable = (1<<VIC_UART0); // Enable UART 0 interrupt. } /*************************************************************************/ // -------------ISR------------ /*************************************************************************/ static void ISR_UART0Interrupt(void) { unsigned char ISR_type; while(((ISR_type = U0IIR) & 0x01) == 0) // прерывания по UART { switch (ISR_type & 0x0e) // проверяем какое { //-------------------------------------- case 0x02: //THRE Interrupt. //U0THR = 0x15; break; //-------------------------------------- case 0x06: //Receive Line Status (RLS) {char temp = U0LSR; break; } //-------------------------------------- case 0x04: // по приему //Receive Data Available (RDA) while( (U0LSR & 0x01) == 1 ) add_to_buffer(U0RBR); //фописываем данные break; //-------------------------------------- case 0x0c: // по таймауту //Character Time-out Indicator (CTI) while( (U0LSR & 0x01) == 1 ) add_to_buffer(U0RBR); //фописываем данные break; //-------------------------------------- default : assert(0); break; //-------------------------------------- } } } ВЫЗОВ UART0Init(115200); UART0_INTERRUPTS_init();