Home > Study > C Language > ARM System Programming > [ex21] 평가문제 2

[ex21] 평가문제 2
Study Language

문제 설명


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

[요구 사항]

  • 보드의 KEY0를 누르면 B Port 0번 핀(PB0)을 1로 KEY0를 떼면 PPB0를 0으로 출력하는 코드를 구현하라
  • 로직아날라이져 임의의 채널에 KEY0 신호와 PB0를 연결한다
  • KEY0 신호를 Falling Edge Trigger로 설정한 후 KEY0와 PB0 파형을 확인할 수 있도록 해야 한다.
  • (주의) B 포트의 클록이 활성화(전원 인가)되어야 하므로 다음 코드를 꼭 시작부분에 추가한다.
RCC_APB2ENR |= (1<<3);

[제출 요령]

  • 코드를 완성하면 반드시 동작 확인을 받은후 강사 지시에 의하여 코드를 업로드해야함
  • 임의로 코드 제출시 해당 문항 0점 처리되므로 주의 바람
  • 모든 코드는 main.c 하나의 파일에만 작성할 것
  • 다른 파일에 있는 수업때 제공 또는 작성한 코드를 사용한 경우는 복사하여 제출할 필요 없음 (예) LED_Display 함수 등
  • 코드는 작성한 main.c의 전체를 복사하여 제출할 것 (다만 작성 코드와 무관한 기존 코드는 제거할 것)

정답 코드


#include "device_driver.h"

void Key_Init(void)
{
	Macro_Write_Block(GPIOB->CRL, 0xf, 0x8, 24);
	Macro_Set_Bit(GPIOB->ODR, 6);
}

void LED_Init(void)
{
	Macro_Write_Block(GPIOB->CRL, 0xf, 0x2, 0);
	Macro_Clear_Bit(GPIOB->ODR, 0);
}

#define N	10000

int Key_Get_Pressed(void)
{
	int cnt = 0;
	int before = Macro_Extract_Area(GPIOB->IDR, 0x1, 6);
	while (1)
	{
		int after = Macro_Extract_Area(GPIOB->IDR, 0x1, 6);
		if (after == before)
		{
			cnt++;
			if (cnt >= N)
				return after == 0 ? 1 : 0;
		}
		else
		{
			cnt = 0;
			before = after;
		}
	}
}

static void Sys_Init(void)
{
	Key_Init();
	LED_Init();
	Uart_Init(115200);
}

void Main(void)
{
	Macro_Set_Bit(RCC->APB2ENR, 3);
	Sys_Init();

	int interlock = 0;
	for (;;)
	{
		if ((interlock == 0) && (Key_Get_Pressed() == 1))
		{
			Macro_Set_Bit(GPIOB->ODR, 0);  
			interlock = 1;
		}
		else if ((interlock == 1) && (Key_Get_Pressed() == 0))
		{
			Macro_Clear_Bit(GPIOB->ODR, 0);  
			interlock = 0;  
		}
	}
}

메모


printf 내부의 \n 습관화 필요