引言

在工业控制、车载网关等场景中,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 到接收端应用层读取数据的时间。
  • 延迟抖动: 端到端延迟的标准差。

代码示例

// 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 标准