이번 포스팅에서는 비동기 직렬 통신인 UART에 대한 프로그램을 작성해보겠습니다.

먼저 STM32에서 UART 통신을 통해 문자 'A', 'B', 'C'를 차례로 PC로 전송하는 코드에 대해 알아보겠습니다.

#include "device_driver.h"

static void Sys_Init(void)
{
	Clock_Init();
	LED_Init();
	Uart_Init(115200);
	Key_Poll_Init();
}

#if 1
void Main(void)
{
   Sys_Init(); // H/W 초기화

   // A B C 3글자를 보냄
   // flag check
   // DE <- A
   

   // flag check
   // DE <- B
   

   // flag check
   // DE <- C

   // 1. 문자 'A' 전송
   while(!Macro_Check_Bit_Set(USART1->SR, 7));
    USART1->DR = 'A';

   // 2. 문자 'B' 전송
   while(!Macro_Check_Bit_Set(USART1->SR, 7));
    USART1->DR = 'B';

   // 3. 문자 'C' 전송
   while(!Macro_Check_Bit_Set(USART1->SR, 7));
    USART1->DR = 'C';
}
#endif

소스 코드를 분석하기에 앞서 USARTx->SRUSART의 상태를 확인하는 기능이고 USARTx->DRUSART의 송수신 데이터를 읽거나 쓰는 역할을 담당합니다.

while(!Macro_Check_Bit_Set(USART1->SR, 7));
    USART1->DR = 'A';

소스 코드에서 위 부분이 반복되는 것을 확인할 수 있습니다. while(!)는 while문 안에 조건을 만족할 때까지 무한 대기를 하고 조건을 만족하면 탈출하라는 의미를 가지고 있습니다.

**Macro_Check_Bit_Set(USART1->SR, 7)**에서 SR 레지스터의 7번 bit인 TXE의 값이 1인지 체크하게 됩니다. 전송 레지스터가 비어 새 문자를 쓸 수 있을 때까지 기다리는 역할을 하는 것을 알 수 있습니다. 즉 전송 가능 여부를 확인하는 코드입니다.

**USART1->DR = 'A'**는 USART1의 데이터 레지스터에 문자 'A'를 써서 전송하는 코드입니다.

image.png

전송 결과를 TeraTerm을 통해 확인하면 터미널에 'ABC'가 출력되는 것을 확인할 수 있습니다.

다음은 PC로부터 들어온 글자를 다시 PC로 Echo Back하는 프로그램을 설계해보도록 하겠습니다.

#include "device_driver.h"

static void Sys_Init(void)
{
	Clock_Init();
	LED_Init();
	Uart_Init(115200);
	Key_Poll_Init();
}

void Main(void)
{
	Sys_Init();
	Uart_Printf("UART Echo-Back Test\\n");

    for (;;)
    {  
        char x;

        while(!Macro_Check_Bit_Set(USART1 -> SR, 5));
        x = USART1->DR; 

        while(!Macro_Check_Bit_Set(USART1 -> SR, 7));
        USART1->DR = x;
    }
}

우선 **Macro_Check_Bit_Set(USART1 -> SR, 5)**에서 수신 버퍼에 데이터가 있는지 확인합니다. 수신된 데이터가 있다면 그 값을 읽어서 변수 x에 저장해줍니다. 이때 x = USART1->DR에서 DR을 읽으면 RXNE 플래그가 자동으로 clear 됩니다.

**Macro_Check_Bit_Set(USART1 -> SR, 7)**에서 송신 버퍼가 비어있는 것을 확인하고 USART1->DR = x에서 x에 값을 써 송신하는 것을 알 수 있습니다.

image.png

TeraTerm을 통해 결과를 확인하면 PC로부터 들어온 글자를 다시 PC로 Echo Back 하는 것을 확인할 수 있습니다.

이번에는 키보드로 10개의 문자를 입력 받아 Echo Back 한 뒤 LED를 Toggling 하는 실습을 해보도록 하겠습니다. LED가 Toggling 할 때 'x'를 누르면 프로그램이 종료되고 다시 문자를 입력 받도록 설계 하였습니다