返回首页

STM32 上的 SDR GPS:无需 ASIC 处理

本文描述了在 STM32F4 上使用 MAX2769 前端实现 SDR GPS 接收器。软件处理原始数据使用按位 XOR 进行 PRN 码相关,而不是传统的 ASIC。通过 SPI+DMA 捕获确保实时性。

STM32 微控制器上的软件 GPS 接收器
Advertisement 728x90

STM32 无专用芯片构建 SDR GPS 接收机

STM32F4 能够实时捕获并处理来自 GNSS 射频前端 MAX2769 的 2 位数据流,采样率为 16.368 MHz。整个从 ADC 到相关运算的链路均在软件中实现——无需 ASIC 或 FPGA——采用 DMA 和优化的位操作。

GNSS 接收机架构

传统 GPS 接收机依赖专用相关器(如 GP2021)来寻找 PRN 码的相关峰值。本项目用 MCU 取代硬件链路:

  • 射频前端(MAX2769)将信号以 4.092 MHz 中频数字化
  • DMA 将数据捕获到循环缓冲区
  • 软件处理:载波擦除、码擦除、相关运算

一个 PRN 周期(1 ms)包含 16368 个采样点——正好每个芯片 16 个采样(1023 个芯片)。位打包数据按每个芯片 2 字节分组。

Google AdInline article slot

硬件:MAX2769 前端

MAX2769 在预配置设备状态模式(PGM=1,变体 2)下,无需 SPI 配置即可在 I1 输出一位符号信号。开发板包含:

  • 16.368 MHz TCXO
  • 3.0V LDO
  • J3 上的有源天线
  • P5 上的时钟输出
  • P3 上的数据输出

频率选择确保完美对齐:16368 / 1023 = 16 采样/芯片。中频理想芯片模式:0b1100110011001100。

STM32F4-Discovery 数据捕获

STM32F4(Cortex-M4,168 MHz,192 KB RAM,1 MB Flash)使用 SPI + DMA 循环模式实现 16 Mbps 数据捕获。

Google AdInline article slot
  • 双缓冲:4 KB 缓冲区半满/满时中断
  • 每个 PRN 2 KB(2046 字节)
  • 额外缓冲区用于处理,避免中断 DMA

DMA 代码确保连续接收:丢失哪怕一个字节都会破坏同步。

位优化的 DSP 处理

无浮点单元式处理(16 Msamples/s),借鉴自制 GPS/GLONASS 接收机技巧:用 XOR 取代乘法处理符号数据。

XNOR(反向 XOR)等价于乘法(-1 -1 = 1,-1 1 = -1)。连续 XOR 处理反转。

Google AdInline article slot

操作向量化到 32 位字以提升速度。

信号处理链路

  • 载波 NCO:生成考虑多普勒、TCXO 误差和 4.092 MHz 中频的 I/Q 谐波。双混频器移至基带。
  • 码 NCO:本地 PRN(1023 芯片)插值为 16 采样/芯片。
  • 相关运算:输入数据与本地码逐元素 XOR + 累加。

复数 I/Q 形式分离边带。

// 位相关示例(伪代码)
for (i = 0; i < 2046; i += 4) {
    uint32_t input = buffer[i];
    uint32_t replica = prn_replica[i];
    corr += __builtin_popcount(input ^ replica) - 16;
}

资源占用与限制

  • 4 个相关通道:168 MHz 下占 ~70% CPU
  • RAM:每个通道 12 KB(缓冲区 + 状态)
  • 基础版无跟踪或导航数据
  • 手动星历初始化

项目在 SNR > 35 dB·Hz 下,冷启动 30–60 秒。

关键要点

  • STM32 全软件 GPS 链路——无 ASIC/FPGA
  • 位 XOR 胜过乘法:DSP 加速 10 倍
  • 16 采样/芯片精确 PRN 插值
  • 连续 DMA 捕获对同步至关重要
  • F4/F7 可扩展至 6–8 通道
  • 开源代码用于 L1 C/A 实验

— Editorial Team

Advertisement 728x90

继续阅读