Skip to content

STM32 예제 코드

참고: 이 문서는 레거시 C 참조 예제이다. 신규 개발에는 Rust SDK 예제Rust SDK를 사용한다.

STM32 마이크로컨트롤러에서 Xylolabs API를 사용하기 위한 C 예제 코드이다.

파일 구조

File Description
f411_audio_example.c STM32F411 오디오+센서 예제 (XAP 코덱, LTE-M1 모뎀)
f103_sensor_example.c STM32F103 센서 전용 노드 (ADPCM 폴백, LTE-M1 모뎀)
wb55_wireless_example.c STM32WB55 BLE 센서 노드 (BLE를 통한 게이트웨이로 XMBP 전달)

설계 원칙

HAL 기반, CubeMX 호환

모든 예제는 STM32CubeMX로 생성된 STM32 HAL 라이브러리를 사용한다. LL(저수준) 레지스터 직접 접근은 필요하지 않는다. 이를 통해 주변 장치 초기화 코드의 최소한의 변경으로 STM32 패밀리 간 이식성을 확보한다.

// HAL 사용 예제
HAL_I2S_Receive_DMA(&hi2s1, (uint16_t *)dma_buf, DMA_BUF_SAMPLES);
HAL_UART_Transmit(&huart1, at_cmd, strlen(at_cmd), HAL_MAX_DELAY);
int16_t adc_raw = HAL_ADC_GetValue(&hadc1);

정적 메모리

malloc/free를 사용하지 않는다. 모든 버퍼는 컴파일 시점에 크기가 결정되는 정적 전역 변수이다. STM32 타겟의 RAM은 제한적(F103: 20KB, F411: 128KB, WB55: 256KB)이므로, 정적 할당은 장기 운용 시 힙 단편화를 방지한다.

XAP 기본 코덱 (F411 이상)

XAP(LC3 기반) 인코딩은 하드웨어 FPU(Cortex-M4F 이상)와 최소 약 64KB의 RAM이 필요하다. STM32F411(128KB RAM, Cortex-M4F)은 이 요건을 충족하며, 16kHz/64kbps XAP를 기본 코덱으로 사용한다(인코딩 후 약 2 KB/s, LTE-M1에서 여유롭게 전송 가능).

STM32F103(20KB RAM, Cortex-M3, FPU 없음)은 XAP를 실행하기에 너무 제한적이다. 필요 시 오디오에는 ADPCM을, 그 외에는 센서 전용 XMBP 스트리밍을 사용한다.

UART AT 명령을 통한 LTE-M1 통신

STM32는 UART로 연결된 외부 LTE-M1 모뎀을 통해 셀룰러 네트워크와 통신한다. AT 명령은 3GPP 표준을 따르며 모뎀별 확장 명령(Quectel BG96, SIM7080 등)을 사용한다.

// HTTP POST를 위한 AT 명령 시퀀스
HAL_UART_Transmit(&huart1, "AT+QHTTPCFG=\"contextid\",1\r\n", ...);
HAL_UART_Transmit(&huart1, "AT+QHTTPPOST=...\r\n", ...);
HAL_UART_Transmit(&huart1, xmbp_buf, packet_len, ...);

레거시 C 빌드

STM32CubeIDE

  1. STM32CubeIDE를 열고 타겟(F103, F411, WB55)에 맞는 새 STM32 프로젝트를 생성한다.
  2. CubeMX에서 주변 장치를 설정한다 (I2S, UART, ADC, IWDG).
  3. 예제 .c 파일을 Core/Src/ 디렉터리에 추가한다.
  4. 인클루드 경로에 sdk/c/common/include/sdk/c/stm32/를 추가한다.
  5. Project > Build All (Ctrl+B)로 빌드한다.

CMake (arm-none-eabi)

cmake_minimum_required(VERSION 3.22)
set(CMAKE_TOOLCHAIN_FILE arm-none-eabi-toolchain.cmake)
project(xylolabs_stm32_example C ASM)

add_executable(f411_audio
    Core/Src/f411_audio_example.c
    Core/Src/stm32f4xx_hal_msp.c
    Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c
    # ... 기타 HAL 소스
)

target_include_directories(f411_audio PRIVATE
    Core/Inc
    Drivers/STM32F4xx_HAL_Driver/Inc
    sdk/c/common/include
    sdk/c/stm32
)

target_compile_definitions(f411_audio PRIVATE STM32F411xE USE_HAL_DRIVER)

주요 LTE-M1 모뎀

Modem Interface AT Command Set
Quectel BG96/BG95 UART AT 3GPP + Quectel extensions
SIMCom SIM7080G UART AT 3GPP + SIMCom extensions
u-blox SARA-R4/R5 UART AT 3GPP + u-blox extensions
Nordic nRF9160 SPI/UART AT or native SDK

API 문서 참고

  • API Reference -- XMBP 프로토콜, 수집 세션, 오디오 업로드, API 키 관리, 장치 관리