| 이름 | 의미 |
|---|---|
PA5 | GPIOA의 5번 핀 |
PB11 | GPIOB의 11번 핀 |
PC13 | GPIOC의 13번 핀 |


| MODER 값 | 모드 | 기능 |
|---|---|---|
00 | Input | 외부 디지털 신호 읽기 |
01 | Output | HIGH 또는 LOW 출력 |
10 | Alternate Function | UART, SPI, 타이머 등으로 사용 |
11 | Analog | ADC, DAC 같은 아날로그 기능 |
입력
- 외부 핀의 전압 상태(High, Low)를 읽음
- High: 전압 != 0;
- Low: 전압 == 0;
/* GPIOA 클럭 활성화 */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
/* 입력 모드 설정 */
/* (PA8의 MODER 비트를 00으로 설정) */
GPIOA->MODER &= ~(3U << (8U * 2U));
/* PA8의 전압이 0인지 아닌지 확인 */
if ((GPIOA->IDR & (1U << 8)) != 0U) {
/* PA8이 HIGH */
} else {
/* PA8이 LOW */
}
출력
- 외부 핀에 전압(High, Low) 출력
- High: 3.3V
- Low: 0V
/* GPIOA 클럭 활성화 */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
/* 모드 초기화 */
/* PA8의 기존 MODER 비트를 00으로 초기화 */
GPIOA->MODER &= ~(3U << (8U * 2U));
/* 출력 모드 설정 */
/* PA8의 MODER 비트를 01로 설정 */
GPIOA->MODER |= (1U << (8U * 2U));
/* 출력 예시 */
while (1)
{
/* PA8 HIGH */
GPIOA->BSRR = (1U << 8);
HAL_Delay(500);
/* PA8 LOW */
GPIOA->BSRR = (1U << (8U + 16U));
HAL_Delay(500);
}
※ BSRR

// PA2 핀을 USART2_TX에 연결하는 예시
/* GPIOA Clock Enable */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
/* PA2 Alternate Function Mode: 10 */
GPIOA->MODER &= ~(3U << (2U * 2U));
GPIOA->MODER |= (2U << (2U * 2U));
/* PA2 AF 필드를 0000으로 초기화 */
GPIOA->AFR[0] &= ~(0xFU << (2U * 4U));
/* PA2 AF7: 0111 */
GPIOA->AFR[0] |= (7U << (2U * 4U));
/* USART TX는 Push-Pull */
GPIOA->OTYPER &= ~(1U << 2U);
/* PA2 Fast speed: 10 */
GPIOA->OSPEEDR &= ~(3U << (2U * 2U));
GPIOA->OSPEEDR |= (2U << (2U * 2U));
/* PA2 No Pull-up / Pull-down */
GPIOA->PUPDR &= ~(3U << (2U * 2U));
※ AF 필드, AFR

// PA0 핀을 Analog 모드로 전환하는 설정 예시
/* GPIOA Clock Enable */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
/* PA0 Analog Mode: 11 */
GPIOA->MODER &= ~(3U << (0U * 2U));
GPIOA->MODER |= (3U << (0U * 2U));
/* PA0 No Pull-up / Pull-down: 00 */
GPIOA->PUPDR &= ~(3U << (0U * 2U));
