核心内容摘要
小白也能懂的OCR实战:用科哥ResNet18镜像快速搭建文字检测系统
硬件准备与电路连接使用STM32CubeMX配置以太网通信的第一步是确保硬件连接正确。
我手头用的是正点原子探索者STM32F407ZGT6开发板板载LAN8720A以太网PHY芯片。
这个芯片通过RMII接口与STM32F407的MAC层通信相比MII接口能节省一半的引脚资源。
LAN8720A的硬件连接有几个关键点需要注意复位引脚开发板上LAN8720A的ETH_RESET直接连接到了PD3这个引脚需要配置为GPIO输出模式时钟引脚PHY芯片的50MHz时钟可以由外部晶振提供也可以由STM32的MCO引脚输出RMII接口包括TXD0/TXD
RXD0/RXD
CRS_DV等信号线需要严格对应STM32的指定引脚实测中发现如果PHY芯片的复位时序不对很容易导致初始化失败。
我的经验是上电后先保持复位50ms以上再释放复位这样可以确保PHY芯片完全初始化。
CubeMX工程配置详解
1 时钟树配置以太网对时钟精度要求很高在CubeMX中需要特别注意主时钟配置为168MHzSTM32F407的最大频率ETH时钟必须配置为25MHz或50MHz在Clock Configuration标签页确保ETH时钟源选择正确我遇到过ETH无法工作的情况最后发现是PLL分频系数设错了。
建议新手直接使用CubeMX的Clock Configuration视图它会用颜色提示不合理的配置。
2 ETH外设配置在Connectivity标签页使能ETH模式选择RMII勾选Auto Negotiation在Advanced Parameters中建议开启CRC校验特别注意PHY地址的设置LAN8720A的地址由PHYAD0引脚决定探索者开发板上这个引脚接地所以地址是0。
如果地址设错会导致PHY寄存器无法访问。
3 LWIP协议栈配置在Middleware标签页启用LWIP勾选LWIP_SUPPORT内存池大小建议设置为10KB以上开启ICMP协议用于ping测试静态IP设为
192.
168.
10与PC同一网段有个坑要注意默认的MEM_SIZE可能太小会导致网络不稳定。
我一般设置为1600字节这个值要大于最大传输单元(MTU)。
4 FreeRTOS任务配置创建两个任务以太网初始化任务优先级适中应用任务如数据收发任务栈大小不要吝啬建议给以太网任务至少1024字。
我曾经因为栈溢出导致各种奇怪的网络故障调试了很久才发现问题。
关键代码实现
1 PHY复位代码在StartDefaultTask中添加PHY复位代码void StartDefaultTask(void *argument) { // PHY硬件复位 HAL_GPIO_WritePin(ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_RESET); osDelay(
; HAL_GPIO_WritePin(ETH_RST_GPIO_Port, ETH_RST_Pin, GPIO_PIN_SET); osDelay(
; // LWIP初始化 MX_LWIP_Init(); while(
{ osDelay(
; } }
2 网络状态检测添加链路状态检测很有必要void ethernet_link_thread(void *arg) { struct netif *netif (struct netif *)arg; for(;;) { if(netif_is_link_up(netif)) { // 链路正常 LED_ON; } else { // 链路断开 LED_OFF; } osDelay(
; } }
3 Ping测试优化默认的ping响应可能不稳定可以优化lwipopts.h中的配置#define LWIP_RAW 1 #define RAW_TTL 255 #define IP_REASSEMBLY 1 #define IP_FRAG
14.
常见问题排查
1 Ping不通的排查步骤检查网线连接状态灯是否亮起用示波器测量RMII参考时钟(50MHz)查看PHY寄存器状态特别是BSR和PHYID检查防火墙是否阻止了ICMP包
2 DMA描述符错误如果遇到DMA错误可能是内存对齐问题。
确保tx/rx描述符和缓冲区在DMA可访问的内存区域__ALIGN_BEGIN ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __ALIGN_END; __ALIGN_BEGIN ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __ALIGN_END;