문제 설명
다음 요구하는 기능을 만족하는 코드를 작성하라
[요구 사항]
- 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 습관화 필요