[stm32]

[STM32] User Button #2

Gernii K 2023. 12. 19. 10:04

User button setting

GPIO_Input : 말그대로 input, 값을 받겠다는 이야기

GPIO_EXTI : EXternal Interrupt, 외부 인터럽트를 받겠다는 이야기

라고 생각한다. ( RTC, Reset_State 등등은 아직 모른다. 안찾아봤음 )

#1에서는 polling방식으로 main에서 키값을 계속 읽어서 판단했다면

이제 EXTI로 입력이 들어올때만 동작을 해보겠다.

 

컴퓨터를 방해하겠다는 말이다

 

EXTI로 설정하고 (설정을 바꾸면 라벨이 사라진다! 다시 B1으로 해주었다)

NVIC

NVIC 설정에서 EXTI 인터럽트를 Enabled, 활성화 시켜준다.

코드제너레잇!

 

인터럽트를 다루려고 콜백함수에 대해서 개념을 공부해야했다.

처음에, 정말 오랜시간동안 마우스 더블클릭처럼 유저버튼 두번 눌렀을때 다른동작을 구현하려고 부단히도 생각했는데

main에서, while에서 그런식으로 구현하기가 너무 힘들어서 못했는데

인터럽트라는 개념을 알고나서 와! 센즈 쉽다! 너무좋다! 생각을 했더랬다

 

IRQHandler, stm32f1xx._it.c

이제 인터럽트를 활성화 시켜주고, 인터럽트가 들어오면 (여기서는 버튼을 눌러주면)

EXTI15_10_IRQHandler 함수가 호출되고,  

이 함수가 HAL_GPIO_EXTI_IRQHandler를 호출하고,  (함수를 ctrl + 클릭 해보자)

또 이 함수가 이젠 

HAL_GPIO_EXTI_IRQHandler, stm32f1xx_hal_gpio.c

HAL_GPIO_EXTI_Callback 함수를 호출하게 된다.

 

(__HAL_GPIO_EXTI_CLEAR_IT 은 나도 모른다. 주석 읽어보니까 pending bit을 초기화 시켜주는거같다)

아직까지도 인터럽트를 받았을때 어떻게 첫번째 함수가 호출되는지 아직 모르겠으나, 나는 초보니까! 

나중에 알아보도록 하자

 

Callback 함수, stm32f1xx_hal_gpio.c

함수앞에 __weak이 선언되어있다. (__attribute__ 를 찾아보자)

입맛대로 바꿔 쓸 수 있게 되어있어서 이제 main에서 작성을 해줘야한다.

main.c

자료형과 함수 이름을 똑같이 해서, main문에 작성해주고 

내부에 기능을 구현하는 형식이다.

#1과 똑같이 Rising/ Falling 방식으로 받아줄거다. ( 코드가 잘 안돌아간다면, ioc 설정에서 Rising이나 Falling으로만 해놨을것이다 )

 

while, main.c

이제 확인을 위해서 main에서 while문 안에 LED를 toggle 시키는 기능을 구현하고 

delay를 1000을 준다.

그럼 보통 1000동안 다른동작을 안하고 기다려야 하는데

어떻게 동작하는지 확인해보자!