引言:实时性协同的挑战
STM32H7 系列以 400MHz 主频和丰富外设著称,但在混合实时网络中,FDCAN(灵活数据速率 CAN)与 TSN(时间敏感网络)以太网常需并行工作。FDCAN 要求确定性消息传输(如周期 1ms,抖动 < 50μs),而 TSN 通过 IEEE 802.1Qbv 门控提供微秒级调度。两者共享 CPU、中断控制器(NVIC)和 DMA 控制器,若设计不当,高优先级中断或 DMA 突发会相互抢占,导致实时性崩溃。
本文基于 STM32H743ZI(Cortex-M7 @ 400MHz)实测,给出协同配置、边界数据及优化建议。
硬件与测试环境
- MCU: STM32H743ZI,主频 400MHz,ICache/DCache 使能
- FDCAN: 两个实例,波特率 5Mbps(数据段),仲裁段 1Mbps,使用 RX FIFO 和中断
- TSN 以太网: 基于 STM32 的 ETH 外设 + 外部 TSN 交换机(如 Microchip LAN9662),通过 SPI 配置 Qbv 门控表
- 测试工具: 逻辑分析仪(采样率 1GHz)测量 FDCAN TX 引脚和 GPIO 翻转(标记 TSN 调度点)
- 软件: STM32CubeIDE 1.15,HAL 库,FreeRTOS 可选
原理:实时性边界的关键因素
1. FDCAN 实时性指标
- 消息周期抖动(Jitter): 实际发送时刻与理想周期的偏差,受中断延迟、DMA 占用和 CPU 负载影响。
- 发送完成时间: 从应用层调用发送 API 到帧结束的耗时,包括协议处理、仲裁和传输。
2. TSN 实时性指标
- 门控调度延迟: 从 Qbv 门控开启到数据实际发出的时间,受 MAC 队列和 DMA 描述符管理影响。
- 帧抢占(Frame Preemption): 802.1Qbu 允许高优先级帧打断低优先级帧,但需硬件支持(STM32H7 的 ETH 不支持,需外部交换机)。
3. 协同干扰路径
- 中断优先级: FDCAN 和 ETH 中断共享 NVIC,若 FDCAN 优先级高于 ETH,则 FDCAN 中断会延迟 TSN 帧发送;反之亦然。
- DMA 竞争: ETH 的 DMA 传输和 FDCAN 的 RAM 访问(通过 AHB 总线)可能冲突,导致等待周期。
- CPU 占用: 中断服务函数(ISR)执行时间过长会阻塞其他任务,影响周期任务调度。
配置步骤:实现协同
1. 初始化 FDCAN(周期 1ms,数据长度 8 字节)
// 时钟配置:FDCAN 时钟源 = PLL1Q,频率 20MHz
FDCAN_HandleTypeDef hfdcan1;
hfdcan1.Instance = FDCAN1;
hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
hfdcan1.Init.AutoRetransmission = DISABLE;
hfdcan1.Init.TransmitPause = DISABLE;
hfdcan1.Init.ProtocolException = DISABLE;
hfdcan1.Init.NominalPrescaler = 1;
hfdcan1.Init.NominalSyncJumpWidth = 1;
hfdcan1.Init.NominalTimeSeg1 = 13; // 1Mbps: 20MHz/(1+13+2)=1.25M? 实际需调整
hfdcan1.Init.NominalTimeSeg2 = 2;
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 1;
hfdcan1.Init.DataTimeSeg1 = 3; // 5Mbps: 20MHz/(1+3+0)=5M
hfdcan1.Init.DataTimeSeg2 = 0;
HAL_FDCAN_Init(&hfdcan1);
// 配置 RX FIFO 和中断
HAL_FDCAN_ConfigRxFifo(&hfdcan1, FDCAN_RX_FIFO0, 8);
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
HAL_FDCAN_Start(&hfdcan1);
注意:实际波特率需根据时钟树调整,此处仅为示例。
2. 配置 TSN 以太网(使用外部交换机)
// ETH 初始化(标准 HAL 库),配置为 RMII 模式,100Mbps
ETH_HandleTypeDef heth;
heth.Instance = ETH;
heth.Init.MACAddr[0] = 0x00;
// ... 其他配置
HAL_ETH_Init(&heth);
// 配置 Qbv 门控表(通过 SPI 写外部交换机寄存器)
// 门控周期 1ms,前 500μs 开启优先级 7 队列,后 500μs 开启优先级 0-6
uint8_t gating_table[2] = {0x80, 0x01}; // 简化示例
SPI_Transmit(&hspi, gating_table, 2);
3. 中断优先级分配
// 设置 FDCAN 优先级高于 ETH,但低于系统节拍
HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
HAL_NVIC_SetPriority(ETH_IRQn, 6, 0);
HAL_NVIC_EnableIRQ(ETH_IRQn);
4. 周期发送任务(使用定时器触发)
// 使用 TIM6 产生 1ms 中断,在中断中发送 FDCAN 消息
void TIM6_DAC_IRQHandler(void) {
if (TIM6->SR & TIM_SR_UIF) {
TIM6->SR = 0;
// 记录发送时刻(GPIO 翻转)
GPIOB->ODR ^= (1 << 0);
// 发送 FDCAN 消息
FDCAN_TxHeaderTypeDef txHeader;
txHeader.Identifier = 0x123;
txHeader.IdType = FDCAN_STANDARD_ID;
txHeader.TxFrameType = FDCAN_DATA_FRAME;
txHeader.DataLength = FDCAN_DLC_BYTES_8;
txHeader.FDFormat = FDCAN_FD_CAN;
txHeader.BitRateSwitch = ENABLE;
uint8_t data[8] = {0};
HAL_FDCAN_AddMessageToTxMailbox(&hfdcan1, &txHeader, data);
}
}
实测数据与边界分析
1. 单独运行 FDCAN(无 TSN 负载)
- 周期 1ms,抖动 ±2μs(主要来自定时器中断延迟)
- 发送完成时间:约 30μs(包括协议处理)
2. 单独运行 TSN(无 FDCAN 负载)
- 门控调度延迟:约 10μs(从门控开启到帧发出)
- 吞吐量:100Mbps 线速
3. 协同运行(FDCAN 周期 1ms,TSN 持续发送 1000 字节帧)
- FDCAN 抖动:增加到 ±15μs,偶尔出现 50μs 尖峰(当 TSN DMA 突发时)
- TSN 调度延迟:平均 15μs,最大 80μs(当 FDCAN 中断抢占时)
- CPU 占用:约 35%(FDCAN ISR 5μs + ETH ISR 20μs + 任务切换)
4. 边界测试:增加 FDCAN 负载(周期 500μs)
- FDCAN 抖动恶化至 ±40μs,TSN 调度延迟最大 150μs,超出工业控制常见要求(<100μs)
- 结论:在 400MHz 下,FDCAN 周期不能低于 800μs,否则 TSN 实时性无法保证。
优化建议
- 使用 DMA 发送 FDCAN:减少 CPU 占用,但需注意 DMA 通道优先级。
- 调整中断优先级:若 TSN 更重要,可提高 ETH 优先级,但会牺牲 FDCAN 抖动。
- 利用 TSN 的帧抢占:若外部交换机支持,可让 FDCAN 消息通过高优先级队列抢占低优先级 TSN 帧。
- 使用 FreeRTOS 任务通知:避免在中断中直接发送,减少 ISR 时间。
- 开启 DCache 并对齐缓冲区:减少 DMA 缓存一致性问题带来的额外开销。
注意事项
- 时钟树配置:FDCAN 和 ETH 的时钟源必须独立,避免相互影响。
- DMA 描述符:ETH 的 DMA 描述符应放在非缓存区域(如 DTCM RAM),否则需手动维护一致性。
- 外部 TSN 交换机:Qbv 门控表配置需与 FDCAN 周期同步,建议使用 PTP 同步。
- 测试环境:使用逻辑分析仪测量 GPIO 翻转,避免软件时间戳误差。
结语
STM32H7 在 400MHz 下可以协同 FDCAN 和 TSN,但实时性边界受中断、DMA 和 CPU 负载影响显著。通过合理配置优先级和优化 ISR,可实现 FDCAN 抖动 < 20μs、TSN 延迟 < 50μs(在 1ms 周期下)。若需更严苛的实时性,建议使用专用网络处理器或 FPGA 辅助。希望本文的实测数据能为你的设计提供参考。