이것들은 대체 뭐하는 것들인가?
UART 와 TBX, 말로만 들으면 통 무슨 말인지 감이 잡히지 않는다. 알아듣기 쉽게 설명해 보겠다.
- UART : 시리얼 포트를 통해서 통신을 하게 해주는 역할을 한다.
- TBX : ST 스펙에서는 toolbox 의 약자로 설명했다. uart 와 물려 돌아갈 때 비로소 진가(?)를 발휘할 수 있다.
두 개를 비교해봤을 때, UART 가 먼저 open 되어야 한다. 그리고 나서 TBX 가 open 된다. 그렇다면, 왜 UART 를 쓰는가? 이유는 디버깅 때문이다. 나중에 수백대 내지 수만대를 양산할 경우, 디버깅을 하기 위해서 각각의 보드마다 DCU 를 구입할 수는 없기 때문이다. 그럴 때는 시리얼 포트로 메세지를 뿌려서 볼 수 밖에는 없다.
원래 임베디드 시스템에서 여러가지 포트를 제공하지만, 가장 기본 적인 포트가 바로 시리얼 포트다. 이유는 여러가지가 있겠지만, 가장 간단하고, 저렴하게 만들 수 있기 때문이다.
ST5517 에서는 시리얼 통신을 위해, stuart 라는 api 를 제공하고 있다. 이 api 를 이용해서 stuart 디바이스를 open 해주어야 한다. 그리고 나서, 시리얼 통신 프로그램(ex: 하이퍼 터미널, minicom )으로 테스트를 해본다.
일단 UART 를 테스트해보고, 나서 TBX 를 테스트해 볼 것이다.
UART 테스트
5517ref 디렉토리아래에 uart 테스트 프로그램이 들어있다. 잘 연결해서 실행만 하면 된다. 이 때 몇가지 수정을 해주어야 한다.
stm\5517ref\src\stuart\tests 아래에 있는 makefile 을 보자!!
ST20_IMPORTS := sttbx stboot stpio stcommon stuart ST20_TARGETS := uart_test.lku soak.lku terminal.lku rtscts.lku xonxoff.lku \ // 이 부분에서, terminal.lku 만 남기고 모두 지운다. producer.lku consumer.lku ST40_IMPORTS := sttbx stboot stpio stuart stcommon os20emu ST40_TARGETS := uart_test.exe producer.exe consumer.exe terminal.exe soak.exe rtscts.exe
그리고 나서 컴파일한 후에, 실행해보자!! 테스트를 위해서 시리얼 통신 프로그램이 있어야 한다. 여러가지가 있지만, 여기서는 하이퍼 터미널을 이용하기로 한다. 아래와 같이 세팅해주기 바란다.
비트 | 38400 (만일 글씨가 깨져나온다면, 프로그램 소스를 보고 속도를 조절하기바란다) |
데이터비트 | 8 |
패리티 | 짝수 |
정지비트 | 1 |
흐름제어 | 없음 |
프로그램을 돌리고 나서, 하이퍼 터미널에 아무 글자나 입력해보자!! 터미널 창에 글자가 찍히는가?? 그렇다면, 성공이다. 이번에는 터미널 창에 'abcdefghijklmn' 을 뿌리는 프로그램을 만들어보자!! 우선 소스파일을 수정해야 한다. stm\5517ref\src\stuart\tests\uart_test.c 파일을 열어보자. 중간에 아래와 같은 부분이 있을 것이다.
/* Timeout Params */ RxTimeout = 10; TxTimeout = 100; UART_DebugPrintf(("%d.0: Terminal\n", TestParams->Ref)); UART_DebugMessage("Purpose: Test discontinuous delivery of data."); { U32 NumberRead; U32 NumberWritten; U8 RxBuf[1024] = { 0 }; U8 CmdBuf[1024] = { 0 }; U8 Mode = 0; char TestMessage[] = "abcdefghijklmn"; // 바로 이줄 추가 UART_DebugMessage("Terminal started."); /* Try a read/write cycle */ error = STUART_Write(Handle, // 이 함수를 추가해준다. (U8 *)TestMessage, strlen(TestMessage), &NumberWritten, TxTimeout ); for (;;) { error = STUART_Read(Handle, RxBuf, 100, &NumberRead, RxTimeout ); /* Should timeout every .5secs */ if((error != ST_NO_ERROR) && (error != ST_ERROR_TIMEOUT)) { UART_DebugPrintf(("STUART_Read() %s, NumberRead = %u", error, NumberRead)); }
수정해준뒤에 컴파일하고, 실행해보자! 터미널에 알파벳이 뿌려질 것이다.
TBX 테스트
여기서 TBX 의 역할은 UART 를 통해서 메세지들을 뿌려주는 것이다. 우리가 출력문을 쓸 때, 5517 에서는 크게 두가지가 쓰인다.
'printf' 와 'sttbx_print' 그것이다. 두개 모두 출력문이지만, 조금 다르다. printf 문은 무조건 출력을 DCU 로 내보낸다. sttbx_print 는 DCU 또는 UART 로 보낸다. 한마디로 콘트롤이 가능하다. 이것은 sttbx() 를 초기화할 때 정해줄 수 있다.
이것 역시 5517ref 안에 테스트 프로그램이 있다. 테스트 프로그램을 돌려보면, 테스트 중간에 출력 방향을 UART 로 보냈다가, DCU 로 보냈다가를 테스트 한다. 제대로 나온다면, 성공이다. 플래시에 구워서 확인해보자! DCU 없이도 가능한지 말이다.
현재 세팅상태
10월 14일 현재, DACS1000 의 경우에, STUART 와 STTBX 가 포팅되어 있다. 그래서 시리얼 포트에 연결하고나서 프로그램을 돌리면, sttbx_print 로 선언된 출력문들은 모두 UART 에 뿌려진다.