本项目包含专为 STM32H7 系列高性能微控制器(Cortex-M7 内核)打造的 TOF (Time-of-Flight) 激光测距传感器底层驱动。针对对机器人底盘姿态估计、云台测距跟随等对数据刷新率与实时性有极高要求的系统,本驱动采用 USART 空闲中断 + DMA 双缓冲乒乓机制,并彻底解决了 H7 架构下 DMA 与 CPU 之间的 D-Cache 一致性问题,确保 921600 bps 高波特率下数据帧的零丢失与极低延迟。
本驱动基于 NLink_Frame0 协议(完全兼容 Nooploop TOFSense 等主流高频单点测距雷达)。
| 外设/引脚 | 详细分配 | 物理层配置参数 |
|---|---|---|
| USART2_TX | PD5 (复用 AF7) |
波特率: 921600 bps数据位: 8位 停止位: 1位 校验位: 无 |
| USART2_RX | PD6 (复用 AF7) |
|
| DMA_RX | DMA1_Stream0 |
开启双缓冲模式 (DBM),方向:外设到内存 (Byte对齐) |
| DMA_TX | DMA1_Stream1 |
方向:内存到外设 (备用或用于传感器参数配置) |
-
硬件级双重缓冲 (Ping-Pong Buffer) 通过直接操作 DMA 控制寄存器(
DMA_SxCR_DBM/DMA_SxCR_CT),构建了包含两个 32 字节容量的tof_rx_buf[2][32]接收矩阵。在中断回调USER_USART2_RxHandler中,程序会根据当前 DMA 指针自动读取空闲区数据,实现“外设持续写入”与“CPU 同步解析”的完全异步化。 -
Cortex-M7 D-Cache 一致性安全保障 H7 芯片开启 Cache 后,DMA 搬运到 SRAM 的数据可能不会立即被 CPU 核心感知。本驱动做了两层硬核防护:
- 内存对齐:使用
ALIGN_32BYTES宏强制接收数组以 32 字节边界对齐(匹配一条 Cache Line 大小),防止相邻变量被误刷新。 - 高速缓存失效:在数据解析函数
tof_to_data()的最前置节点,严格调用SCB_InvalidateDCache_by_Addr(),强制 CPU 丢弃内部陈旧缓存,直接从 RAM 读取最新雷达数据。
- 内存对齐:使用
-
系统存储保护 (MPU) 预留
main.c中已集成完整的MPU_Config()框架,为后续更复杂的非 Cache 区域划分或外设共享内存配置提供了安全底层。
├── main.c # 系统入口:包含 MPU 初始化、HSE/PLL 极速时钟树配置 (1VCOWIDE) 及外设拉起
├── bsp_tof.c / .h # 核心驱动:DMA 多缓冲手动配置、NLink_Frame0 校验和解析及全局缓存解算
├── usart.c / .h # 串口底层:USART2 波特率、AF 映射及 RX/TX 的 DMA 流通道绑定配置
├── dma.c / .h # DMA 时钟使能与总全局中断优先级抢占配置
└── stm32h7xx_it.c # 中断路由:精简的中断服务函数,USART2 发生空闲中断时触发帧级调度分发