GPIO
- General Purpose Input Output
STM32 펌웨어 구성
1) 어플리케이션 레벨의 데모 프로그램 (Application level demonstrations)
: ST사에서 제공하는 각종 Evaluation 보드, Discovery 보드, NUCLEO 보드 등을 이용한 다양한 데모 프로그램 포함
2) STM32 미들웨어 레벨 (Middleware level)
: TCP/IP, USB, Touch Library, Graphics, FAT file system, RTOS를 지원
: OS의 사용, 파일 관리, 인터넷 접속, USB 사용 등이 구현됨
3) STM32 유틸리티 (Utility)
: ARM사의 CMSIS 지원을 위한 소스 코드와 ST사에서 제공하는 CPU, Font, Log, Media 등의 유틸리티
4) STM32 HAL(Hardware Abstraction Layer) 레벨
: 지원하는 MCU의 하드웨어 구동을 위한 소프트웨어
: BSP(Board Support Package)와 HAL(Hardware Abstraction Layer)이 있음
: 해당 레지스터에 직접 값을 써넣거나 주변 장치를 제어하는 등의 동작이 이 루어짐
5) 하드웨어 (Hardware)
: 펌웨어가 아님
: 펌웨어가 구동되는 실제 하드웨어(MCU)를 나타냄
HAL 드라이브
- HAL : Hardware Abstraction Layer
- MCU의 주변 장치를 제어하는 등의 동작이 이루어짐
- 이를 위해 HAL 레벨에 여러 개의 파일이 존재 => HAL 드라이버
- 여러 주변 장치 설정을 위한 데이터 구조체와 주변 장치의 구동을 위한 API 함수 포함된 여러 파일로 구성
GPIO
- GPIO : General Purpose Input Output
1) 구조


