1. Напиши программу приёма байта из UART по готовности (без прерываний) для проверки факта приёма.
2. Работа по прерыванию от приёма байта :
// -------------------------------------------------------------------------------- void UART1_Init(long baud) { unsigned int divisor = peripheralClockFrequency() / (16 * baud);
PCB_PINSEL0 |= 0x00050000; // Select UART1 RXD/TXD UART1_LCR = 0x87; // 8N2, enable Divisor latch bit UART1_IER = 0X00; // 0: запретить прерывания UART1_DLL = divisor & 0xFF; UART1_DLM = (divisor >> 8) & 0xFF; UART1_LCR &= ~0x80;
UART1_FCR = 1; //1: Enable FIFO's Uart_Init_Delay(); UART1_FCR = 7; //6: Reset TX and RX FIFO Uart_Init_Delay(); } // --------------------------------------------------------------------------------
//select interrupts
VICIntSelect=0x00000000; // IRQ VICSoftInt = 0x00000000; VICSoftIntClear = ~VICSoftInt;
VICVectAddr4=(unsigned)uart1_isr; // UART1 на приём VICVectCntl4 = 0x20 | 7; VICIntEnable = 0x00000080; // -------------------------------------------------------------------------------- #pragma interrupt_handler uart1_isr // эта строчка - для компилятора ICCV7 void uart1_isr(void) { unsigned char id, status, bChar; id=UART1_IIR; //read interrupt id to clear flag if((id & 0b0100) != 0) { status = UART1_LSR; // Get status register
if(status & 1) // If Holding is empty then send { RxChar = UART1_RBR; // записываем принятый байт в переменную RxRdy = 1; // признак, что прерывание произошло if(xRx < RxLEN) Rxbuf[xRx++]= RxChar; // записываем принятый байт в буфер, пока есть место } } VICVectAddr = 0; // Acknowledge Interrupt } // ------------------------------------------------------------------------------------------- // ---- приём по готовности, без прерываний ----------------------- unsigned char rx_char1( void) { while(RxRdy == 0); RxRdy = 0; return(RxChar); }
|