티스토리 뷰

반응형

USART 레지스터 설정 방법은 아두이노 우노에 쓰이는 AVR ATmega328 데이터시트 기준으로 작성된 글 입니다.

기능별로 정리된 ATmega328 데이터시트에서 발췌한  USART Block Diagram 입니다. 





# USART 레지스터 설정 방법



1. UCSR0A (USART Control and Status Register 0 A) : UART  통신의 제어와 상태를 알아보기 위한 레지스터 중 하나




 비 

 이름 

 설명 

 7

 RXC0 

 Receive Complete : 수신 버퍼(UDR0)에 읽지 않은 문자가 있을 때는 1이되고, 버퍼가 비어있을때는 0이 된다. 

 UCSR0B 레지스터의 RXCIE0 비트와 함께 사용되어 수신 완료 인터럽트를 발생시킬 수 있다.


while(!(UCSR0A & (1<<&RXC0)) );

데이터를 수신될 때까지 기다리기 위해, 즉 RXC0 비트가 1이 될 때까지 기다리기 위해 사용



 비 

 이름 

 설명 

 6

 TXC0 

 Transmit Complete : 시프트 레지스터의 데이터가 송신되고 송신 버퍼(UDR0)가 비어 있을 때 1이 된다.

 UCSR0B 레지스터의 TXCIE0 비트와 함께 사용되어 송신 완료 인터럽트를 발생시킬 수 있다.




 비 

 이름 

 설명 

 5

 UDRE0 

 USART Data Reigster Empty : 송신 버퍼(UDR0)가 비어 있어 데이터를 받을 준비가 되어 있을때 1이 된다.

 UCS0RB 레지스터의 UDRIE0 비트와 함께 사용되어 송신 데이터 레지스터 준비 완료 인터럽트를 발생 시킬 수 있다.


  
 // UDRE0 비트 사용
void UART_transmit(unsigned char data)
{
   while( !(UCSR0A & (1<<UDRE0)) );         // 송신 가능 대기
   UDR0 = data;                             // 데이터 전송
}

데이터가 완전히 전송되고 다음 데이터를 전송할 준비가 되어 있는지를 확인 하기위해 사용 


TXC0 비트 대신 UDRE0 비트를 사용하는 이유는?



UDR은 상대적으로 빠른 CPU와 상대적으로 느린 UART 사이의 중계자 역할을 하는 버퍼이고,

시프트 레지스터는 CPU에서 보낸 병렬 데이터를 UART를 통해 보낼 수 있는 시리얼 데이터로

변환하여 전송하기 위해 필요한 레지스터 입니다.


TXC0 비트는 시프트 레지스터에서 데이터가 모두 전송되고 UDR0 레지스터에 데이터가 없는

경우 세트 됩니다.


반면에 UDRE0 비트는 UDR0 레지스터에 데이터가 없는 경우 세트 됩니다.


즉, 두 비트가 세트되는 상황에 차이가 있으며, TXC0 비트 확인을 통해 데이터 전송이 완료된

것을 확인하는 것은 UDRE0 비트 확인을 통해 데이터 전송이 완료된 것을 확인하는 것 보다

오랜 시간이 걸리게 됩니다. (TXC0 비트 대신 UDRE0 비트를 사용하는 가장 큰 이유)


또한, UDRE0 비트의 디폴트 값은 1로, 데이터를 전송할 수 있는 상태로 시작하므로 프로그램

시작과 더불어 데이터를 전송할 수 있지만, TXC0 비트의 디폴트 값은 0으로 프로그램 시작시에 

전송이 불가능한 상태로 시작됩니다. 이외에도 몇 가지 이유로 데이터 전송 시점을 결정하기 

위해서는 TXC0 비트 보다는 UDRE0 비트를 사용하는 것이 편리합니다.




 비 

 이름 

 설명 

 4

 FE0 

 Frame Error : 수신 데이터가 없는 경우 수신 값은 HIGH 상태이며, LOW 상태로 바뀌면서 데이터 프레임 수신이

                             시작되고 프레임의 마지막 정비 비트 수신 시에 다시 HIGH 상태로 바뀐다. 

 마지막에 HIGH 상태를 수신하지 못하여 프레임 수신에 오류가 발생하면 FE0은 1의 값을 가진다.




 비 

 이름 

 설명 

 3

 DOR0 

 Data Overrun Error : 수신 버퍼가 가득 찬 상태에서 수신 시프트 레지스터에 새로운 문자가 수신 완료되고

                                           다시 그 다음 문자의 시작 비트가 검출되는 오버런 상황이 발생한 경우 1의 값을 가진다.




 비 

 이름 

 설명 

 2

 UPE0 

 USART Parity Error : 수신 버퍼에 저장된 문자 데이터에 패리티 오류가 발생한 경우 1의 값을 가진다.

                                           패리티 비트 사용이 설정된 경우에만 사용할 수 있다.




 

 이름 

 설명 

 1

 U2X0 

 USART Double Transmission Speed : 비동기 전송 모드에서만 사용되며, 2배속 모드이면 1, 

                                                                            1배속 모드이면 0의 값을 가진다.




 
