用Stm32CubeMX在STM32F107上移植LWIP(PHY:DM9161A)

2023-05-16

背景

        有一块吃灰7年的神州IV号开发板,主控芯片STM32F107VCT6,PHY芯片DM9161A,配套的资料都是当年ST的标准库。这个开发板应该是因为当年上市太匆忙,资料和代码的细节部分做的不太好。

        最近想玩玩MQTT,想用这个开发板的网口,顺便通过此过程熟悉下STM32 ETH的用法。配置其实网上教程很多,看着也不难,结果试下来老是ping不通,一开始感觉无从下手。后来追代码,看手册,检查原理图等等,耗费大半周业余时间终于在清明假期的第二天上午ping通了,终于感到点安慰。记录下过程就要出去晒晒太阳了。

欢迎备注原作者转发

 

1.根据原理图在STM32CubeMx中做配置

我的开发板是用的RMII通讯方式

自动协商开启(协商全双工半双工,10M还是100M),因为没有使用系统,用裸机跑lwip, 所以模式选择polling

Phy地址应该是由硬件引脚决定的,我的是0.

因为配置里没有DM9161A,所以随便选了个LAN8742.其实只用基本功能,这些PHY的基本寄控制和状态存器都是有标准规定死的,都一样。不一样的是后面的一些厂家指定的寄存器,我开始没ping通就是因为这个厂家指定的寄存器。

STM32F107的MCO给RMII模式的PHY提供50MHZ的时钟,记得配好。并且MCO引脚要记得设置为高频输出,默认为low。

LWIP配置我用的固定IP,没用OS,其他默认。

2. 生成代码并编译

我用的MDK,所以选择MDK版本。

在因为选的是polling模式,Main函数循环中添加MX_LWIP_Process()函数,在此处处理收发包

编译完成下载,网口绿灯亮,黄灯伴随ping闪烁,但是不通,无法访问主机。

3.调试

使用debug调试代码+wareshark发现开发板收到了电脑发的ping命令,并且内容正确,也做了回复,但电脑侧还是无法访问主机。既然灯亮并且能收到ping包且做了回复,说明起码PHY运行起来了,但是可能配置有问题。

于是看了DM9161A的芯片手册,F107的ETH相关的手册(太多了,头都大了),囫囵吞枣,有了个大概印象。然后开始一步一步的追ETH的初始化代码。开发板自带了ETH的驱动程序,不过是7年前的标准库,而且代码写的也很随意,但起码板子是能跑的,于是我就对照该代码看CUBE生成的代码。

终于。。。我发现了问题

初始化过程中先设置PHY为自动协商模式,确定该模式已经生效后会读取PHY的状态寄存器,根据协商结果去初始化MAC的参数。而这个寄存器因为一开始我不知道其意义,是配错了的。

一开始因为Cube里那个PHY speed duplex mask的名字困扰了我,我也不知道这个寄存器有啥用,就在DM9161A的芯片手册里搜了这个名字,得到如下图结果,然后就把这个寄存器的偏移21还有对应位给填到cube配置参数中了。结果当然是有问题的。因为初始化代码要读取PHY的协商结果来设置MAC,而这个寄存器配错了,读取的结果肯定也不对,导致MAC配置的全双工半双工以及10M和100M就错了,那当然不能正常通信了。

 

在明白了驱动代码的含义后,再次翻看DM9161A的数据手册,终于找到了正确的寄存器。下图是改对后的

这里其实有个问题,cube默认双工半双工用1bit表示,10M100M用另一bit表示,总共两位。生成的代码里也是按照判断这两位来初始化。而DM9161A实际上用了4个bit

这就导致了cube生成的代码这个地方的判断是不能继续使用的,需要修改。此处的修改是和你选择如何判断模式有关的,不是唯一的,我的修改如下,

修改前

修改后

 

4.测试结果

修改了以上部分后,重新编译下载程序,再次ping,终于通了,激动啊!!!!

同时也庆幸,万一问题不在这,我还得继续研究MAC其他参数关于DMA的那部分的驱动代码,而那部分太复杂了,都不知道能不能坚持下去。

 

5. 写在最后

一开始用的是最新的STM32CubeIDE(基于cubeMXV5.5),集成了eclipse环境,可视化很好,追踪代码也很方便,然而调试很困难,老有问题断开。而且在我配置了固定IP后生成的代码中是没有IP的,此处估计是bug.

