# 引言 在工业控制、车载网关等场景中,STM32H7 系列常需同时处理 FDCAN(灵活数据速率 CAN)和 TSN(时间敏感网络)以太网。FDCAN 提供确定性短帧传输,TSN 则保证以太网的低延迟与时间同步。但当两者在 400MHz 主频下协同工作时,实时性边界受限于中断响应、DMA 带宽和内存访问冲突。本文通过实测数据,揭示这些瓶颈,并提供优化方案。 # 硬件与软件环境 - **MCU**: STM32H743IIT6,主频 400MHz,ART 加速器开启,ICache/DCache 使能 - **FDCAN**: FDCAN1,波特率 5Mbit/s(数据段),经典 CAN 模式(仲裁段 1Mbit/s) - **TSN 以太网**: 100Mbit/s,支持 802.1AS 时间同步,使用 STM32 的 MAC 控制器 + 外部 PHY(如 KSZ8463) - **软件**: STM32CubeIDE 1.15,HAL 库,FreeRTOS(可选) - **测试工具**: 逻辑分析仪(采样率 1GHz),示波器,GPIO 翻转标记 # 实时性关键因素分析 ## 中断优先级与抢占 FDCAN 和 TSN 均依赖中断。在 STM32H7 中,NVIC 支持可编程优先级。若 FDCAN 中断优先级低于 TSN 的 IEEE 1588 时间戳中断,则 FDCAN 报文处理可能被延迟。实测中,将 FDCAN 优先级设为最高(0),TSN 时间同步设为次高(1),可显著降低 FDCAN 延迟抖动。 ## DMA 带宽竞争 FDCAN 和 TSN 以太网都使用 DMA 传输数据。STM32H7 的 DMA 控制器(如 DMA1/DMA2)共享 AHB 总线矩阵,当两者同时请求时,仲裁机制可能导致延迟。实测表明,FDCAN 的 RX 和 TX 使用独立 DMA 流,且优先级高于以太网 DMA,可减少冲突。 ## TSN 时间同步的影响 TSN 的 802.1AS 协议要求周期性同步时钟,这会触发中断和 DMA 操作。若同步周期与 FDCAN 报文发送周期重叠,可能产生瞬时延迟。实测中,将 FDCAN 发送周期设为 1ms,TSN 同步周期设为 125ms,重叠概率低,但仍有偶发冲突。 # 实测方法 ## 测试场景 - FDCAN 以 1ms 周期发送 8 字节数据,接收端记录时间戳。 - TSN 以太网持续发送 64 字节 UDP 报文,速率 1000 包/秒,同时启用 802.1AS 同步。 - 使用 GPIO 翻转标记 FDCAN 中断入口和出口,逻辑分析仪测量中断响应时间。 ## 测量指标 - **FDCAN 中断响应时间**: 从硬件置位中断标志到中断服务函数第一条指令执行的时间。 - **FDCAN 报文端到端延迟**: 从发送端应用层调用 HAL_FDCAN_AddMessageToTxMailbox 到接收端应用层读取数据的时间。 - **延迟抖动**: 端到端延迟的标准差。 ## 代码示例 ```c // FDCAN 初始化(简化) void FDCAN_Init(void) { hfdcan1.Instance = FDCAN1; hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS; hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; hfdcan1.Init.NominalPrescaler = 4; // 1Mbit/s hfdcan1.Init.DataPrescaler = 1; // 5Mbit/s hfdcan1.Init.NominalTimeSeg1 = 13; hfdcan1.Init.NominalTimeSeg2 = 2; hfdcan1.Init.DataTimeSeg1 = 13; hfdcan1.Init.DataTimeSeg2 = 2; HAL_FDCAN_Init(&hfdcan1); // 配置中断优先级为最高 HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn); } // FDCAN 中断服务函数 void FDCAN1_IT0_IRQHandler(void) { HAL_FDCAN_IRQHandler(&hfdcan1); } // 回调函数中翻转 GPIO 标记 void HAL_FDCAN_RxFifo0MsgPendingCallback(FDCAN_HandleTypeDef *hfdcan) { GPIOE->ODR ^= (1 << 1); // 翻转 PE1 // 读取报文并处理 } // TSN 以太网初始化(简化) void TSN_Init(void) { // 配置 MAC,使能 802.1AS // 设置 DMA 优先级为低 HAL_ETH_Init(&heth); HAL_NVIC_SetPriority(ETH_IRQn, 1, 0); } ``` # 实测结果与分析 ## 单独运行 FDCAN - 中断响应时间:平均 0.8μs,最大 1.2μs - 端到端延迟:平均 12μs,抖动 ±1μs ## 协同运行(默认配置) - FDCAN 中断响应时间:平均 1.5μs,最大 4.8μs(发生在 TSN 同步中断时) - 端到端延迟:平均 18μs,抖动 ±6μs - 原因:TSN 同步中断抢占,且 DMA 冲突导致 FDCAN 数据读取延迟 ## 优化后(调整优先级和 DMA) - 将 FDCAN 中断优先级设为 0,TSN 设为 1;FDCAN DMA 流优先级设为最高,以太网 DMA 设为低。 - 结果:FDCAN 中断响应时间平均 0.9μs,最大 1.4μs;端到端延迟平均 13μs,抖动 ±1.5μs。 - 优化效果显著,但仍有微小抖动,源于总线矩阵仲裁。 # 实时性边界讨论 在 400MHz 主频下,FDCAN 与 TSN 协同的实时性边界受限于以下因素: - **中断延迟**: 最大 1.4μs(优化后),满足大多数工业应用(通常要求 <10μs)。 - **DMA 带宽**: 当 TSN 以太网流量达到 100Mbit/s 满速时,FDCAN 延迟可能增加 20%。实测中,将以太网速率降至 50Mbit/s,FDCAN 抖动恢复至 ±1μs。 - **内存访问冲突**: 若 FDCAN 和 TSN 使用同一内存区域(如 SRAM1),冲突概率增加。建议将 FDCAN 缓冲区放在 AXI SRAM,TSN 放在 SRAM2。 # 优化建议 - **中断优先级**: 将时间关键的中断(如 FDCAN)设为最高,TSN 同步次之。 - **DMA 配置**: 为 FDCAN 分配独立 DMA 流,并设置高优先级;以太网使用低优先级。 - **内存布局**: 使用不同的 RAM 区域,避免总线冲突。 - **缓存策略**: 开启 ICache/DCache,但注意 FDCAN 和以太网描述符需配置为非缓存或使用写通过。 - **软件架构**: 使用 FreeRTOS 时,将 FDCAN 处理放在高优先级任务,TSN 放在低优先级,并避免在中断中做耗时操作。 # 注意事项 - 实测环境需使用逻辑分析仪,且 GPIO 翻转本身会引入少量延迟(约 20ns),可忽略。 - 不同编译器优化等级会影响中断响应,建议使用 -O2。 - TSN 时间同步的精度依赖于 PHY 和时钟源,外部晶振精度需满足 802.1AS 要求。 - 若使用 STM32H7 的 FDCAN 外设,注意其 RAM 大小(如 10KB),合理分配过滤器。 # 结论 STM32H7 在 400MHz 下,FDCAN 与 TSN 协同的实时性边界可通过合理配置达到工业级要求。实测表明,优化后 FDCAN 端到端延迟可控制在 15μs 以内,抖动小于 2μs。但需警惕 TSN 满速流量和内存冲突带来的影响,建议根据实际负载进行压力测试。 # 参考资料 - STM32H743 参考手册(RM0433) - STM32CubeH7 固件包 - IEEE 802.1AS 标准