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¶
- STM32CubeIDE를 열고 타겟(F103, F411, WB55)에 맞는 새 STM32 프로젝트를 생성한다.
- CubeMX에서 주변 장치를 설정한다 (I2S, UART, ADC, IWDG).
- 예제
.c파일을Core/Src/디렉터리에 추가한다. - 인클루드 경로에
sdk/c/common/include/와sdk/c/stm32/를 추가한다. 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 키 관리, 장치 관리