이전 포스팅이 궁금하다면?
이전 포스팅에서는 GPIO의 출력에 대해 알아봤다. 이번 포스팅에서는 GPIO로 입력되는 값을 확인하는 방법에 대해 알아보겠다.
외부에서 MCU에 입력되는 신호는 아날로그 신호, 시리얼 통신 신호, High/Low 레벨 입력 신호.. 흠 또 뭐가 있지.. 생각이 안 난다. 이 정도가 끝이지 않을까?
아날로그 신호의 입력은 MCU 내부에 있는 ADC를 이용해 처리하고, 시리얼 통신 신호는 UART, I2C, SPI 등 각 통신에 맞는 기능을 활용해 처리한다.
High/Low 레벨의 입력 신호는 스위치를 이용한 입력이 가장 대표적이다. B-L475E-IOT01A1에 적용된 스위치 회로는 아래 오른쪽 그림과 같고, MCU에 연결은 왼쪽 그림과 같다. MCU의 7번 핀인 PORTC.13번에 연결되어 있다.
(아 참고로 본 포스팅의 모든 자료의 출처는 ST임을 밝힌다. 문제가 되면 삭제하도록 하겠다. )
스위치 입력을 확인하는 방법은 polling 방식과 interrupt 방식 두 가지가 있다. 이번 포스팅의 목적은 GPIO 입력에 대해 알아보는 것이기 때문에 interrupt에 대한 설명은 생략하고 사용방법에 대해서만 이야기하도록 하겠다. interrupt는 다음 포스팅에서 다루도록 하겠다.
우선 위 그림의 왼쪽에 있는 스위치 회로를 살펴보겠다.
위 회로는 Pull-up 스위치 회로다. B2(스위치)를 누르지 않으면 전류의 방향은 빨간색 화살표 방향으로 흐르기 때문에 MCU에서는 High로 인식할 것이다. 이때 B2를 누르면 전류의 방향이 검은색 화살표화 같이 GND를 향해가기 때문에 MCU에서는 Low로 인식한다. 직접 확인해 보자!
코드는 기존의 코드를 활용할 것이다.
이번 포스팅부터는 별도의. c파일을 만들어서 작업을 해보려 한다. 앞으로 코드가 길어질 것이고, 뭐 이건 개인의 성향 차이인데 난 main.c에 서 작업하는걸 별로 좋아하지 않는다.
그럼 우선. c 파일을 만들고 추가하자.
위 그림과 같이 Src 폴더에서 마우스 우클릭 New -> Source File 버튼을 누른다.
위 그림의 빨간 박스 부분에 파일명을 입력한다. 음.. 나는 보통 application.c 파일로 만든다.
위 그림처럼 파일이 만들어진 걸 확인할 수 있다. 나 같은 경우는 application.c 파일에 application 함수를 하나 만들어서 main에서 호출하는 형태로 사용한다. (이건 C의 기본적인 내용이기 때문에 본 포스팅에서는 생략 혹시 질문하실 분은 댓글 달아주세요.)
그럼 이제 스위치 입력을 받아보자!
CubeMX를 열어보면 회로와 같이 PC13번에 연결된 것을 확인할 수 있다.
그럼 스위치 입력을 polling 방식으로 확인해보자. polling 방식은 while(1) 문 안에서 스위치가 연결돼 GPIO의 상태를 확인하는 방법이다.
코드는 아래와 같다.
HAL_GPIO_ReadPin() 함수는 ST에서 제공하는 함수로 포트의 상태를 읽을 수 있는 함수다. 즉 포트의 상태가 High인지 Low인지 읽을 수 있다. 첫 번째 전달 인자에 포트명을 입력하고, 두 번째 전달 인자에 핀 명을 입력한다. 이 내용은 main.h에 들어가 보면 CubeMX에서 지정한 이름과 동일한 define을 찾을 수 있다. 그걸 입력해 주면 된다.
그럼 이제 디버깅을 걸어서 상태가 변수 readPin의 값이 바뀌는 걸 확인해보자.
디버깅을 걸면 화면이 바뀌면서 우측에 아래와 같은 창이 보일 거다. 화면이 좁으면 옆으로 조금 늘리면 보인다.
초기 STM32CubeIDE에는 실시간으로 변수의 상태를 확인하는 live watch 기능이 없었다. 사실 그래서 사용을 안 하고 있었는데 작년쯤인가? 이 기능이 추가되었다. 난 그 뒤부터 사용한다. 아무튼 Live Expressions에 readPin을 입력하면 변수의 상태를 실시간(?)에 가깝게 확인할 수 있다.
스위치를 누르지 않은 상태에서는 위에서 설명한 것과 같이 High로 인식해 값이 1이다. 그럼 스위치를 눌러보자. readPin값이 0으로 바뀌는 걸 확인할 수 있다.
그럼 이전 포스팅에서 학습한 LED 제어코드를 이용해 스위치의 상태와 같이 LED가 동작하는 코드를 작성해 보자. 즉, 스위치가 입력된 GPIO의 상태가 High이면 LED on, GPIO 상태가 Low 이면 LED Off가 되는 코드다.
동작확인은 동영상으로!
위 코드는 동작은 하지만 좋은 코드라고 말할 수는 없다. 코드를 깔끔하게 한번 정리해보자.
동작은 동영상과 동일하게 된다. 코드의 자료형을 조금 정리해준 거다. 이건무 기본 중에 기본이니까. 그럼 이제 인터럽트 방식을 알아볼까?
음.. 인터럽트는 다음 포스팅에서!
- 끝 -
다음 포스팅이 궁금하다면?
'Hardware&Firmware > STmicroelectronic(STM)' 카테고리의 다른 글
[STM32] 8. UART(B-L475E-IOT01A1 개발보드 활용하기), HAL 드라이버, LL 드라이버 (0) | 2022.04.08 |
---|---|
[STM32] 7. Interrupt (B-L475E-IOT01A1 개발보드 활용하기) (0) | 2022.04.07 |
[STM32] 5. GPIO 제어하기-출력(B-L475E-IOT01A1 개발보드 활용하기) (0) | 2022.04.04 |
[STM32] 4. STM32CubeIDE 사용방법(B-L475E-IOT01A1 개발보드 활용하기) (0) | 2022.04.01 |
[STM32] 3. STM32 개발환경 구축하기(STM32CubeIDE 설치하기) (0) | 2022.03.31 |