Home > Study > C Language > ARM System Programming > [ex25] 3단 밝기 조절 램프

[ex25] 3단 밝기 조절 램프
Study Language

문제 설명


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

[요구 사항]

  • 코드가 실행되면 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 습관화 필요