Home > Study > C Language > ARM System Programming > [ex18] EXTI_IRQ_LAB

[ex18] EXTI_IRQ_LAB
Study Language

문제 설명


// 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;
}

void Main(void)
{
	Sys_Init();
	Uart1_Printf("EXTI Test\n");

	// AFIO, Port-B Clock Enable

	// PB[7:6]을 입력으로 선언

	// PB[7:6]을 EXTI 소스로 설정하고 Falling edge 선택, EXTI[7:6] 인터럽트 허용

	// EXTI[7:6] Pending Clear 및 NVIC의 인터럽트 Pending clear

	// EXTI9_5 인터럽트 허용

	for(;;)
	{
		LED_Display(1);
		TIM2_Delay(500);
		LED_Display(2);
		TIM2_Delay(500);
	}
}
// stm32f10x_it.c
void EXTI9_5_IRQHandler(void)
{
  // EXTI Pending을 확인하여 눌린키의 번호를 UART로 출력한다


  // EXTI[7:6] pending 및 IRQ(EXTI9_5)의 pending clear


}

정답 코드


/* stm32f10x_it.c */

void EXTI9_5_IRQHandler(void)
{
  int x = Macro_Extract_Area(EXTI->PR, 0x3, 6);
  Uart1_Printf("%d\n", x);

  EXTI->PR = 0x3 << 6;
	NVIC_ClearPendingIRQ(23);  
}

/* main.c */

void Main(void)
{
	Sys_Init();
	Uart1_Printf("EXTI Test\n");

	Macro_Set_Bit(RCC->APB2ENR, 3);
	Macro_Set_Bit(RCC->APB2ENR, 0);

	Macro_Write_Block(GPIOB->CRL, 0xFF, 0x44, 24);
	Macro_Write_Block(AFIO->EXTICR[1], 0xFF, 0x11, 8);
	Macro_Set_Area(EXTI->FTSR, 0x3, 6);

	EXTI->PR = 0x3 << 6;
	Macro_Set_Area(EXTI->IMR, 0x3, 6);
	NVIC_ClearPendingIRQ(23);
	NVIC_EnableIRQ(23);

	for(;;)
	{
		LED_Display(1);
		TIM2_Delay(500);
		LED_Display(2);
		TIM2_Delay(500);
	}
}

메모


printf 내부의 \n 습관화 필요