LPC812 는 3채널의 UART가 있다. 20핀 소형 페키지 임에도 불구하고 3개의 UART가 있어 유용하게 사용될곳이 많을것 같다.
그리고 스위치 메트릭스라는 기능을 이용하여 UART핀을 자유롭게 맵핑할 수 있는것도 상당히 마음에 든다.
아래 그림은 LPC812의 UART 블록도 이다.
#if 1
/* connect the UART0 TXD abd RXD sigals to port pins(P0.4-P0.0)*/
regVal = LPC_SWM->PINASSIGN0 & ~( 0xFF << 0 );
LPC_SWM->PINASSIGN0 = regVal | ( 4 << 0 ); /* P0.4 is UART0 TXD, ASSIGN0(7:0) */
regVal = LPC_SWM->PINASSIGN0 & ~( 0xFF << 8 );
LPC_SWM->PINASSIGN0 = regVal | ( 0 << 8 ); /* P0.0 is UART0 RXD. ASSIGN0(15:8) */
regVal = LPC_SWM->PINASSIGN0 & ~( 0xFF << 16 );
LPC_SWM->PINASSIGN0 = regVal | ( 12 << 16 ); /* P0.12 is UART0 RTS, ASSIGN0(23:16) */
regVal = LPC_SWM->PINASSIGN0 & ~( 0xFFUL << 24 );
LPC_SWM->PINASSIGN0 = regVal | ( 13 << 24 ); /* P0.13 is UART0 CTS. ASSIGN0(31:24) */
#endif
#if 0
/* connect the UART1 TXD abd RXD sigals to port pins(P0.4-P0.0)*/
regVal = LPC_SWM->PINASSIGN1 & ~( 0xFF << 8 );
LPC_SWM->PINASSIGN1 = regVal | ( 4 << 8 ); /* P0.4 is UART1 TXD, ASSIGN1(15:8) */
regVal = LPC_SWM->PINASSIGN1 & ~( 0xFF << 16 );
LPC_SWM->PINASSIGN1 = regVal | ( 0 << 16 ); /* P0.0 is UART1 RXD. ASSIGN1(23:16) */
regVal = LPC_SWM->PINASSIGN1 & ~( 0xFFUL << 24 );
LPC_SWM->PINASSIGN1 = regVal | ( 12 << 24 ); /* P0.12 is UART1 RTS. ASSIGN1(31:24) */
regVal = LPC_SWM->PINASSIGN2 & ~( 0xFF << 0 );
LPC_SWM->PINASSIGN2 = regVal | ( 13 << 0 ); /* P0.13 is UART1 RTS, ASSIGN2(7:0) */
#endif
#if 0
/* connect the UART2 TXD abd RXD sigals to port pins(P0.4-P0.0)*/
regVal = LPC_SWM->PINASSIGN2 & ~( 0xFF << 16 );
LPC_SWM->PINASSIGN2 = regVal | ( 4 << 16 ); /* P0.4 is UART2 TXD, ASSIGN2(23:16) */
regVal = LPC_SWM->PINASSIGN2 & ~( 0xFFUL << 24 );
LPC_SWM->PINASSIGN2 = regVal | ( 0 << 24 ); /* P0.0 is UART2 RXD. ASSIGN2(31:24) */
regVal = LPC_SWM->PINASSIGN3 & ~( 0xFF << 0 );
LPC_SWM->PINASSIGN3 = regVal | ( 12 << 0 ); /* P0.12 is UART2 RTS. ASSIGN1(7:0) */
regVal = LPC_SWM->PINASSIGN3 & ~( 0xFF << 8 );
LPC_SWM->PINASSIGN3 = regVal | ( 13 << 8 ); /* P0.13 is UART2 RTS, ASSIGN2(15:8) */
#endif
LPC812의 UART는 스위치 메트릭스로 원하는 포트에 할당가능하다. 다만 부트로드의 경우 디폴트로 P0.0, P1.4에 할당되어 있다.부트로더를 이용한다면 하드웨어 설계시주의가 필요하다.
void U0_PutByte(unsigned char Data)
{
while ( !(LPC_USART0->STAT & TXRDY) );
LPC_USART0->TXDATA = Data;
}
unsigned char U0_GetByte(void)
{
while(!(LPC_USART0->STAT & RXRDY));
return LPC_USART0->RXDATA;
}
댓글을 달아 주세요