然后退回了很久前使用过的一个老版本cubeMx5.01+MDK,终于成功了。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Stm32CubeMX在STM32F107上移植LWIP(PHY:DM9161A) 的相关文章

  • stm32cubeMX+FreeRTOS(4)—— main函数while循环

    0 发现 想在主函数中打印一下串口数据 xff0c 发现一直打印不出来 xff0c 试了下开关小灯 xff0c 发现没有进main函数的while循环 xff0c 阿西吧 xff0c 我大概要重新看一下CubeMX的rtos架构了 本来打算
  • STM32H723 + DP83848 + LWIP + RT-Thread(FreeRTOS) + STM32CubeMX + Keil MDK 超详细

    工程环境 xff1a MCU xff1a STM32H723ZGT ETH PHY xff1a DP83848 RT Thread xff1a RT Thread nano 3 1 5 Software Pack xff1a STM32Cu
  • LWIP (1.1) ETH Module以太网模块

    STM32 以太网 ETH模块说明 1 overview 2 ETH module in stm32h743 STM32H743 为例 开局一张图 ETHER 模块 红框所示 以STM32H743为例 32 BIt AHB为内部高速总线 D
  • 基于STM32CubeMX移植freeModbusRTU(从站)

    困惑了将近一年多的ModbusRTU在我昨天穷极无聊给自己定目标的情况下搞出来了 xff0c 以前移植不出来主要原因就是基本功不扎实 xff0c 没有进一步理解串口和定时器配置的原理 xff0c 一通操作 xff0c 移植完之后就Timeo
  • STM32cubeMX将STM32F767+LAN8720+LwIP+FreeRTOS的以太网实现

    通过STM32cubeMX将STM32F767 43 LAN8720 43 LwIP 43 FreeRTOS的以太网实现 本文使用了正点原子的阿波罗开发板 xff0c 接下来我将粗略的对STM32F767通过STM32cubeMX进行以太网
  • 基于STM32CUBE的LWIP+FREERTOS+Socket构成的TCP服务器

    本实验基于STM32F767制作 一 实验目的 本实验主要目的是通过Socket网络编程方法完成通过以太网控制两个LED的亮灭的 xff0c 同理可用到继电器上控制其它高电压设备 二 实验步骤 1 首先先生成一个带有LWIP和FreeRTO
  • 【STM32CubeMX】使用STM32F103C8T6输出PWM波形实现呼吸灯

    STM32CubeMX 使用STM32F103C8T6输出PWM波形实现呼吸灯 一 关于PWM二 Cube MX创建工程三 修改代码四 效果展示五 总结六 参考与代码下载 一 关于PWM 1 关于PWM 含义 PWM xff08 Pulse
  • STM32CubeMX系列|串口通讯

    串口通讯 1 串口简介 在串行通信中 xff0c 一个字符一个字符地传输 xff0c 每个字符一位一位地传输 xff0c 并且传输一个字符时 xff0c 总是以 起始位 开始 xff0c 以 停止位 结束 在进行传输之前 xff0c 双方一
  • STM32移植LWIP

    目录 01 IAR工程移植 02 修改Keil工程 在上篇文章 LWIP初体验 修改ST官方demo 中我们已经在自己的开发板上实现了简单的TCPsever和TCPclient功能 验证完了硬件 xff0c 接下来的工作就是优化代码 xff
  • stm32cubeMx 软件的删除用户代码的问题总结

    今天研究了一下stm32cubeMx 这个软件 若是stm32 的项目比较紧急 可以使用这个软件来生成驱动代码 至于在这个软件中的模块代码的选择 配置 我这里不会多说 因为网上很多 我这里主要 总结stm32cubeMx 会删除用户代码的问
  • STM32CubeIDE使用笔记(02):STM32CubeMX配置与代码生成

    文章目录 目的 用户界面 引脚输出和配置 时钟配置 项目管理 工具 代码生成 更换芯片 总结 目的 STM32CubeIDE中整合了STM32CubeMX用来配置芯片资源生成初始化代码 本篇将介绍STM32CubeMX使用方法 用户界面 界
  • LWIP学习笔记(2)---IP协议实现细节

    IP头 收到的数据首先保存在pbuf结构中 The IPv4 header struct ip hdr version header length PACK STRUCT FLD 8 u8 t v hl type of service PA
  • STM32CubeMX之RTC电子钟

    STM32CubeMX之RTC电子钟 1 简介 实时时钟是一个独立的定时器 RTC模块拥有一组连续计数的计数器 在相应软件配置下 可提供时钟日历的功能 修改计数器的值可以重新设置系统当前的时间和日期 2 特性 可编程的预分频系数 分频系数最
  • 以太网学习(2)-- 网络协议简介

    目录 一 协议简介 二 协议间报文封装与拆封 三 LWIP简介 四 Lwip文件说明 4 1 如何获取LWIP源码文件 4 2 LWIP文件说明 lwip目录 src目录 core目录 4 3 查看lwip的说明文档 五 LWIP的三种编程
  • PHY调试经验

    1 PHY调试过程 1 设备树中配置正确的PHY ADDR PHY ID clause 45或者22协议 PHY ADDR配置不正确会导致MDC MDIO通信不正常或失败 PHY ID用于匹配PHY驱动程序 2 通过MDC MDIO读写PH
  • STM32CubeMX学习一 之GPIO配置

    文章目录 前言 一 本地环境 二 开始 1 工程创建 2 GPIO配置 2 时钟配置 3 代码生成 3 编译工程 前言 记录一下STM32CubeMX的学习笔记 同时分享给初学的小白 希望一起进步 一 本地环境 编译环境 KEIL 代码生成
  • STM32 基础系列教程 33 - Lwip_tcp_client

    前言 学习stm32 以太网接口使用 及LWIP使用 用LWIP快速实现一个TCP client网络通信功能 学会基本LWIP的网络数据接收与发送功能 让初学者了解lwip 关于Lwip更多的功能介绍将会在后期的STM32 中级教程中介绍
  • STM32CUBEMX F103 HAL库开发 两路定时器的Encoder编码器模式

    机器人开发过程中 对于直流电机来说 编码器至关重要 它不仅可以使我们对电极进行精确的速度闭环 位置闭环 还可以通过时间积分 根据运动学关系 获得速度 位置等信息 STM32的定时器有编码器模式 大大的方便我们的开发 使用STM32cubeM
  • 【STM32CubeMX】位置式PID调节控制输出电压(超详解)

    本文将借助STM32CubeMX来配置ADC DMA DAC USART 并利用PID位置式算法实现对输出电压进行AD采集通过PID算法调节DAC 获取到我们想要的电压值 讲解的主要知识 何为PID以及为何需要PID STM32CubeMX
  • STM32CubeMX学习六 之ADC配置

    文章目录 前言 一 本地环境 二 开始 1 定时器配置 2 引脚配置 在这里插入图片描述 https img blog csdnimg cn e5b6f155a1b8468cb15046a0a9d031cd png 3 内部时钟配置 4 A

