Skip to content
irmusy edited this page Sep 28, 2013 · 2 revisions

개요

uart_echo 예제는 UART 장치에 대한 읽기/쓰기를 테스트 해 볼 수 있는 간단한 예제입니다.

UART 장치는 MCU에 가장 보편적으로 사용되는 인터페이스 수단입니다. 개발 도중에도 각종 디버깅 메시지를 주고 받는 형태로 많이 사용하기에 새로운 MCU를 배우고자 할 때에는 가장 먼저 동작을 확인해 보는 장치 중 하나입니다.

본 예제에서는 UART로 부터 데이터가 수신되기를 기다렸다가 수신된 데이터를 즉시 송신 하는 형태로 구성되어 있습니다. UART 설정은 아래와 같습니다.

  • 115200bps
  • No parity bit
  • 8 data bit
  • 1 stop bit

관련 Peripheral

  • SysCtl
  • GPIO
  • UART

소스 살펴보기

27 line:

#include "hw_types.h"
#include "hw_memmap.h"

#include "sysctl.h"
#include "gpio.h"
#include "uart.h"
#include "led.h"

필요한 헤더 파일들을 include 하고 있습니다. Driver Library를 사용할 때에는 이처럼 각 장치 별로 헤더파일들을 직접 include 해 줘야 합니다. 대표 헤더 파일 하나 만들어 두고 그것만 include해서 쓰면 편할건데 왜 이렇게 하는 걸까요? 여러가지 의견이 많이 있습니다만, 처음 배우는 사람을 위해서는 이처럼 필요한 것들을 직접 include해서 사용하는 방식이 더 효과적입니다. 버그도 줄일 수 있구요.

36 line:

#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

__error__() 함수를 정의하고 있습니다. 이 함수는 Driver Library내에서 Asserition fail시 호출되는 함수 입니다. 자세한 내용은 assert를 참조하시기 바랍니다.

46 line:

int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);

main() 함수를 시작한 직후 SysCtlClockSet() 함수를 사용하여 클럭 설정을 하고 있습니다. 이 설정값은 보드에 내장된 8MHz 크리스털을 사용하고( SYSCTL_OSC_MAIN), PLL을 enbale시켜( SYSCTL_USE_PLL) 200MHz 클럭을 만든 다음, 이를 다시 4분주( SYSCTL_SYSDIV_4) 하여 최종적으로 50MHz 클럭을 사용하겠다는 뜻입니다.

52 line:

    //
    // Configure UART
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,
                        (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                         UART_CONFIG_PAR_NONE));

UART 장치를 활성화 하고 초기화합니다. LM3S8962에 내장된 UART 중 UART0 장치를 사용합니다. UART0는 GPIO port A의 PA0, PA1 핀에 연결되어 있습니다. **GPIOPinTypeUART()**함수를 사용하여 해당 핀을 UART 목적으로 사용하게끔 설정합니다.

UART0의 baudrate, data length, parity bit, stop bit 등을 원하는 형태로 설정하면 UART 설정이 끝납니다.

64 line:

    //
    // Configure GPIO to drive LED
    //
    LED_INIT();

GPIO에 연결된 LED를 초기화 하고 있습니다. UART echo의 동작 상태를 눈으로 확인할 수 있도록 1 바이트가 수신될 때 마다 LED 상태를 토글하기 위해서 입니다.

71 line:

    //
    // Loop forever.
    //
    while(1)
    {

무한 루프의 시작.

76 line:

        if (UARTCharsAvail(UART0_BASE))
        {
            LED_TOGGLE();
            UARTCharPut(UART0_BASE, UARTCharGet(UART0_BASE));
        }
    }
}

**UARTCharsAvail()**함수는 UART로 수신된 데이터가 있다면 True를 리턴하는 함수입니다. 무한 루프를 돌면서 계속해서 수신된 데이터가 있는 지 확인하고, 수신된 데이터가 없다면 아무 일도 하지 않습니다. 수신된 데이터가 있다면 LED를 토글시키고 수신된 데이터를 읽어와서( **UARTCharGet()**함수) 다시 송신( **UARTCharPut()**함수)하고 있습니다.

실행 방법 안내

  1. 펌웨어 다운로드 후 보드상의 리셋 버튼을 1회 누릅니다.
  2. PC에서 ComPortMaster를 실행하고 Stellaris-JTAG의 가상 시리얼 포트를 open 합니다. 이때 설정은 115200bps로 합니다.
  3. ComPortMaster에서 아무 데이터나 send하면 동일한 데이터가 수신창에 돌아오는 것을 확인할 수 있습니다.

Clone this wiki locally