임베디드

GPIO 제어해보기

sdafdq 2025. 9. 9. 03:57

GPIO란.

General Purpose Input/Output

 

범용 목적 입출력.

걍 여러 단자, 부품 연결할 수 있는 입출력 핀.

 

칩의 핀 마다 뭐 GPIO로도 쓸 수 있고, 다양하게 쓸 수 있음.

이것도 뭐 IDE에서 저렇게 편리하게 해줘서 그렇지, 저것도 원래 다 데이터 시트에서 봐야 함. 핀마다 조금 다름.

 

 

 

뭐 여튼, 지금은 보드로 써서 그런데, 만약 칩으로 내가 뭐 직접 하는거라면,

이렇게 ioc에서 SYS가서 직접 디버그 핀 뭐할 지 설정해 줘야 함.

지금은 보드로 써서 디버그 핀을 뭐할 지 다 ST-Link 연결하는 포트에 연결해 놓음.

 

여러 개 있는데, 보통 JTAG 4pin이나 Serial Wire를 사용하는데,

걔 중에서도 주로 Serial Wire를 사용하는 이유는, 핀을 2개밖에 안 씀.

 

그래서 뭐 일단 저거는 디버그용 핀으로 됐다 치고.

 

 

 

 

그래서, 여튼간에 이제 GPIO 하나를 제어 해 볼건데, 우리는 지금 보드를 쓰고 있음.

막 미리 여러 자주 쓰는 부품들을 모아서 칩과 연결 해 한 보드에 만들어 놓은,

 

그 중 LED 하나를 제어 해 볼거임.

칩은 요렇게 있고,

 

 

이게 회로도. 이런 거는 보드 사에서 제공해 줌.

 

디버그 포트 여기 있네.

뭐 PB4, PA15, PB3 등등등 쓰는 듯.

 

 

여튼 우리는 LED 하나를 제어 해 볼건데,

저기 PC13 제어하면 LED0이 제어 될 듯.

 

D2라고 하네.

 

이것도 보드사에서 제공해 주는 건데 저기쪽이 D2

 

 

 

 

여튼,

PC13의 GPIO Output으로.

뭐 센서로 뭐 값 입력받고 그런 게 아니고, 출력해서 LED에 불 들어오게 해야 하니까.

 

 

그럼,

GPIO쪽 가보면,

 

이렇게 PC13추가되고 뭐 여러가지 설정할 수 있음.

 

output level은 Low, High 있던데 High가 뭐 전압주고 그런거겠지? 저건 다음 시간에 설명해 준다고 함.

 

 

 

유저 라벨은 내가 볼거니 내 맘대로 붙이고, 뭐 일단 저렇게 함.

 

모드나, 풀업 풀다운 이런 건 모르겠네.

출력속도는 뭐 전압주는 속도 그런건가.

 

 

 

여튼 이렇게 하고 저장하면,

 

 

저렇게 내가 설정한 옵션들이 코드로.

GPIO_LED_Pin은, 

아까 설정할 때 User Label + _Pin이 붙는 모양새다.

User Label 바꾸니까 저것도 바뀌었었다.

 

저거 확인 해 보고 싶으면,

메인 헤더 가서,

 

보면 다 자동으로 정의되어 있음.

포트, 그룹도 User_Label에 따라 자동으로.

 

#define 유저라벨_Pin 핀

저 GPIO_PIN_13 따라가봤더니,

내 칩의 라이브러리에,

 

요렇게 정의된..

 

저 GPIO 포트, GPIO 그룹도, 

이쪽 부분에 다 원래 정의되어 있는 부분임.

GPIO핀 13번 자체가, GPIOC에 물리적으로 속해있는 듯. 회로가 그런 거 같음.

 

 

여튼 라벨은 쓰는 걸 추천. 회로도 바꾸면서 바뀔 수도 있으니.. 막 PC13이렇게 쓰는 것 보다.

걍 라벨만 바꾸면 되니까.

 

만약 PC13 이런 식으로 했으면 코드도 다 PC13으로 바꿔야 하니까..

 

 

여튼, 해보자.

  while (1)
  {
	  HAL_GPIO_WritePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin, 1);
	  HAL_Delay(100);
	  HAL_GPIO_WritePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin, 0);
	  HAL_Delay(100);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

HAL_GPIO_WritePin(GPIO의 그룹, 핀, HIGH 또는 LOW);

 

HIGH나 LOW는 전압을 주는 거.

HIGH면 필요한 만큼 땡겨주고, LOW면 걍 0V.

 

참고로 

 

제대로 깜빡깜빡 거림.

 

 

 

 

이번엔 아까 스위치랑 연동해 보자.

PA0을 누르면 LED를 켜고, 때면 꺼지고.

 

 

PA0을 GPIO Input으로 추가하고,

input mode는 저거 하나밖에 없고,

pull-up은 회로도에 따라 다르다고 함. 이번엔 안 가르쳐 줬음.

라벨은 GPIO_SW로 하고.

 

 

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  if(!HAL_GPIO_ReadPin(GPIO_SW_GPIO_Port, GPIO_SW_Pin)){
		  HAL_GPIO_WritePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin, 0);
	  } else {
		  HAL_GPIO_WritePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin, 1);
	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

이렇게 작성.

저 ReadPin도 회로도에 따라 다르다고 함.

WritePin 해서 불 들어오는 것도 일단 회로도 안 보고 되는데로 함.

 

나중에 할 듯.

 

일단 저렇게 하면, 버튼 누르면 불 들어오고, 떼면 꺼짐.

 

 

'임베디드' 카테고리의 다른 글

HAL 라이브러리 안 쓰고 LED 제어 구현  (0) 2025.09.13
HAL 함수 분석  (0) 2025.09.13
임베디드 코드  (0) 2025.09.09
코드 입력 주의점  (0) 2025.09.09
프로젝트 생성  (0) 2025.09.09