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