STM32 Reference
STM32 마이크로컨트롤러 레퍼런스
STM32 Reference 소개
STM32 HAL 레퍼런스는 STM32 하드웨어 추상화 계층(HAL) 라이브러리의 핵심 함수를 검색할 수 있는 빠른 참조 가이드입니다. GPIO, 타이머, UART, SPI, I2C, ADC, DMA, 인터럽트의 8개 주변장치 카테고리에서 가장 자주 사용되는 HAL 함수를 다루며, 각 항목에는 함수 시그니처, 간결한 설명, STM32CubeMX 표준 HAL 드라이버에서 바로 컴파일 가능한 C 코드 스니펫이 포함되어 있습니다.
STMicroelectronics의 STM32 마이크로컨트롤러는 Nucleo 보드의 간단한 LED 점멸부터 복잡한 산업용 제어기까지 광범위한 임베디드 시스템에 사용됩니다. HAL 라이브러리는 F0, F1, F4, H7, L4, G4 등 모든 STM32 패밀리에서 이식 가능한 API를 제공합니다. 이 레퍼런스는 엔지니어가 매일 사용하는 HAL 호출에 집중하여, 수천 페이지에 달하는 공식 레퍼런스 매뉴얼이나 ST 애플리케이션 노트를 일일이 찾아볼 필요를 없앱니다.
GPIO 푸시풀 출력으로 LED를 구동하거나, DMA를 이용한 고속 UART 시리얼 로깅을 설정하거나, 스캔 모드 멀티채널 ADC로 아날로그 센서를 읽거나, MPU6050 같은 가속도계의 I2C 드라이버를 작성할 때, 이 치트 시트는 필요한 정확한 HAL 호출과 파라미터 설정을 제공합니다. 모든 콘텐츠는 서버 의존 없이 브라우저에서 렌더링되므로, 오프라인 임베디드 개발 환경에서도 활용하기에 이상적입니다.
주요 기능
- 푸시풀 출력, 풀업/풀다운 입력, 주변장치 매핑을 위한 대체 기능 모드를 포함한 GPIO 설정 예제
- 폴링(블로킹), 인터럽트, DMA 세 가지 모드의 UART 통신과 _write() 시스콜 오버라이드를 통한 printf 리다이렉션
- GPIO를 이용한 수동 칩 셀렉트(CS) 제어와 함께 SPI 송신, 수신, 전이중 TransmitReceive 패턴
- 센서 레지스터 접근을 위한 I2C 마스터 송수신 및 메모리 매핑 읽기/쓰기, HAL_I2C_IsDeviceReady()를 이용한 디바이스 스캔
- ADC 단일 채널 폴링, 멀티채널 DMA 스캔 모드, 전압 변환 공식, 내부 온도 센서 읽기
- DMA 메모리 간 전송, 연속 ADC 샘플링을 위한 순환 버퍼 모드, 실시간 처리를 위한 더블 버퍼 패턴
- NVIC 인터럽트 우선순위 설정, 외부 GPIO 인터럽트 콜백(EXTI), 타이머 주기 완료 콜백, UART 수신 완료 콜백
- 기본 타이머 시작, 런타임 듀티 사이클 조정이 가능한 PWM 출력, 주파수 측정을 위한 입력 캡처를 포함한 타이머 서브시스템
자주 묻는 질문
이 HAL 레퍼런스는 어떤 STM32 패밀리에 적용되나요?
HAL API는 모든 STM32 패밀리에서 이식 가능하도록 설계되었습니다. 여기 표시된 함수명과 파라미터는 STM32F0, F1, F3, F4, F7, H7, L0, L4, G0, G4, U5, WB 시리즈에서 동작합니다. 클럭 설정이나 주변장치 가용성에 미세한 차이가 있을 수 있지만, HAL 함수 시그니처는 일관되게 유지됩니다.
UART 폴링, 인터럽트, DMA 모드 중 어떤 것을 선택해야 하나요?
블로킹이 허용되는 간단한 저속 전송에는 폴링(HAL_UART_Transmit/Receive)을 사용하세요. 비블로킹 동작이 필요하지만 데이터 속도가 보통인 경우 인터럽트 모드(_IT 변형)로 전환하세요. 시리얼 로깅이나 GPS NMEA 파싱처럼 CPU 개입을 최소화해야 하는 고속 또는 연속 데이터 스트림에는 DMA 모드(_DMA 변형)를 사용하세요.
HAL_GPIO_WritePin()을 호출한 후에도 GPIO 출력이 토글되지 않는 이유는 무엇인가요?
가장 흔한 원인은 GPIO 포트 클럭을 활성화하지 않은 것입니다. HAL_GPIO_Init() 전에 __HAL_RCC_GPIOx_CLK_ENABLE()이 호출되었는지 확인하세요. 또한 핀 모드가 GPIO_MODE_OUTPUT_PP(푸시풀) 또는 GPIO_MODE_OUTPUT_OD(오픈 드레인)로 설정되었는지, 다른 주변장치가 대체 기능 매핑으로 같은 핀을 점유하고 있지 않은지 확인하세요.
STM32에서 ADC 원시 값을 전압으로 어떻게 변환하나요?
3.3V 기준 전압의 12비트 ADC의 경우 공식은 voltage = (float)adc_value * 3.3f / 4096.0f입니다. 다른 기준 전압이나 분해능(8비트, 10비트)을 사용한다면 적절히 조정하세요. 내부 온도 센서는 해당 STM32 부품 번호의 데이터시트에 문서화된 교정 공식을 사용합니다.
HAL_I2C_Master_Transmit()과 HAL_I2C_Mem_Write()의 차이점은 무엇인가요?
HAL_I2C_Master_Transmit()은 슬레이브 주소로 원시 바이트를 전송하며, 레지스터 기반 주소 지정을 사용하지 않는 디바이스에 적합합니다. HAL_I2C_Mem_Write()는 데이터를 쓰기 전에 먼저 메모리/레지스터 주소를 전송하며, 대부분의 I2C 센서와 EEPROM에서 요구하는 패턴입니다. Mem 변형은 레지스터 바이트를 수동으로 앞에 추가할 필요를 없앱니다.
PWM 출력을 설정하고 런타임에 듀티 사이클을 변경하는 방법은?
CubeMX에서 타이머 채널을 PWM 출력으로 설정하거나 수동으로 타이머 모드를 설정한 후, HAL_TIM_PWM_Start(&htimX, TIM_CHANNEL_Y)를 호출하여 출력을 시작합니다. 런타임에 듀티 사이클을 변경하려면 __HAL_TIM_SET_COMPARE(&htimX, TIM_CHANNEL_Y, newValue) 매크로를 사용하며, newValue는 0부터 타이머 자동 리로드 값(ARR)까지의 범위입니다.
DMA를 순환 모드로 사용하여 ADC를 연속 샘플링할 수 있나요?
네. CubeMX에서 DMA 채널을 Circular 모드로 설정하거나 hdma.Init.Mode = DMA_CIRCULAR로 설정하세요. 그런 다음 HAL_ADC_Start_DMA(&hadc1, buffer, bufferSize)를 호출합니다. DMA 컨트롤러가 버퍼를 지속적으로 채우고 자동으로 순환합니다. 반 전송 및 전송 완료 콜백을 사용하여 더블 버퍼 방식으로 데이터를 처리할 수 있습니다.
STM32에서 NVIC 인터럽트 우선순위는 어떻게 작동하나요?
STM32는 설정 가능한 우선순위 그룹핑을 가진 ARM Cortex-M NVIC를 사용합니다. HAL_NVIC_SetPriority(IRQn, PreemptPriority, SubPriority)로 두 수준을 설정합니다. 낮은 숫자가 높은 우선순위를 의미합니다. 선점 우선순위는 한 인터럽트가 다른 인터럽트를 중단할 수 있는지 결정합니다. FreeRTOS 사용 시, FreeRTOS API를 호출하는 ISR에는 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY보다 숫자적으로 낮은 우선순위를 할당하지 마세요.