Home > Study > C Language > ARM System Programming > [ex23] UART Echo-Back 하면서 LED 깜박이기

[ex23] UART Echo-Back 하면서 LED 깜박이기
Study Language

문제 설명


다음 요구하는 기능을 만족하는 코드를 작성하라

[요구 사항]

  • UART1을 통하여 PC로부터 입력 받은 글자를 다시 PC로 전송한다.
  • 타이머를 이용하여 LED0를 1초 ON, 1초 OFF를 계속 반복하도록 한다.
  • 폴링 및 인터럽트 사용여부는 무관하다.
  • 단, UART의 입출력 동작은 LED 동작과 무관하게 지연없이 동작되어야 한다.

[제출 요령]

  • 코드를 완성하면 반드시 동작 확인을 받은후 강사 지시에 의하여 코드를 업로드해야 함
  • 임의로 코드 제출시 해당 문항 0점 처리되므로 주의 바람
  • 다른 파일에 있는 수업때 제공 또는 작성한 코드를 사용한 경우는 복사하여 제출할 필요 없음 (예) LED_Display 함수 등
  • 작성 또는 기존 코드 변경한 파일의 내용(이 문제와 관련한 코드 부분만)을 모두 복사하여 제출해야 한다.
  • 제출시에는 main.c 내용을 제일 위에 놓고 그 아래에 다른 파일의 코드를 제출하되 main.c 이외 파일은 반드시 파일명을 코드 위에 적고 복사하여 제출할 것

정답 코드


// main.c
#include "device_driver.h"

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

	SCB->VTOR = 0x08003000;
	SCB->SHCSR = 0;
}

void Main(void)
{
   Sys_Init();
   Uart1_Printf("UART Echo Mode\n");

   Macro_Set_Bit(USART1->CR1, 5); // UART1 인터럽트 허용
   NVIC_ClearPendingIRQ(USART1_IRQn);
   NVIC_EnableIRQ(USART1_IRQn);

   while (1)
   {
      LED_Display(1);
      TIM2_Delay(1000);
      LED_Display(0);
      TIM2_Delay(1000);
   }
}

// stm32f10x_it.c
void USART1_IRQHandler(void)
{
  if (USART1->SR & (1 << 5))
  {  
    char ch = USART1->DR;

    while (!(USART1->SR & (1 << 7)));
    USART1->DR = ch;
  }
}

메모


printf 내부의 \n 습관화 필요