안녕하세요.
오랜만에 NXP Driver 개발에 대해서 글을 연재 하려고 합니다.
시간이 될때 하나씩 쓰면 좋을 것 같습니다.
오늘은 MPC5643L을 이용하여 UART를 초기화 하는 방법을 확인해 보도록 하겠습니다.
그리고 그 과정에서 가장 중요한 Buad Rate 설정을 자세히 알아 보도록 하겠습니다.
UART에 대한 기본적은 내용은 아래 글을 참고해 주세요.
https://embeddedchallenge.tistory.com/237
정리하면, 우리는 MPC5643L이라는 MCU안에 있는 UART 모듈을 이용하여
아래와 같은 전기신호를 만들어 줄것입니다.
이 전기신호는 약속된 프레임을 가지고 있습니다.
그리고 그 프레임안에는 전압을 이용하여 데이터를 전달합니다.
그러면 지금부터 MPC5643L 을 이용한 UART 설계를 수행해 보로고 하겠습니다.
아래의 설계는 예제코드를 레지스터 단위로 하나씩 분석을 수행한 것입니다.
이렇게 분석을 수행하면 우리가 원하는데로 설정을 변경하여 사용할 수 있습니다.
1. UART0 모듈을 초기화 해보도록 하자!
1) INIT mode 진입 수행
LINFlexD_0.LINCR1.R = 0x0081; /* SLEEP=0, INIT=1 */
먼저 우리는 LINFlexD_0 번 모듈을 사용할 것입니다.
그런데 위의 레지스터에서 0x0081을 설정한다는 것은 어떠한 뜻일까요?
1000 0001
따라서 BF와 INIT를 초기화 설정하고 있다는 것을 확인 할 수 있습니다.
여기서 INIT 레지스터를 살펴보면 초기화 모드로 변경을 요청하는 레지스터라는 것을 알 수 있습니다.
2) INIT mode 가 끝날때 까지 기다림
이제 INIT mode에 진입할때까지 기다릴 것입니다.
코드는 아래와 같습니다.
while (0x1000 != (LINFlexD_0.LINSR.R & 0xF000)) {}
코드를 살펴 보도록 하겠습니다.
Lin status register의 상위 4비트의 값을 비교하고 있는 것을 확인 할 수 있습니다.
그리고 그 값이 1이면 while 구문을 빠져나오는 것을 확인 할 수 있습니다.
1의 의미는 아래와 같습니다.
즉, Init 모드로 진입을 했다는 것을 뜻합니다.
3) UART mode 설정
이제 Init Mode에 들어왔으니 UART mode를 설정해 보도록 하겠습니다.
LINFlexD_0.UARTCR.R = 0x0001; /* set the UART bit first to be able to write the other bits */
여기서 UART라는 비트를 1로 설정하는 이유는 무엇일까요?
MPC5643L에 들어있는 UART 모듈은 LIN 또는 UART로 사용이 가능합니다.
저는 1로 설정하여 uart로 사용하도록 하겠습니다.
위에서 보이시지요?
이 설정은 initialization mode에서 수행해야 합니다.
그래서 우리는 먼저 Init Mode로 진입을 한것입니다.
그러면 바로 다음 설정을 해보도록 하겠습니다.
바로 RxEn, TxEn 비트를 1로 설정하고
WL0도 1로 설정을 합니다.
LINFlexD_0.UARTCR.R = 0x0033 | TXFIFO<<8 | RXFIFO << 9;
이것은 Rx와 Tx를 Enable 한다는 의미를 가지고 있습니다.
즉, 나는 이 UART 모듈을 이용하여 Tx도 수행하고 Rx도 수행하기 위해서 미리 Enable을 수행한다는 의미입니다.
그리고 WL0의 값을 보면 1
WL1을 0으로 설정했는데
이 의미를 살펴보면
01 이므로 PCE를 0로 설정하여 parity 비트를 없이 사용하겠다는 의미입니다.
즉, UART의 checksum 기능을 사용하지 않겠다는 의미이네요.
마지막으로 아래 비트의 의미를 살펴보면
| TXFIFO<<8 | RXFIFO << 9;
이 말은 Rx와 Tx를 Fifo 모드를 사용해서 쓰겠다는 의미입니다.
Buffer 모드와 Fifo 모드의 차이점에 대해서는 추후 더 자세히 설명을 드리도록 하겠습니다.
우선 간단하게 정리하면
Rx와 Tx는 아래와 같은 버퍼를 사용하고 있습니다.
Tx의 경우 FIFO모드를 사용하면 아래와 같이 한개의 바이트만을 사용하게 됩니다.
하지만 Buffer Mode일 경우 0~4바이트를 사용할수 있습니다.
FIFO는 First Input First Output의 의미로 처음들어온놈이 먼저 나간다라는 의미입니다.
Rx의 경우는 아래와 같습니다.
4) Baudrate 설정
이제부터 UART의 핵심인 baudrate를 설정하는 부분을 확인해 보도록 하겠습니다.
먼저 아래 그림을 보면 LINFlexD의 Baud Clock은 HALFSYS_CLK를 사용하고 있음을 확인 할 수 있습니다.
즉, 우리는 120MHz의 System Clock을 사용하고 있기 때문에 60MHz의 Half Clock을 사용하게 되는 것입니다.
하지만 MPC5643L은 Module Clock을 아래 Peripheral Set 0 Clock을 사용하고 있습니다.
현재 Peripheral Set 0 Clock은 20MHz로 설정을 한 상태입니다.
그렇다면 가장 9600 baudrate를 만들어 보도록 하겠습니다.
LFDIV = peripheral set 0 clock / (16 * desired baudrate)
LINIBRR = integer part of LFDIV
LINFBRR = 16 * fractional part of LFDIV (after decimal point)
위의 내용은 공식을 의미합니다.
만일 9600bps를 만들고 싶으면 아래와 같이 LINIBRR과 LINFBRR레지스터를 설정하면 됩니다.
for instance:
LFDIV = 20000000/(16*9600) = 130.208
LINIBRR = 130
LINFBRR = 16*0.208 = 3.328 => 가장 가까운 정수값은 3입니다.
위의 레퍼런스 메뉴얼의 예제를 한번 더 확인해 보도록 하겠습니다.
우리는 25.62의 LFDIV를 만들고 싶습니다.
먼저 25의 값이 LINIBRR에 들어가게 됩니다.
그리고 0.62 * 16의 값이 9.92이고 가장 가까운 정수값이 10이므로 10을 넣어주게 됩니다.
현재 1M bps로 만들어 주고 싶다면
그러면
LINIBRR = 4
LINFBRR = 1
이렇게 설정하면 되겠네요.
그러면 Test를 한번 수행해 보도록 하겠습니다.
아래와 같이 하나의 비트의 시간간격이 1us인것을 확인 할수 있습니다.
즉 1MHz의 baud rate을 가진다는 것을 확인 할 수 있네요.
위에서는 abc를 전송하고 있습니다.
이제 인터럽트 설정을 해보도록 하겠습니다.
5) Rx 인터럽트 설정
여기서 DRIE 비트를 1로 설정합니다.
LINFLEX_0.LINIER.R = 0x4;
이것의 의미는 무엇일까요?
Rx를 받으면 인터럽트를 발생하겠다는 의미입니다.
6) NORMAL mode 진입
LINFlexD_0.LINCR1.R = 0x0080; /* INIT=0 */
그리고 INIT를 다시 0으로 만들어 주어서 Normal Mode로 천이해 보도록 하겠습니다.
이것으로 UART 초기화가 끝나게 되었습니다.
이제부터 Pin 설정 및 인터럽트 라우터 설정을 해보도록 하겠습니다.
2.SIUL 초기화
지금부터 Pin설정에 대해서 초기화 해 보도록 하겠습니다.
우선 PB2 pin을 UART0 Tx pin으로 사용할 것입니다.
그리고 PB3 pin을 UART0 Rx pin으로 사용할 것입니다.
설정은 아래와 같습니다.
먼저 Tx 설정은 PA의 값을 1로 설정하여 pin의 사용목적을 UART Tx로 설정합니다.
그리고 나서 Output Buffer를 Enable 하고
Slew Rate Control 값을 Fastest로 설정하도록 하겠습니다.
Slew Rate는 빠르면 빠를수록 전압을 빠르게 만들어 줍니다.
이건 나중에 더 정리해 보도록 하겠습니다.
Rx설정은 먼저 Input Buffers의 값을 Enable 하는 것으로 시작합니다.
그리고 나서 PSMI[31]의 PADSEL값을 0으로 설정합니다.
3.INTC PSR 설정
79번의 우선순위를 1로 설정합니다.
NXP의 해당 인터럽트가 이미 테이블로 지정이 되어 있습니다.
UART Rx의 경우에는 79번 입니다.
이제 초기화 설정이 전부 마무리가 되었습니다.
이제 부터 , 하나하나씩 UART 이용하여 Tx 및 Rx를 해보도록 하겠습니다.
이상으로 UART 초기화 설정, Buad Rate 설정을 마치도록 하겠습니다.
'Embedded SW > [NXP] Embedded SW Project' 카테고리의 다른 글
[NXP] 08. Timer Interrupt를 사용해 보자 (NXP 32 bit MCU) (0) | 2021.05.07 |
---|---|
[NXP] 07. LED를 점등해 보도록 하자! (DIO 제어) (6) | 2021.05.07 |
[NXP] 06. MPC5643L 예제코드 / 메뉴얼 (0) | 2021.05.07 |
[NXP] 04. Makefile을 직접 만들기 (1편) (1) | 2020.04.05 |
[NXP] 03.MPC5643L IDE Project 생성 및 컴파일 (1) | 2020.04.02 |
댓글