6장 - 예제1

조재훈·2023년 6월 16일

Interrupt 방식으로 Switch 처리

  • 파란 LED는 0.1초 간격으로 토글
  • 적색 LED는 유저 푸쉬버튼 스위치로 인터럽트 처리하여 스위치 누를 경우 ON

요구사항

  • USER 버튼 사용
  • BLUE 버튼은 0.1초 주기로 On/Off 반복
  • USER 버튼이 LOW에서 HIGH로 갈 때 인터럽트 발생
  • 인터럽트 발생시 적색 LED On

Pin Map

  • ETH Disable

NVIC

  • System Core - GPIO - NVIC - EXTI Enabled

GPIO

  • PC13
    : User Button. External Interrupt
    : GPIO Mode : Rising Edge

Code

stm32f4xx_it.c

  • EXTI15_10_IRQHandler(void) function generated
  • 인터럽트 세팅시 stm32f4xx_it.c에 반드시 관련 함수가 만들어져야 함
  • 인터럽트 발생시 이 함수 호출
  • 이 함수에서 인터럽트 서비스 루틴 작성
    : 주의! 인터럽트 함수 내에 프린트문, scanf문 사용해선 안됨
  • 인터럽트가 자주 걸릴 경우 큐 개념 도입
void HAL_GPIO_EXIT_Callback(uint16_t GPIO_Pin);

void EXTI15_10_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(USER_Btn_Pin);
    HAL_GPIO_EXIT_Callback(USER_Btn_Pin);
}

main.c

unsigned char Led_State;

while(1)
{
	HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
    HAL_Delay(100);
}

void HAL_GPIO_EXIT_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == USER_Btn_Pin)
    {
    	if(Led_State == 0x00)
        {
        	HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
            Led_State = 0x01;
        }
        else
        {
        	HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
            Led_State = 0x00;
        }
    }
}

  • 노트북을 바꿔서일수도 있는데 빌드하니 오류가 뜬다
  • 저장된 경로 사이에 한글이 껴있으면 경로가 깨져서 그런 것 같다. 원드라이브에 연동시켜서 쓸라했는데 하필 폴더 이름에 자동으로 한글이 들어가서.... 어쩔수 없이 다른 폴더로

profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글