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