문제 설명
// 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 습관화 필요