본문 바로가기
Embedded SW/Embedded SW Introduction

UART란? UART 예제코드 포팅 및 동작 확인 (TC275 인피니언)

by 방구석 임베디드 2022. 9. 19.
반응형

안녕하세요.

오늘은 UART 예제 코드를 포팅하고 동작시키는 작업을 수행해 보도록 하겠습니다.

현재 저는 TC275 보드(인피니언 MCU)를 구입하고

인피니언 예제코드를 이용하여

주변기기를 동작시키고 있습니다.

지금은 UART 예제 코드를 포팅하여 UART를 동작시키고

그 과정에서 UART에 대해서 추가적인 설명을 하려고 합니다

 

UART를 실제 회사에서는 잘 사용하지 않습니다.

더 좋은 통신 방법들이 많이 있기 때문입니다.

하지만 집에서 우리가 개발을 수행할 때에는

저렴한 가격으로 UART를 이용하여

디버깅을 수행할수 있으며, 컴퓨터를 이용한 다양한 control이 가능해 집니다.

 

또한 UART 기반으로 다양한 모듈 IC들이 

시중에 판매되고 있기 때문에

무선 통신과 같은 아주 재미있는 동작도

수행해 볼 수 있습니다.

그러면 이제 인피니언 MCU TC275를 이용하여 UART를 동작시켜보도록 하겠습니다.

그 전에 UART에 대한 사전 공부가 어느정도 필요합니다.

제가 예전에 쓴글이 있는데

먼저 아래글을 참고해 주시기 바랍니다.

살짝 겹치기도 하기 때문에 그 점 감안해 주시기 바랍니다.

https://embeddedchallenge.tistory.com/237

 

UART 통신 정리, UART 통신 MCU 설계 (인피니언 MCU)

안녕하세요. 오늘은 UART 통신에 대해서 정리하고, 인피니언 MCU(TC275)를 이용하여 UART 통신을 수행해 보는 시간을 가지도록 하겠습니다. 참고로 이 글은 개발의 전체적인 내용을 연재하고 있는 글

embeddedchallenge.tistory.com

그러면 이제 포팅을 수행해 보도록 하겠습니다.

 

아래 예제 코드는 인피니언에서 제공해 주는

UART 예제 코드입니다.

여기서는 UART를 ASC라고 표현하고 있습니다.

그러면 이제 포팅을 수행해 보도록 하겠습니다.

작업한 코드는 아래에서 다운을 받을 수 있는 링크가 있으니 참고해 주시기 바랍니다.

포팅이 끝났습니다.

포팅된 코드에서 UART를 초기화 시키는 함수와

UART 통신을 통해서 데이터를 Tx하는 함수 이렇게

함수들이 이루어져 있는것을 확인 할 수 있습니다.

static void Driver_Asc0_Init(void)
{
    /* create module config */
    IfxAsclin_Asc_Config ascConfig;
    IfxAsclin_Asc_initModuleConfig(&ascConfig, &MODULE_ASCLIN0);

    /* set the desired baudrate */
    ascConfig.baudrate.prescaler    = 1;
    ascConfig.baudrate.baudrate     = 9600; /* FDR values will be calculated in initModule */
    ascConfig.baudrate.oversampling = IfxAsclin_OversamplingFactor_4;

    /* ISR priorities and interrupt target */
    ascConfig.interrupt.txPriority    = ISR_PRIORITY_ASC_0_TX;
    ascConfig.interrupt.rxPriority    = ISR_PRIORITY_ASC_0_RX;
    ascConfig.interrupt.erPriority    = ISR_PRIORITY_ASC_0_EX;
    ascConfig.interrupt.typeOfService = (IfxSrc_Tos)IfxCpu_getCoreIndex();

    /* FIFO configuration */
    ascConfig.txBuffer     = g_AsclinAsc.ascBuffer.tx;
    ascConfig.txBufferSize = ASC_TX_BUFFER_SIZE;

    ascConfig.rxBuffer     = g_AsclinAsc.ascBuffer.rx;
    ascConfig.rxBufferSize = ASC_RX_BUFFER_SIZE;

    /* pin configuration */    
    const IfxAsclin_Asc_Pins pins = {
        NULL_PTR,                     IfxPort_InputMode_pullUp,        // CTS pin not used
        &IfxAsclin0_RXB_P15_3_IN, IfxPort_InputMode_pullUp,        // Rx pin
        NULL_PTR,                     IfxPort_OutputMode_pushPull,     //RTS pin not used
        &IfxAsclin0_TX_P15_2_OUT, IfxPort_OutputMode_pushPull,     // Tx pin
        IfxPort_PadDriver_cmosAutomotiveSpeed1
    };        
    ascConfig.pins = &pins;

    /* initialize module */
    IfxAsclin_Asc_initModule(&g_AsclinAsc.drivers.asc0, &ascConfig);

    g_AsclinAsc.count = 1;    
}

void Driver_Asc_Init(void)
{
    Driver_Asc0_Init();
}