2) 입력모드
- 플로팅(Floating) 방식 입력
- 풀업(Pull-up) 방식 입력
- 풀다운(Pull-down) 방식 입력
- 아날로그 입력
3) 출력모드
- 오픈 드레인(Open drain) 방식 출력
- 푸시-풀(Push-pull) 방식 출력
4) 대체 기능
5) 외부 인터럽트/이벤트 입력(External interrupt/event lines)
GPIO 설정용 구조체
1) GPIO_InitTypeDef
- GPIO의 초기 설정을 위한 구조체
- stm2f1xx_hal_gpio.h에 정의
2) 데이터 형
- uint32_t Pin
- uint32_t Mode
- uint32_t Pull
- uint32_t Speed
3) 데이터 형의 설명
- Pin : 설정할 핀을 지정
- 이 파라미터가 가질 수 있는 값은 다음과 같음
GPIO_PIN_0 GPIO_PIN_1 GPIO_PIN_2 GPIO_PIN_3 GPIO_PIN_4 GPIO_PIN_5 GPIO_PIN_6 GPIO_PIN_7 GPIO_PIN_8 GPIO_PIN_9 GPIO_PIN_10 GPIO_PIN_11 GPIO_PIN_12 GPIO_PIN_13 GPIO_PIN_14 GPIO_PIN_15 GPIO_PIN_All
GPIO Mode
- 핀의 동작 모드 설정
- 이 파라미터가 가질 수 있는 값은 다음과 같음
- GPIO_MODE_INPUT : 입력 플로팅(Input Floating) 모드
- GPIO_MODE_OUTPUT_PP : 출력 푸쉬 풀(Output Push Pull) 모드
- GPIO_MODE_OUTPUT_OD : 출력 오픈 드레인(Output Open Drain) 모드
- GPIO_MODE_AF_PP : 대체 기능 푸쉬 풀(Alternate Function Push Pull) 모드
- GPIO_MODE_AF_OD : 대체 기능 오픈 드레인(Alternate Function Open Drain) 모드
- GPIO_MODE_AF_INPUT : 대체 기능 입력(Alternate Function Input) 모드
- GPIO_MODE_ANALOG : 아날로그(Analog) 모드
- GPIO_MODE_IT_RISING : 외부 인터럽트(External Interrupt) 모드. 상승 엣지(Rising Edge)에 트리거(trigger)됨
- GPIO_MODE_IT_FALLING : 외부 인터럽트(External Interrupt) 모드. 하강 엣지(Falling Edge)에 트리거(trigger)됨
- GPIO_MODE_IT_RISING_FALLING : 외부 인터럽트(External Interrupt) 모드. 상승/하강 엣지(Rising/Falling Edge)에 트리거(trigger)됨
- GPIO_MODE_EVT_RISING External : 이벤트(Event)모드. 상승 엣지(Rising Edge)에 트리거(trigger)됨
- GPIO_MODE_EVT_FALLING External : 이벤트(Event)모드. 하강 엣지(Falling Edge)에 트리거(trigger)됨
- GPIO_MODE_EVT_RISING_FALLING : 이벤트(Event)모드. 상승/하강 엣지(Rising/Falling Edge)에 트리거(trigger)됨
Pull
- 핀의 Pull-upm Pull-Down 모드 설정
- 이 파라미터가 가질 수 있는 값은 다음과 같음
GPIO_NOPULL : No Pull-up or Pull-down activation
GPIO_PULLUP : Pull-up activation
GPIO_PULLDOWN : Pull-down activation
Speed
- 핀의 동작속도 설정
- 이 파라미터가 가질 수 있는 값은 다음과 같음
GPIO_SPEED_FREQ_LOW : Low Speed
GPIO_SPEED_FREQ_MEDIUM : Medium Speed
GPIO_SPEED_FREQ_HIGH : High Speed
GPIO 구동용 함수
- HAL_GPIO_ReadPin()
: GPIO의 지정된 핀의 값을 이 ㄺ어온다
- HAL_GPIO_WritePin()
: GPIO의 지정된 핀을 0, 또는 1로 설정
- HAL_GPIO_TogglePin()
: GPIO의 지정된 핀의 값을 토글(toggle)시킴
- HAL_GPIO_LockPin()
: GPIO의 지정된 핀의 설정값을 변경 금지(lock)시킴
인터럽트 처리용 함수
- GPIO에서 발생하는 외부 인터럽트(EXTI)의 처리를 위한 함수
- HAL_GPIO_EXTI_IRQHandler()
: EXTI 인터럽트의 핸들러 함수
- HAL_GPIO_EXTI_Callback()
: EXTI 인터럽트를 처리하기 위한 콜백함수
: EXTI 핸들러 함수(EXTIx_IRQHandler()) 내에서 사용됨
GPIO 관련 함수
1) HAL_GPIO_Init(GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init)
- 함수설명
: GPIOx를 GPIO_Init 구조체 변수의 설정값에 맞추어 초기화
- 파라미터
: GPIOx : GPIO의 이름(x는 A~K까지의 값을 가질 수 있다)
: GPIO_Init : GPIO의 설정값을 가지고 있는 GPIO_InitTypeDef 구조체형의 변수
- 리턴값
: 없음
2) HAL_GPIO_DeInit(GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin)
- 함수 설명
: GPIOx를 리셋 시의 디폴트 값으로 설정(초기화 하제)
- 파라미터
: GPIOx : GPIO의 이름(x는 A~K까지의 값을 가질 수 있음)
: GPIO_Pin : GPIO Pin을 지정. GPIO_PIN_0 ~ GPIO_PIN_15 사이의 값을 가질 수 있음
- 리턴값
: 없음
3) HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
- 함수 설명
: GPIOx의 지정된 핀(GPIO_Pin)에 입력된 값을 읽어옴
- 파라미터
: GPIOx : GPIO의 이름(x는 A~K까지의 값을 가질 수 있음)
: GPIO_Pin : GPIO Pin을 지정. GPIO_PIN_0 ~ GPIO_PIN_15 사이의 값을 가질 수 있음
- 리턴값
: 지정된 핀의 입력값
4) HAL_GPIO_WritePin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
-
함수 설명
: GPIOx의 지정된 핀(GPIO_Pin)을 0, 또는 1로 설정
-
파라미터
: GPIOx : GPIO의 이름(x는 A~K까지의 값을 가질 수 있음)
: GPIO_Pin : GPIO Pin을 지정. GPIO_PIN_0 ~ GPIO_PIN_15 사이의 값을 가질 수 있음
: PinState : 핀의 상태를 설정. 이 파라미터가 가질 수 있는 값음 다음과 같음
- GPIO_PIN_RESET : 핀을 리셋(0) 한다
- GPIO_PIN_SET : 핀을 셋(1) 한다
-
리턴값
: 없음
5) HAL_GPIO_TogglePin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
-
함수 설명
: GPIOx의 지정된 핀(GPIO_Pin)의 값을 토글(toggle)시킴
-
파라미터
: GPIOx : GPIO의 이름(x는 A~K까지의 값을 가질 수 있음)
: GPIO_Pin : GPIO Pin을 지정. GPIO_PIN_0 ~ GPIO_PIN_15사이의 값을 가질 수 있음
-
리턴값
: 없음
6) HAL_GPIO_LockPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
- 함수 설명
: GPIOx의 지정된 핀(GPIO_Pin)의 값을 록(Lock)시킴
- 파라미터
: GPIOx : GPIO의 이름(x는 A~K까지의 값을 가질 수 있음)
: GPIO_Pin : GPIO_Pin을 지정. GPIO_PIN_0 ~ GPIO_PIN_15 사이의 값을 가질 수 있음
- 리턴값
: 없음
- 참고
: 핀이 록(Lock)되면 리셋되기 전까지는 그 핀의 값을 변경할 수 없음
7) HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
- 함수 설명
: GPIO에서 발생하는 EXTI 인터럽트 처리를 위한 콜백함수
: 예제에서 이 함수는 stm32f10x_it.c 파일 내의 인터럽트 핸들러 함수(EXTIx_IRQHandler())에서 호출되어 사용
- 파라미터
: GPIO_Pin : GPIO Pin을 지정. GPIO_PIN_0 ~ GPIO_PIN_15 사이의 값을 가질 수 있음
- 리턴값
: 없음
8) HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- 함수 설명
: EXTI 인터럽트를 처리하기 위한 콜백 함수
: 에제에서 이 함수는 main.c 파닐 내에서 구현되어 사용
- 파라미터
: GPIO_Pin : GPIO Pin을 지정. GPIO_PIN_0 ~ GPIO_PIN_15 사이의 값을 가질 수 있음
- 리턴값
: 없음