UCSR0A |= _BV(U2X0);
UCSR0A |= (1 << U2X0);
UCSR0A |= (1 << 1);
UCSR0A  = UCSR0A | (1 << 1);
= 의미는 모두 동일하므로, 4개 중 편한 걸 사용한다.
= '_BV'는 지정한 비트만을 1로 하고, 나머지를 0으로 하는 비트 마스크를 생성하는 매크로




 

 이름 

 설명 

 0

 MPCM0 

 1개의 마스터 프로세서가 여러 개의 슬레이브 프로세서에 특정 어드레스를 전송함으로써 

 1개의 슬레이브만을 지정하여 데이터를 전송하는 멀티프로세서 통신 모드에서 1의 값을 가진다.




2. UCSR0B (USART Control and Status Register 0 B) : 데이터 송수신을 가능하도록 설정하기 위해 사용한 레지스터

                                                                                                                 디폴트 값으로 UART 통신의 송수신은 금지되어 있다.







 비 

 이름 

 설명 

 7

 RXCIE0 

 RX Complete Interrupt Enable : 수신 완료 인터럽트 발생을 허용한다.




 비 

 이름 

 설명 

 6

 TXCIE0 

 TX Complete Interrupt Enable : 송신 완료 인터럽트 발생을 허용한다. 




 비 

 이름 

 설명 

 5

 UDRIE0 

 UDR Empty Interrupt Enable : 송신 데이터 레지스터 준비 완료 인터럽트 발생을 허용한다. 




 비 

 이름 

 설명 

 4

 RXEN0 

 RX Enable : UART 수신기의 수신 기능을 활성화 한다.


 
 UCSR0B |= _BV(RXEN0);        // 수신가능



 비 

 이름 

 설명 

 3

 TXEN0 

 TX Enable : UART 수신기의 송신 기능을 활성화 한다.


 
 UCSR0B |= _BV(TXEN0);        // 송신가능



 비 

 이름 

 설명 

 2

 UCSZ02 

 USART Character Size : UCSR0C 레지스터와 함께 전송 데이터의 비트 수를 결정한다.




 비 

 이름 

 설명 

 1

 RXB80 

 데이터가 9비트인 경우 수신 데이터의 9번째 비트 저장을 위해 사용한다.

 반드시 UDR0 레지스터보다 먼저 읽어야 한다.



 비 

 이름 

 설명 

 0

 TXB80 

 데이터가 9비트인 경우 전송 데이터의 9번째 비트 저장을 위해 사용한다.

 반드시 UDR0 레지스터보다 먼저 써야 한다.




3. UCSR0C (USART Control and Status Register 0 C) : UART 통신에서의 데이터 형식 및 통신 방법을 결정하기

                                                                                                                 위해 사용 






비트 6 UMSEL00과 비트 7 UMSEL01은 동기 또는 비동기 통신 모드를 지정하기 위해 사용된다.




비트 4 UPM00과 비트 5 UPM01은 패리티 모드를 설정하는 비트로, 

홀수 패리티, 짝수 패리티, 패리티 사용 안 함 중 선택할 수 있다.





비트 3 USBS0는 정지 비트의 수를 지정하기 위해 사용된다.




비트 1 UCSZ00과 비트 2 UCSZ01은 데이터 비트의 수를 결정하기 위해 사용되며,

이 때 UCSR0B 레지스터의 비트 2 UCSZ02가 함께 사용된다.




마지막 비트 0 UCPOL0은 클록(XCK)의 극성을 지정하는 비트로, 동기 모드에서만 사용이 가능하며,

비동기 모드에서는 0의 값을 가져야 한다. 



4. UBRR0H, UBRROL (USART Baud Rate Register 0H, 0L) : 


2개의 8비트 레지스터를 조합한 16비트 레지스터로 구성, 하위 4비트(상위4비트는 사용하지 않는다.)를 나타내는 UBRR0H, 

하위 8비트를 나타내는 UBRR0L 레지스터로 구성되어 Baud Rate를 12비트로 표현한다.







목표로 하는 전송 속도(보율)가 결정되면, 이를 UBRR0 값으로 변환하여야 하며, 변환식은 전송모드에 따라서

달라진다. 배속은 UCSR0A 레지스터의 U2X0 비트에 따라 결정된다.




fosc는 클록 주파수로, 대부분 아두이노, AVR에서는 16MHz를 사용한다.






5. UDR0 (USART Data Register) : 송수신된 데이터가 저장되는 버퍼 레지스터




UDR0 레지스터는 데이터 전송을 위한 버퍼인 TXB(Transmit Data Buffer Register) 레지스터와 데이터 수신을 위한

RXB(Receive Data Buffer Register) 레지스터로 구성되어 있지만, 동일한 입출력 주소를 사용하므로,

UDR0 레지스터에 데이터를 쓰면, TXB 레지스터에 데이터가 기록되고, UDR0 레지스터로부터 데이터를 읽으면,

RXB 레지스터의 데이터가 읽혀진다.


5,6,7 비트의 데이터 비트를 사용하는 경우에는 상위의 비트들이 사용되지 않으며, 

9비트 데이터를 사용하는 경우에는 UCSR0B 레지스터의 RXB80 비트 및 TXB80 비트와 함께 사용된다.



 Ref. 아트멜 스튜디오와 아두이노로 배우는 ATmega328 프로그래밍 (출판사 - 제이펍)


반응형
댓글