void Driver_Asc0_TxTest(void)
{    
    g_AsclinAsc.count = 1;

    g_AsclinAsc.txData[0] = 'a';

    /* Transmit data */
    IfxAsclin_Asc_write(&g_AsclinAsc.drivers.asc0, g_AsclinAsc.txData, &g_AsclinAsc.count, TIME_INFINITE);
}

위의 코드는 포팅을 한 후에,

제가 1차적으로 refactoring 한 것입니다.

그리고 UART를 설계할때 중요한 파라미터가 몇가지 있는데

그중에서 가장 중요한 파라미터는 BaudRate 설정 부분입니다.

위의 예제코드에서는

UART Buad Rate을 9600bps로 설정하였습니다.

즉 1초에 9600개의 비트를 전달할수 있다는 것을 의미합니다.

그리고 Driver_Asc0_TxTest 함수를 사용하여

10ms 마다 'a'를 날려 보도는 코드를 작성하였습니다.

static void AppTask10ms(void)
{
    
    stTestCnt.u32nuCnt10ms++;
    Unit_Mode();  

    /*ADC Test*/
    Driver_Adc0_ConvStart();

    /*ASC Test*/
    Driver_Asc0_TxTest();
}

이제 UART 핀연결을 생각해 보도록 하겠습니다.

UART는 Tx와 Rx 핀 연결이 필요합니다.

Tx : p15.2

Rx : p15.3

이렇게 사용하도록 하겠습니다.

지금 Tx, Rx는 MCU 전압 레벨로 정보를 전달하고 있습니다.

따라서 이 전압레벨을 USB로 연결시켜 컴퓨터가 인지할수 있는 변환장치가 필요한데

TTL 모듈이 바로 그 역할을 수행합니다.

TTL 모듈은 MCU Tx라인을 TTL Rx에 연결해야하며

MCU Rx라인을 TTL Tx에 연결해야 합니다.ㅎ

그러면 한번 Tera Term을 연결해 보도록 하겠습니다.

혹시 Tera Term에 대해서 조금 더 내용이 알고 싶으신 분은

 

 

예전에 쓴 글을 한번 참고해 보시기 바랍니다.

Teraterm 시리얼 통신 터미널 프로그램 사용법, 다운로드 방법 (feat 허큘리스)

 

연결 방법은 아래와 같습니다.

오케이 정확하게 원하는데로 나오는 것을 확인 할 수 있습니다.

이제 10ms마다 a를 컴퓨터의 테라텀으로 전달하고 있는지를 살펴 보도록 하겠습니다.

MCU에서 UART를 이용하여 전달하는 신호를 노트북에서 잘 받고 있는것을 확인 할 수 있습니다.

그러면 이제

Rx 인터럽트를 연결해 보도록 하겠습니다.

테라텀에서는 수신만 할수 있는것이 아니라 전송도 할수 있습니다.

이때 MCU는 테라텀을 통해 전송된 데이터를 받을 것입니다.

만일 데이터를 받으면 인터럽트를 띄워야 하기 때문에

이 부분을 연결시키는 코드가 필요합니다.

void ASC_Tx0IntHandler(void)
{
    IfxAsclin_Asc_isrTransmit(&g_AsclinAsc.drivers.asc0);
}

void ASC_Rx0IntHandler(void)
{
    IfxAsclin_Asc_isrReceive(&g_AsclinAsc.drivers.asc0);
    IfxAsclin_Asc_read(&g_AsclinAsc.drivers.asc0, g_AsclinAsc.rxData, &g_AsclinAsc.count, TIME_INFINITE);    
    
    g_AsclinAsc.txData[0] = g_AsclinAsc.rxData[0];
    IfxAsclin_Asc_write(&g_AsclinAsc.drivers.asc0, g_AsclinAsc.txData, &g_AsclinAsc.count, TIME_INFINITE);
}

제가 창에 M를 입력하면

컴퓨터로 보낸 UART 신호를 받아서

MCU에서 받게 되고 ASC_Rx0InitHandler가 Call이 되게 되고

이 함수안에서 바로 다시 테라텀으로 전달받은 값을 날리도록 되어 있습니다.

따라서 테라텀 창에서는 M이라는 정보가 보이게 될것입니다.

 

마치 메모장과 같은 동작형테라고 생각하시면 될것 같습니다.

이렇게 하면 아래와 같은 Hello World! 가 테러텀에 띄어지게 되는것을 보실 수 있습니다.

이렇게 UART의 Tx, Rx를 뚫어 놓으면

더 많은 곳에서 응용을 할 수 있게 됩니다.

 

다음 장에서는 신호분석기를 이용하여 UART 신호를 한번 분석해 보는 시간을 가지겠습니다.

 

해당 코드는 아래를 링크에서 다운로드 가능하오니 

참고해 주시기 바랍니다.

https://cafe.naver.com/binaryembedded/115

 

감사합니다.

반응형

댓글