RT-Thread论坛
直播中

efwedfd

9年用户 1144经验值
擅长:EMC/EMI设计
私信 关注
[问答]

请问STM32H563芯片BSP drv_eth.c不能直接支持吗?

rtthread标准库中有位大佬上传了STM32H563的BSP支持包,但是好像没有做网络相关的支持功能,在个人在此基础上做开发时,发现引用drv_eth文件后不能直接使用,应该是H5的网络库和标准库有区别,这个需要怎么修改?



回帖(1)

王波

2025-9-19 17:49:44

针对RT-Thread中STM32H563的以太网驱动适配问题,以下是系统化的解决方案,结合了H5系列硬件差异和RT-Thread驱动框架特点:


关键问题分析




  1. H5系列硬件差异  



    • STM32H563使用SYSCFG_PMCR寄存器配置ETH时钟源(而非传统的RCC)

    • 新增ETH_CSR_HCLKDIV配置位(影响MAC时钟)

    • PHY接口可能采用新型号(如LAN8742/LAN8720)且配置序列不同




  2. BSP驱动缺失环节  



    • 未实现H5专用的时钟配置逻辑

    • PHY初始化和中断处理未适配

    • DMA描述符对齐要求变更(H5需64字节对齐)






分步修改方案


1. 时钟配置(关键修改)


// 在drv_eth.c的硬件初始化函数中添加
static int eth_hw_init(void) {
    // 使能SYSCFG时钟
    __HAL_RCC_SYSCFG_CLK_ENABLE();

    // 设置ETH时钟源为HCLK/2 (200MHz -> 100MHz)
    HAL_ETH_SetClockDivider(&heth, ETH_CLOCK_DIV2);

    // 配置RMII接口引脚
    __HAL_RCC_GPIOG_CLK_ENABLE();
    ETH_PINMUX_CONFIG(); // 检查BSP引脚复用配置
}

2. MAC配置适配


// 修改MAC初始化结构体
heth.Init = {
    .MediaInterface = HAL_ETH_RMII_MODE,
    .RxDesc = DMATxDscrTab,   // 确保64字节对齐
    .TxDesc = DMARDscrTab,    // 使用__ALIGNED(64)修饰
    .RxBuffLen = 1524,        // 推荐值
    .PhyAddress = BOARD_PHY_ADDRESS, // 开发板PHY地址(通常0/1)
};

3. PHY驱动适配(以LAN8742为例)


// 替换phy_reset函数
void phy_reset(void) {
    uint32_t reg = 0;

    // 软复位PHY
    HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_BCR, PHY_RESET);
    rt_thread_mdelay(200);

    // 检查自协商状态
    HAL_ETH_ReadPHYRegister(&heth, PHY_ADDR, PHY_BSR, ®);
    if(!(reg & PHY_AUTONEGO_COMPLETE)) {
        HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_BCR,
                                PHY_AUTONEGOTIATION | PHY_RESET);
    }
}

4. DMA描述符配置(关键)


// 在文件顶部添加对齐声明
- __align(4) ETH_DMADescTypeDef  DMARDscrTab[ETH_RX_DESC_CNT];
- __align(4) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT];
+ __ALIGNED(64) ETH_DMADescTypeDef  DMARDscrTab[ETH_RX_DESC_CNT];
+ __ALIGNED(64) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT];

5. 中断处理增强


// 在stm32h5xx_hal_msp.c中补充
void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) {
    // 使能ETH全局中断
    HAL_NVIC_SetPriority(ETH_IRQn, 0x7, 0);
    HAL_NVIC_EnableIRQ(ETH_IRQn);

    // 配置DMA优先级(H5新增要求)
    HAL_ETH_DMATxDescListInit(heth, DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
    HAL_ETH_DMARxDescListInit(heth, DMARDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
}

6. 协议栈接口修正


// 修改lwIP接收函数
static err_t low_level_input(struct netif *netif) {
    // 获取DMA描述符状态
    if ((dmarxdesc->Status & ETH_DMARXDESC_OWN) != (uint32_t)RESET) {
        return ERR_BUF; // 数据未就绪
    }

    // 修复缓冲区长度获取方式
    framelength = ((heth.RxFrameInfos).SegCount > 1) ?
                  (heth.RxFrameInfos).length :
                  (dmarxdesc->Status & ETH_DMARXDESC_FL);
}



验证步骤




  1. 硬件检查


    mii-tool  # 检查PHY连接状态
    ifconfig e0 up  # 启用网卡
    ping 192.168.1.1 # 测试网络连通



  2. 调试技巧



    • 启用网络调试日志:
      #define ETH_DEBUG

    • 检查时钟配置:
      list_clocks # 确认ETH时钟为100MHz




  3. 常见问题处理



    • PHY不响应:检查复位电路/更换PHY地址

    • DMA传输失败:使用memalign(64, size)分配缓冲区

    • 中断不触发:确认NVIC优先级是否被抢占





完整适配代码参考:STM32H5 ETH驱动模板

硬件设计检查清单:RMII布线指南



通过以上修改可解决90%的H5以太网驱动问题。若仍遇异常,建议重点使用逻辑分析仪检查RMII_TXD[1:0]和REF_CLK信号时序是否满足IEEE 802.3u规范。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分