随机推荐

  • 使用docker安装ubuntu镜像

    使用docker安装ubuntu镜像 查找Ubuntu镜像 docker search ubuntu 安装Ubuntu镜像 docker pull ubuntu 查看docker镜像 docker images 运行docker镜像 doc
  • Ubuntu安装kalibr

    Ubuntu安装kalibr错误集锦 一 安装过程 ros参考 xff1a https blog csdn net Mua111 article details 107513509 kalibr安装参考 xff1a https blog c
  • 树莓派4b ubuntu系统开启串口

    树莓派4b安装ubuntu server18后如何开启串口 xff1f 树莓派4b的引脚图如下 xff1a 其中GPIO14和GPIO15是硬件串口 因为我安装的不是Raspian系统 xff0c 因此无法用raspi config打开该串
  • 惯性导航原理(1):导航坐标系及相互转换

    一 导航坐标系转换 坐标系介绍1 惯性坐标系 xff08 地心惯性坐标系 xff09 i系2 地球坐标系 xff08 地心地固坐标系 xff09 e系3 WGS 84坐标系 xff08 常用 xff09 blh坐标系4 当地水平地理坐标系g
  • win7系统下安装Ubuntu20.04.5系统保姆级教程

    一 制作u盘启动盘 准备工作 xff1a 一个空的8G大小的u盘 43 ultraISO软件 43 ubuntu系统的镜像文件 1 下载并安装ultraISO软件 下载地址 xff1a 百度网盘 请输入提取码 提取码 xff1a jv6a
  • 手把手带你免费打嘉立创pcb板

    手把手带你免费打嘉立创pcb板 前言一 熟悉规则二 下单1 下载安装下单助手2 领劵 注意 前言 嘉立创的新规则 xff1a 上个月消费没有满20的话只支持立创EDA画的板子 一 熟悉规则 嘉立创的免费规则和板子工艺要求如下 xff0c 大
  • ADRC学习与参数整定心得

    ADRC xff0c 中文名是自抗扰控制技术 继承了经典PID控制器的精华 xff0c 对被控对象的数学模型几乎没有任何要求 xff0c 又在其基础上引入了基于现代控制理论的状态观测器技术 xff0c 将抗干扰技术融入到了传统PID控制当中
  • ArUco相关

    ArUco相关 ArUco xff0c 一个开源的微型的现实增强库 https blog csdn net bashendixie5 article details 113769010 Aruco码估计相机位姿初步 xff01 xff01
  • ArUco

    文章目录 一 ArUco简介二 Marker和字典三 步骤1 创建Marker xff08 Marker Creation xff09 2 检测Marker xff08 Marker Detection xff09 3 姿态估计 xff08
  • Python PIP升级后执行命令报错: sys.stderr.write(f“ERROR: {exc}“)解决方法

    近日在使用pip时终端始终提示 You are using pip version 8 1 1 however version 21 0 1 is available You should consider upgrading via th
  • 戴尔Optiplex-7080装ubuntu16.04双系统时遇到的一些坑

    目录 ubuntu16 04安装过程中遇到的坑安装教程安装类型为空 xff08 读取不到磁盘 xff09 ubuntu16 04安装完成后无法启动windows ubuntu16 04无法连接无线网络 ubuntu16 04安装过程中遇到的
  • Ubuntu 16.04无法检测双屏/nvidia-smi显示no running processing found/nvidia-settings读取不到显卡信息

    问题 xff1a 1 笔记本ubuntu 16 04系统无法检测双屏 xff0c xrandr不显示hdmi接口或hdmi disconnectted 2 nvidia smi的最下方显示No running processes found
  • C++中的智能指针:shared_ptr

    本文主要参考 std shared ptr C 43 43 shared ptr共享型智能指针详解 std shared ptr 是一种智能指针 xff0c 它能够记录多少个 shared ptr 共同指向一个对象 xff0c 从而消除显式
  • pixhawk4 mini重启后死机

    pixhawk4 mini通过供电口供电 xff0c telement1口连接数传 xff0c usb口连接树莓派 xff08 机载计算机 xff09 此时如果用QGC地面站数传发送reboot指令 xff0c pixhawk4 mini关
  • C++利用auto对std::vector进行遍历时auto的类型

    先把结论摆在最前面 xff0c 当使用for auto amp node nodes 对std vector lt xxx gt nodes进行遍历时 xff0c auto定义的node其实是一个对nodes中对应元素的引用 具体的探究过程
  • 使用roslaunch为Gazebo加载自定义模型时黑屏、报错问题

    今天自己弄了一个dae类型的模型文件 xff0c 想要导入gazebo xff0c 按照gazebo world文件中导入dae模型的问题文章操作了一番 xff0c 编写如下 world文件 span class token operato
  • 点云地图导入gazebo思路

    参考这篇帖子下曹超大神的回答 xff0c 思路如下 xff1a 曹超CMU xff1a 如果不需要用地图渲染rgb图像的话 xff0c 我们通常的做法是把纯激光雷达点云地图导入CloudCompare进行downsample和计算每个点的n
  • Git删除历史commit记录中的大文件

    在使用Git的过程中 xff0c 常常会出现不小心commit了没用作用的大文件 xff0c 导致无法push到远程的情况 xff0c 并且即使删除了该文件重新commit xff0c 该文件也已经保存在历史commit中 xff0c 仍然
  • realsense d435 刷固件后连接失败问题

    刷固件后提示 Backend in rs2 create device info list 000001B00E9DF470 index 0 source gt QueryInterface uuidof IKsTopologyInfo r
  • 用Stm32CubeMX在STM32F107上移植LWIP(PHY:DM9161A)

    背景 有一块吃灰7年的神州IV号开发板 xff0c 主控芯片STM32F107VCT6 xff0c PHY芯片DM9161A xff0c 配套的资料都是当年ST的标准库 这个开发板应该是因为当年上市太匆忙 xff0c 资料和代码的细节部分做