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 해서 불 들어오는 것도 일단 회로도 안 보고 되는데로 함.
나중에 할 듯.
일단 저렇게 하면, 버튼 누르면 불 들어오고, 떼면 꺼짐.