문제 설명
다음 요구하는 기능을 만족하는 코드를 작성하라
[요구 사항]
- 3초 동안에 KEY0가 눌린 횟수를 구하여 UART로 인쇄하는 코드를 구현하라.
- Chattering 문제는 고려할 필요가 없으며 프로그램이 시작된 후 처음 KEY0가 눌린 시점부터 3초 측정을 시작하며 3초가 종료되면 그때까지 눌린 KEY0 횟수를 인쇄한다.
- 단, KEY0가 한번 눌리면 한번만 Count 되어야 한다. 즉, 오래 눌리고 있어도 한번으로 인정되어야 한다.
- 인터럽트 사용 여부는 무방하며 동작 검사를 받은 후 코드를 Bash 언어로 제출한다.
[제출 요령]
- 코드를 완성하면 반드시 동작 확인을 받은후 강사 지시에 의하여 코드를 업로드해야 함
- 임의로 코드 제출시 해당 문항 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;
}
extern volatile int Key_Value;
extern volatile int TIM4_Expired;
void Main(void)
{
Sys_Init();
Key_ISR_Enable(1);
int cnt = 0;
int state = 0;
int pls_state = 0;
for(;;)
{
if (Key_Value)
{
if (state == 0)
{
TIM4_Repeat_Interrupt_Enable(1, 1000);
state = 1;
cnt = 1;
}
else
{
cnt++;
}
Key_Value = 0;
}
if (TIM4_Expired)
{
pls_state++;
if (pls_state >= 3)
{
TIM4_Stop();
state = 0;
Uart1_Printf("%d\n", cnt);
pls_state = 0;
}
TIM4_Expired = 0;
}
}
}
// stm32f10x_it.c
volatile int Key_Value = 0;
void EXTI9_5_IRQHandler(void)
{
Key_Value = Macro_Extract_Area(EXTI->PR, 0x1, 6);
EXTI->PR = 0x1<<6;
NVIC_ClearPendingIRQ(23);
}
메모
printf 내부의 \n 습관화 필요