Пример. ИНИЦИАЛИЗАЦИЯ
<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();
-
- СПАСИБО! - igor_m(25.08.2006 13:57, )