카테고리 없음
[LUMINARY] LM3S2965 UART 설정 시 주의사항
벅스바니
2010. 4. 5. 00:36
Luminary는 예전의 저가형($1~) CorTex-M1 MCU를 만들던 회사였습니다만,
작년에 TI에 인수되면서 TI Stellaris 시리즈로 라인업을 펼치고 있습니다.
현재는 CorTex-M3를 Core로 사용하고 있으며, 현재 Max. 50MHz 입니다만,
앞으로 STM과 같이 72MHz의 제품을 내놓을 예정이라고 합니다.
이 Stellaris중에서 CAN이 내장된 LM3S2965를 사용하다가 봉착한 문제였습니다.
TI에서 제공하는 라이브러리를 사용하면 별 문제 없습니다만,
이칩을 좀 더 자유롭게 쓰려면 직접 레지스터를 건드려봐야겠지요.
저도 기본 제공되는 라이브러리보다는 직접 건드리는 것을 좋아해서
직접 레지스터를 조작해서 UART를 초기화시켜보았습니다.
근데, 잘 안되는 것이었습니다. 그러나 같은 값을 지정하는 라이브러리 소스는 잘됩니다.
이유가 뭘까요... 이유는 설정 순서에 있었습니다.
매뉴얼을 차근차근 읽어보면 다음과 같이 나옵니다.
1. Disable the UART by clearing the UARTEN bit in the UARTCTL register.
UART를 Disable 시키고
2. Write the integer portion of the BRD to the UARTIBRD register.
보-레이트 레지스터를 설정하고
3. Write the fractional portion of the BRD to the UARTFBRD register.
하위 보-레이트 레지스터를 설정하고
4. Write the desired serial parameters to the UARTLCRH register (in this case, a value of0x0000.0060).
LCRH 레지스터를 설정하고
5. Enable the UART by setting the UARTEN bit in the UARTCTL register.
마지막으로 UART를 활성화 시킵니다.
이렇게까지 적어놓은 이유는, 순서를 틀리면 동작 안한다는 것입니다.
특히 2+3번과 4번의 순서를 뒤집으면 안됩니다.
LCR을 먼저 세팅하고 보레이트를 설정하면 정지해 버립니다.
실제로 테스트 해 보니 그렇더군요.
라이브러리를 쓰실 것이 아니면, 꼭! 주의 하시기 바랍니다.
참고로 제가 사용한 설정 소스입니다.
baud= ((clock*8/bps)+1)/2;
UART0_CTL_R = 0;
UART0_IBRD_R = baud/64;
UART0_FBRD_R = baud%64;
UART0_IFLS_R = 0;
UART0_LCRH_R = 0x70; //8-bit/FIFOE
UART0_FR_R = 0;
UART0_CTL_R = 0x301; //TXE/RXE/UARTE
레지스터 명칭이 마음에 안듭니다만, 기본제공되는 헤더파일이라 그냥 썼습니다.
참고하시기 바랍니다.