재잼재잼의 티스토리

4. UART사용 - 초기화 본문

MCU

4. UART사용 - 초기화

재잼재잼 2019. 1. 14. 15:44

UART를 실제로 사용해볼 차례다.


UART를 사용하기 위해서 초기화를 시켜줘야하는데, ATmega128의 데이터시트를 참조해보자.



1번 줄 : CPU클럭을 나타낸다. 나는 16Mhz를 사용하고 있기때문에 16000000L을 사용하면 된다. 대부분의 라이브러리가 CPU클럭을 나타내는 이름으로 F_CPU를 사용하기 때문에, #define F_CPU 16000000L 로 작성할 수 있다.

(https://www.avrfreaks.net/forum/define-fcpu-explanation)


2~3번 줄 : baud rate를 계산하는 방법. 

데이터 시트에 따르면 위와같은 계산식으로 baud rate를 위한 UBRR값을 계산할 수 있다.


10번 줄 ~ 마지막 줄 : USART 초기화 함수.


UBRR은 16bit 레지스터이므로, 상위 8bit, 하위 8bit로 나뉜다. 계산된 UBRR값을 하위 비트부터 입력을 해주면 된다.


즉, UBRRH = ubrr >> 8; UBRRL = ubrr;로 입력될 수 있다.


UCSRB 레지스터에서는 "송신 허용(TXEN)", "수신 허용(RXEN)"을 위한 비트를 set한다.


UCSRC 레지스터에서 전송할 프레임 포멧을 결정하는데, 데이터비트의 개수, 정지비트의 개수, 패리티비트 사용 유무를 결정할 수 있다.


예제 코드에서는 8개의 데이터비트, 2개의 정지비트를 사용한다.


---------------------------------------------


기본적인 UART 초기화 방법은 Baud rate를 결정하고, UBRR에 입력, UCSRB에서 TX, RX를 허용하고, UCSRC에서 데이터 프레임을 결정 해주면 된다. 사용되는 레지스터에 대해서 알아보자.


1. UCSRA / B / C  -> USART Control and Status Register A / B / C


UART의 제어, 상태 레지스터로 A, B, C 세가지로 구성되어있다.


A레지스터에서는 주로 송/수신 상태를 표현하기위한 비트로 구성되어 있다. 이부분은 송/수신 부분에서 다시한번 알아볼 것.


다만 1번 비트인 U2Xn 비트의 경우에는 비동기모드에서 1배속/2배속을 결정하는 부분으로, 2배속을 사용할 경우에는 초기화함수에서 set 해주면 된다.

7번, 6번 5번 비트 : RXCIEn, TXCIEn, UDRIEn는 각 비트의 조건(RXCn, TXCn, UDREn이 세트될 때)이 만족했을 때, 인터럽트 발생을 허가하는 비트다. "RX/TX Complete Interrupt Enable", "UART Data Register Empty Interrupt Enable"의 이름을 가진다.


4번, 3번 비트 : RXENn, TXENn은 UART에서 송신, 수신 동작을 허가하는 비트로, 세트하면 Enable이 된다.


2번 비트 : UCSZn2는 C레지스터의 UCSZn0, 1과 함께 데이터비트의 수를 표현하기 위한 비트. "UART Character Size"의 이름을 가짐.


1번 , 0번 비트 : RXB8n, TXB8n은 데이터 비트의 수가 9개일 때, MSB(8번 비트)가 저장되는 비트.




7번 비트는 예약된 비트로 사용하지 않는다.


6번 비트 : USART Mode Selet라는 이름을 가진다. 비동기모드(0), 동기모드(1)을 결정하기 위한 비트.


5번, 4번 비트 : UART Parity Mode라는 이름을 가지며, 패리티 비트의 동작 모드를 결정하기 위한 비트.


위와같이 선택할 수 있다.


3번 비트 : UART Stop Bit Select라는 이름을 가짐. 정지비트의 개수를 결정한다. 1비트(0), 2비트(1)을 선택할 수 있다.


2번 비트, 1번 비트, B레지스터의 2번 비트 : UCSZn2~UCSZn0의 3비트로 구성되며, 전송되는 데이터프레임에서 데이터비트의 크기를 결정한다. 


위와같이 선택할 수 있다.


0번 비트 : 동기모드에서만 사용함. 비동기모드에서는 0값을 가져야 한다.


-----------------------------------


위의 레지스터를 사용해서 UART의 초기화가 가능하다. 



'MCU' 카테고리의 다른 글

6. UART 문자열 송/수신  (0) 2019.01.16
5.UART 문자 송/수신  (0) 2019.01.15
3. UART 개요  (0) 2019.01.13
2. 버튼 채터링 해결하기  (2) 2019.01.10
1. ATmega128 환경 구성  (0) 2019.01.09