버튼을 누르고 있으면 LED가 On되고 버튼을 떼면 LED가 Off되는 것은 이제 쉽다. 

https://pilimage.tistory.com/16

 

[C/STM32] 2. LED ON/OFF - 버튼 제어 추가

1초 간격으로 LED를 On/off를 하는 것은 이제 쉽다. https://pilimage.tistory.com/15 [C/STM32] 1. LED ON/OFF 가장 쉬운 LED ON/OFF를 해보자 . 먼저 프로젝트를 만들고 Clock & Configuration에서 Clock을 설정..

pilimage.tistory.com

 

버튼을 한 번 누르면 LED가 켜지고 다시 한 번 더 누르면 LED가 꺼질 수는 없는가?

당연히 가능하다. 

 

버튼이 눌렸다는 인식은 여러가지 방법으로 가능하겠지만 인터럽트를 사용하지 않고 폴링으로 해보겠다. 

 

폴링 방식이란 무엇인가?

버튼의 상태를 주기적으로 확인하는 방식으로 메인 루프에서 버튼의 상태를 계속 확인하면서 버튼이 눌려졌다는 상황을 판단한다.

 

버튼을 확인하는 방법은 버튼이 눌렸을 때의 tick과 버튼이 떨어졌을 때의 tick을 이용하여 

버튼이 떨어졌을 때 동작하도록 만들었다. 

btn_state는 버튼의 상태를 의미하고 초기값은 0이다. 

push_btn은 버튼이 눌린 상태를 표시하는 flag로 초기값은 0이다

stable_time은 채터링 방지 시간으로 초기값은 100ms로 하였다

 

1. push_btn의 초기값이 0이므로 if문에 해당된다. 

2. 버튼이 눌려져 btn_state가 1이되면 push_btn을 1로 바꾸고 그 때의 tick을 얻는다.

3. push_btn이 1이므로 else 구문으로 들어간다. 

4. 버튼이 떨어져서 btn_state가 0이 되면 그 때의 tick과 버튼을 눌렀을 때의 tick을 비교하여 stable_time보다 크면 LED를 반전 시켰다. 

5.  stable_time보다 작으면 push_btn = 0으로 바꾸어 초기 상태로 돌아간다. 

 

* Chattering (채터링)이란? 

버튼(=스위치)를 누르거나 떨어질 때, 0(LOW) -> 1(HIGH) 또는 1(HIGH)->0(LOW) 으로 한순간에 변하는 것이 아니라 떨어졌다 붙었다 하는 현상을 말한다. 

 

 

* void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

 GPIO 핀의 출력을 반전시키는 함수로 LED의 ON/OFF에 사용하였다.

 

 

반응형

1초 간격으로 LED를 On/off를 하는 것은 이제 쉽다. 

https://pilimage.tistory.com/15

 

[C/STM32] 1. LED ON/OFF

가장 쉬운 LED ON/OFF를 해보자 . 먼저 프로젝트를 만들고 Clock & Configuration에서 Clock을 설정하자 HSI : 내부 클럭 HSE : 외부 클럭 PLLCLK : 내부 클럭 또는 외부 클럭을 적절히 곱하거나 나누어 원하..

pilimage.tistory.com

 

자동으로 말고 내가 버튼을 눌러서 LED를 제어할 수 없는가?

당연히 가능하다. 

 

먼저 STM32F746 회로도를 보면 유저가 사용할 수 있는 버튼이 있다. 

B_USER 버튼
B_USER - PI11

B_USER 버튼은 핀 PI11에 연결된 것을 확인할 수 있다. 

 

Pinout & Configuration 에서 PI11을 검색하여 핀 위치를 찾는다. 

PI11입장에서 버튼의 신호를 받아야 버튼이 눌렸는지 안눌렸는지 알 수 있기에 PI11을 클릭한 뒤, GPIO_Input으로 설정해준다. 

또한 코드 작성의 편의를 위해 PI11을 우클릭하여 Enter User Label을 눌러 BTN1로 이름을 붙인다. 

System Core - GPIO 항목을 눌러 핀 세팅을 확인하고 Code Generation을 한다. 

코드를 작성할 준비는 모두 끝났다

이번에 사용할 HAL 라이브러리의 함수는 2가지이다. 

 

GPIO를 읽는 Read와 GPIO를 쓰는 Write

즉 ,버튼의 입력을 확인하는 HAL_GPIO_ReadPin 과 LED출력을 조절할 HAL_GPIO_WritePin 이다.

 

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

HAL_GPIO_ReadPin은 GPIOx에는 GPIO 구조체의 포인터를, GPIO_Pin에는 해당 핀을 넣어 핀 상태인 GPIO_PinState ( 0 또는 1 )를 리턴한다. 

 

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

GPIOx에는 GPIO 구조체의 포인터를, GPIO_Pin에는 해당 핀을, PinState에는 출력을 할려면 1(=GPIO_PIN_SET) 아니면 0(GPIO_PIN_RESET)을 넣으면 된다.

 

 

먼저 버튼을 누른 상태에서만 LED가 켜지는 동작을 작성해 보자 

1. 메인 루프에서 BTN1의 상태를 계속 읽는다. 

2. BTN1이 눌려져 있으면, LED1을 On한다. 

3. BTN1이 안눌려져 있으면 LED1을 Off한다.

 

if문을 쓰기 싫다 코드를 한 줄로 줄이고 싶다면 다음과 같이 작성해도 된다.

1. 메인루프에서 LED1을 BTN1의 상태를 읽어 출력한다. 

HAL_GPIO_ReadPin이 GPIO_PinState를 리턴하므로 이렇게 한 줄로도 줄일 수 있다. 

 

반응형

+ Recent posts