이것들은 대체 뭐하는 것들인가?

UART 와 TBX, 말로만 들으면 통 무슨 말인지 감이 잡히지 않는다. 알아듣기 쉽게 설명해 보겠다.

  1. UART : 시리얼 포트를 통해서 통신을 하게 해주는 역할을 한다.
  2. 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 에 뿌려진다.

  • computer/digitalarena/uart_와_tbx.txt
  • Last modified: 3 years ago
  • by likewind