void UART_IRQHandler(void) { uint8_t IIRValue, LSRValue; uint8_t Dummy = Dummy; //uint8_t tempdata; IIRValue = LPC_UART->IIR; IIRValue >>= 1;/* skip pending bit in IIR */ IIRValue &= 0x07;/* check bit 1~3, interrupt identification */ if (IIRValue == IIR_RLS)/* Receive Line Status */ { LSRValue = LPC_UART->LSR; /* Receive Line Status */ if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI)) { /* There are errors or break interrupt */ /* Read LSR will clear the interrupt */ UARTStatus = LSRValue; Dummy = LPC_UART->RBR;/* Dummy read on RX to clearinterrupt, then bail out */ return; } if (LSRValue & LSR_RDR)/* Receive Data Ready */ { /* If no error on RLS, normal ready, save into the data buffer. */ /* Note: read RBR will clear the interrupt */ asd = LPC_UART->RBR; } } else if (IIRValue == IIR_RDA)/* Receive Data Available */ {/* Receive Data Available */ asd = LPC_UART->RBR; //UARTBuffer[UARTCount++] = LPC_UART->RBR; } else if (IIRValue == IIR_CTI)/* Character timeout indicator */ {/* Character Time-out indicator */ UARTStatus |= 0x100;/* Bit 9 as the CTI error */ } else if (IIRValue == IIR_THRE)/* THRE, transmit holding register empty */ { /* THRE interrupt */ LSRValue = LPC_UART->LSR;/* Check status in the LSR to see if valid data in U0THR or not */ if (LSRValue & LSR_THRE){ UARTTxEmpty = 1; } else UARTTxEmpty = 0; } //was_irq = true; } |
void UARTInit(uint32_t baudrate) { uint32_t Fdiv; uint32_t regVal; UARTTxEmpty = 1; UARTCount = 0; NVIC_DisableIRQ(UART_IRQn); LPC_IOCON->PIO1_6 &= ~0x07; /* UART I/O config */ LPC_IOCON->PIO1_6 |= 0x01; /* UART RXD */ LPC_IOCON->PIO1_7 &= ~0x07; LPC_IOCON->PIO1_7 |= 0x01; /* UART TXD */ /* Enable UART clock */ LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12); LPC_SYSCON->UARTCLKDIV = 0x1; /* divided by 1 */ // LPC_UART->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ LPC_UART->LCR = 0x87; /* 8 bits, no Parity, 2 Stop bit */ //LPC_UART->LCR = 0x8F; /* 8 bits, Parity, 2 Stop bit */ regVal = LPC_SYSCON->UARTCLKDIV; Fdiv = (((SystemFrequency/LPC_SYSCON->SYSAHBCLKDIV)/regVal)/16)/baudrate ;/*baud rate */ LPC_UART->DLM = Fdiv / 256; LPC_UART->DLL = Fdiv % 256; LPC_UART->LCR = 0x03;/* DLAB = 0 */ LPC_UART->FCR = 0x07;/* Enable and reset TX and RX FIFO. */ //LPC_UART->FCR |= (1 << 0); // LPC_UART->FCR |= (1 << 6); // LPC_UART->FCR |= (1 << 7); /* Read to clear the line status. */ regVal = LPC_UART->LSR; /* Ensure a clean start, no data in either TX or RX FIFO. */ // CodeRed - added parentheses around comparison in operand of & while (( LPC_UART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) ); while ( LPC_UART->LSR & LSR_RDR ) { regVal = LPC_UART->RBR;/* Dump data from RX FIFO */ } /* Enable the UART Interrupt */ NVIC_EnableIRQ(UART_IRQn); #if TX_INTERRUPT LPC_UART->IER = IER_RBR | IER_THRE | IER_RLS;/* Enable UART interrupt */ #else LPC_UART->IER = IER_RBR | IER_RLS;/* Enable UART interrupt */ #endif return; } |
void MainWindow::OpenSerialPort(void) { foreach (info, QSerialPortInfo::availablePorts()) { ui->comboBox->addItem(info.portName()); } serial = new QSerialPort(this); serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::TwoStop); serial->setFlowControl(QSerialPort::NoFlowControl); } |