各位大侠,小弟现在在搞一块LPC1114的板子,用的坏境是IAR6.3,在测试uart时,发现用IAR上自带的例程可以收发,例程是用中断将受到的数据在用查询发回电脑。但是我自己加了个发字节的函数都总是发不了,请同事也看过了,也找不到原因。现在有点困扰,想请大家帮忙看看。
附上代码 除了 UARTSendByte 其他都是例程自带的。
中断处理- /*****************************************************************************
- ** Function name: UART0_IRQHandler
- **
- ** Descriptions: UART interrupt handler
- **
- ** parameters: None
- ** Returned value: None
- **
- *****************************************************************************/
- #pragma diag_suppress=Pa082
- void UART0_IRQHandler(void)
- {
- uint8_t IIRValue, LSRValue;
- uint8_t Dummy = Dummy;
- IIRValue = LPC_UART->IIR; // interrupt ID Register
-
- 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 clear
- interrupt, 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 */
- UARTBuffer[UARTCount++] = LPC_UART->RBR;
- if (UARTCount == BUFSIZE)
- {
- UARTCount = 0; /* buffer overflow */
- }
- }
- }
- else if (IIRValue == IIR_RDA) /* Receive Data Available */
- {
- /* Receive Data Available */
- UARTBuffer[UARTCount++] = LPC_UART->RBR;
- if (UARTCount == BUFSIZE)
- {
- UARTCount = 0; /* buffer overflow */
- }
- }
- 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;
- }
- }
- return;
- }
- #pragma diag_default=Pa082
发送字符串- *****************************************************************************
- ** Function name: UARTSend
- **
- ** Descriptions: Send a block of data to the UART 0 port based
- ** on the data length
- **
- ** parameters: buffer pointer, and data length
- ** Returned value: None
- **
- *****************************************************************************/
- void UARTSend(uint8_t *BufferPtr, uint32_t Length)
- {
-
- while ( Length != 0 )
- {
- /* THRE status, contain valid data */
- #if !TX_INTERRUPT
- LPC_UART->THR = *BufferPtr;
- while ( !(LPC_UART->LSR & LSR_THRE) ); //polling
-
- #else
- /* Below flag is set inside the interrupt handler when THRE occurs. */
- while ( !(UARTTxEmpty & 0x01) );
- LPC_UART->THR = *BufferPtr;
- UARTTxEmpty = 0; /* not empty in the THR until it shifts out */
- #endif
- BufferPtr++;
- Length--;
- }
- return;
- }
发字节- /*****************************************************************************
- ** Function name: UARTSendByte
- **
- ** Descriptions: Send a block of data to the UART 0 port based
- ** on the data length
- **
- ** parameters: buffer pointer, and data length
- ** Returned value: None
- **
- *****************************************************************************/
- void UARTSendByte(uint8_t dat)
- {
-
- LPC_UART->THR = dat;
- while ( !(LPC_UART->LSR & LSR_THRE) ); //polling
-
- }
main- int main (void) {
- SystemInit();
- /* NVIC is installed inside UARTInit file. */
- UARTInit(9600);
- #if MODEM_TEST
- ModemInit();
- #endif
-
- UARTSendByte(0xaa);
-
- while (1)
- {
- /* Loop forever */
-
- if ( UARTCount != 0 )
- {
- LPC_UART->IER = IER_THRE | IER_RLS; /* Disable RBR */
-
- UARTSendByte(0xaa);
- UARTSend( (uint8_t *)UARTBuffer, UARTCount );
-
- UARTCount = 0;
- LPC_UART->IER = IER_THRE | IER_RLS | IER_RBR; /* Re-enable RBR */
- }
- }
- }
|