문제 설명
다음 요구하는 기능을 만족하는 코드를 작성하라
[요구 사항]
- 코드가 실행되면 PA3에 duty 50%, 1khz 펄스가 계속 출력된다.
- KEY0를 누르면 duty 20%로 되고 KEY1을 누르면 duty 80%로 된다.
- 단, duty 20% 상태에서 다시 KEY0를 누르면 duty는 50%로 복귀해야한다.
- 마찬가지로 duty 80% 상태에서 다시 KEY1을 누르면 duty 50%로 복귀해야한다.
- 로직아날라이저에 PA3을 연결하여 파형을 확인한다.
- (주의) 필요한 주변장치 클록은 알아서 Enable해야한다.
[제출 요령]
- 코드를 완성하면 반드시 동작 확인을 받은후 강사 지시에 의하여 코드를 업로드해야 함
- 임의로 코드 제출시 해당 문항 0점 처리되므로 주의 바람
- 다른 파일에 있는 수업때 제공 또는 작성한 코드를 사용한 경우는 복사하여 제출할 필요 없음 (예) LED_Display 함수 등
- 작성 또는 기존 코드 변경한 파일의 내용(이 문제와 관련한 코드 부분만)을 모두 복사하여 제출해야 한다.
- 제출시에는 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;
void Main(void)
{
Sys_Init();
TIM2_Out_Init();
Key_ISR_Enable(1);
TIM2_Out_PWM_Generation(1000, 5);
int state_key0 = 0;
int state_key1 = 0;
for(;;)
{
if (Key_Value)
{
if (Key_Value == 1)
{
if (state_key0 == 0)
{
TIM2_Change_Duty(2);
state_key0 = 1;
}
else
{
TIM2_Change_Duty(5);
state_key0 = 0;
}
state_key1 = 0;
}
if (Key_Value == 2)
{
if (state_key1 == 0)
{
TIM2_Change_Duty(8);
state_key1 = 1;
}
else
{
TIM2_Change_Duty(5);
state_key1 = 0;
}
state_key0 = 0;
}
Key_Value = 0;
}
}
}
메모
printf 내부의 \n 습관화 필요