Skip to content

RP2040 / Pico 플랫폼 가이드

Raspberry Pi Pico (RP2040)용 Xylolabs SDK 통합 가이드이다. RP2040은 비용 효율적인 센서 전용 타겟이다.


RP2040 사양

리소스 사양 비고
CPU 듀얼 Cortex-M0+ @ 133 MHz ~266 MIPS 총합; DSP/FPU 없음
SRAM 264 KB 정적 할당, 힙 없음
Flash 외장 QSPI (일반적으로 2-16 MB) 펌웨어 + 로그 저장
UART 2채널 LTE-M1 모뎀 AT 명령
ADC 4채널, 12-bit, 500 ksps 센서 입력 (GPIO26-29)
SPI 2채널 외부 센서, SD 카드
I2C 2채널 온도, 습도, 기압 센서
PIO 8 상태 머신 (2 블록 x 4) 유연한 I/O 프로토콜
DMA 12채널 제로카피 데이터 전송
WDT 하드웨어 워치독 장기간 무인 운전
GPIO 30핀 센서, 모뎀 제어, 상태 LED

RP2350과의 주요 차이점

RP2040은 RP2350과 동일한 Pico SDK를 사용하지만 중요한 하드웨어 차이가 있다:

특징 RP2040 (Pico) RP2350 (Pico 2)
코어 Cortex-M0+ Cortex-M33
클록 133 MHz 150 MHz
SRAM 264 KB 520 KB
FPU 없음 단정밀도
DSP 확장 없음 SIMD MAC, 포화 연산
XAP 오디오 불가 전체 지원 (4ch @96kHz)
ADPCM 오디오 1-2ch 선택적 4ch 지원
Pico SDK 보드 pico pico2
가격 ~$4 ~$5

RP2040에서 XAP는 불가능하다. Cortex-M0+ 코어에는 하드웨어 FPU가 없으므로 모든 부동소수점 연산이 소프트웨어로 에뮬레이션된다. XAP 인코딩은 FPU 사용 시 ~10 MIPS/채널이지만 소프트웨어 플로트에서는 ~40+ MIPS/채널로 다중 채널 오디오의 RP2040 예산을 초과한다.


사용 사례

RP2040은 다음 용도에 권장된다:

  • 환경 모니터링: 온도, 습도, 기압, CO2
  • 간단한 진동 모니터링: ADC를 통한 단축 가속도계
  • 전력 모니터링: 전류 및 전압 센서
  • 저비용 센서 네트워크: 오디오가 필요 없는 경우

오디오 스트리밍이 필요하면 RP2350 (Pico 2)을 사용한다.


하드웨어 설정

LTE 모뎀 (UART0) -- BG770A

RP2040 GPIO              LTE 모뎀
------------------       ------------------
GPIO0  (UART0_TX) -----  RXD
GPIO1  (UART0_RX) -----  TXD
GPIO2  (GPIO)     -----  PWRKEY
GPIO3  (GPIO)     -----  RESET_N
VSYS (5V)         -----  VCC (LDO 경유)
GND               -----  GND

센서 입력 (ADC)

GPIO ADC 채널 일반적 용도
GPIO26 ADC0 온도 센서
GPIO27 ADC1 습도 센서
GPIO28 ADC2 기압 센서
GPIO29 ADC3 진동 / 전류

I2C 센서

버스 GPIO 주요 장치
I2C0 GPIO4 (SDA), GPIO5 (SCL) CHT832X (온도/습도), BME280
I2C1 GPIO6 (SDA), GPIO7 (SCL) LIS3DH (가속도계)

Rust 빌드 (권장)

# 의존성 설치
rustup target add thumbv6m-none-eabi
cargo install probe-rs-tools

# 빌드
cd sdk/examples/rp2040-sensor
cargo build --release

# 플래시
cargo run --release  # .cargo/config.toml을 통해 probe-rs 사용

모든 RP2040 예제는 sdk/examples/를 참고한다.


레거시 C 빌드 시스템

cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)

