Home > Study > C Language > ARM System Programming > [ex26] 타자왕

[ex26] 타자왕
Study Language

문제 설명


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

[요구 사항]

  • 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 습관화 필요