Embedded/STM32

CORTEX-M4 기초 및 응용, 도서 공부하기 4 - F411RE 유저 버튼 사용하기 (Polling방식)

변화의 물결1 2025. 8. 16. 00:05

 

 

안녕하세요.

 

 이전 시간에는 간단하게 GPIO를 이용해서 LED를 제어해 보았다면, 이번에는 장착되어 있는 버튼을 GPIO를 이용해서 사용해 보겠습니다. 프로젝트는 새로 생성하지 않고 이전 기본 LED 프로젝트 불러와서 사용하겠습니다.


 

1. 사용자 버튼 회로 확인

 

 PC13번 핀에 버튼(B1, USER)이 연결되어 있는데, 평상시에는 VDD에 연결되어 있기 때문에 PULL-UP으로 HIGH 입력입니다. 버튼을 누르면 LOW로 입력 값이 변경됩니다.

 

  

 

2. 핀 설정

 

STM32F411RE평가보드 기본환경으로 세팅한 경우 PC13번 핀은 Interrupt로 되어있습니다.

 

 

 

 이번에는 Polling 방식으로 입력을 확인할 것이므로 GPIO Input으로 설정을 바꿔줍니다.

 PC13번 핀에 클릭을 하면 선택할 수 있는 창이 나타나는데, GPIO_Input을 선택합니다.

 그리고 USER Label을 B1으로 입력합니다.

 

 

 

 저장을 하고 코드 생성을 메뉴를 눌러 수정한 내용에 맞게 코드를 생성합니다.

 main.c 파일에 B1_Pin이 Input모드로 설정된 것을 알 수 있습니다.

 

 

 

3. 소스 코드 수정

 

 이전 LED 코드가 그대로 while() 함수에 있을 것입니다. 이 부분을 주석처리 혹은 삭제한 후 아래 코드를 추가합니다.

 

 HAL 라이브러리 함수 HAL_GPIO_ReadPin를 사용해서 핀 상태를 읽어 옵니다. 첫 번째 인자는 B1_GPIO_PORT(포트)를 두 번째 인자는 B1_Pin(핀 번호)로 설정합니다.

 그러면 핀 상태 값을 읽어와서 GPIO_PIN_RESET(LOW) 값과 비교합니다.

 

 LOW 값이면 LED2번을 On 하고, HIGH 값이면 LED2를 Off 하는 코드입니다.

  

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
               if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_RESET){
                             HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); 
               } else {
                             HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); 
               }           
    /* USER CODE END WHILE */

 

 

 위의 코드는 while() 함수 내에서 계속 핀을 검사하는 Polling 방식이므로 효율성이 떨어지는 방법입니다. 이후 Interrupt 방식으로 상태가 변했을 때 작동하는 것으로 수정해 보겠습니다.

 

 

4. 작동 확인

 파란색 버튼(User Button)을 누르면 LED2 켜지는 것을 확인할 수 있습니다. 

 

 

 

참고)

 

 디버깅 툴을 사용할 수도 있지만, printf() 함수로 디버깅을 할 수도 있습니다. 그럴 때 정수와 문자만 사용하는 것이 아니라, 실수도 출력이 필요할 때도 있습니다. 그럴 때 설정을 하나 해줘야 합니다.

 

 "Project->Property->C/C++ Build ->Settings -> MCU/MPU Setting" 메뉴로 이동합니다.

항목 중에 "Use float with printf form newlib-nano"를 체크를 해주면 됩니다.

 

 

  

감사합니다.

 

 

<참고 자료>

1. [도서] STM32CubeIDE를 이용한 CORTEX-M4 기초 및 응용

2. STM32F411RE/mb1136-default-c03_schematic.pdf

 

 

반응형