project(my_sensor_node C CXX ASM)
set(PICO_BOARD pico)  # 중요: 원본 Pico 타겟, Pico 2 아님
pico_sdk_init()

add_subdirectory(sdk/rp2040)

add_executable(my_sensor_node src/main.c)
target_link_libraries(my_sensor_node
    pico_stdlib
    hardware_adc
    hardware_i2c
    hardware_watchdog
    hardware_timer
    xylolabs_sdk_rp2040
)
pico_add_extra_outputs(my_sensor_node)

RP2350 빌드와의 주요 차이

PICO_BOARD=pico로 설정한다 (pico2가 아님). Pico SDK가 RP2040에 맞는 시작 코드와 링커 스크립트를 자동으로 선택한다.


메모리 예산

영역 크기 설정 매크로
XMBP 패킷 버퍼 4 KB XYLOLABS_XMBP_BUF_SIZE
HTTP 버퍼 4 KB XYLOLABS_HTTP_BUF_SIZE
메타데이터 누적 ~4 KB 4ch x 100 samples x f32
AT 명령 버퍼 ~1 KB 내부
스택 + SDK 내부 ~8 KB
SDK 합계 ~21 KB 264 KB의 8%
앱 사용 가능 ~243 KB

소프트웨어 부동소수점 고려사항

RP2040에는 FPU가 없으므로 부동소수점 연산이 에뮬레이션된다:

  • float 곱셈: ~20 사이클 (Cortex-M4F에서는 1 사이클)
  • float 나눗셈: ~70 사이클
  • float 삼각함수: ~200+ 사이클

성능이 중요한 센서 보정에는 부동소수점 대신 스케일링 팩터를 사용하는 고정소수점 정수 연산을 고려한다.


전력 관리

RP2040은 dormant 및 sleep 모드를 지원한다:

// Rust (Embassy) - 권장
use embassy_time::Timer;

// 샘플 사이 경량 슬립 (비동기 타이머 웨이크업)
Timer::after_micros(interval_us - 500).await;

// 이벤트 트리거 웨이크업은 Embassy GPIO 인터럽트 사용
let mut sensor_int = Input::new(p.PIN_X, Pull::Down);
sensor_int.wait_for_rising_edge().await;
레거시 C 코드
// 샘플 사이 경량 슬립 (타이머 웨이크업)
sleep_us(interval_us - 500);  // 타이밍 정확도를 위해 약간 일찍 웨이크

// 딥 dormant 모드 (GPIO 웨이크업만)
// 이벤트 트리거 센서에 유용
dormant_until_pin(GPIO_SENSOR_INT, true, false);  // 상승 에지에서 웨이크

Rust (권장)

Rust는 새로운 RP2040 프로젝트의 권장 언어이다. Embassy 기반 Rust 예제는 컴파일 타임 타입 안전성을 유지하면서 비동기 센서 폴링과 네트워킹을 구현한다.

cd sdk/examples/rp2040-sensor
cargo build --release
# probe-rs를 통해 결과 ELF를 플래시한다
probe-rs run --chip RP2040 target/thumbv6m-none-eabi/release/rp2040-sensor

자세한 빌드 지침은 sdk/examples/README.md를 참고한다.


C 예제 (대안) ### 기존 예제 `sdk/rp2040/examples/` 디렉토리에 포함된 예제: | 예제 | 설명 | |------|------| | `sensor_node.c` | 100Hz에서 4채널 ADC 센서 스트리밍 |

문제 해결

증상 가능한 원인 해결 방법
워치독 리셋 루프 xylolabs_tick() 호출 빈도 부족 틱이 4초마다 실행되는지 확인
부정확한 센서 값 소프트웨어 플로트 반올림 스케일링을 사용한 정수 연산 활용
높은 전력 소모 샘플 사이 슬립 미사용 메인 루프에 sleep_us() 추가
RP2350 오류로 빌드 실패 잘못된 PICO_BOARD 설정 CMake에서 PICO_BOARD=pico 설정
모뎀 무응답 UART 보드레이트 불일치 기본 115200, 모뎀 설정 확인

추가 자료