开发环境:
windows10
软件:
STM32CubeMX最新版本:
gcc工具链:
vscode
硬件:
STM32F407ZGT6开发板,ETH原理图:
根据硬件可知MAC和PHY之间的接口类型为RMII,且PHY使用的外部晶振,这种情况下不需要单片机给PHY芯片提供时钟,而是由PHY的REF-CLK引脚给单片机的MAC控制器提供一个时钟用于同步,此时单片机MAC控制器和PHY芯片的时钟其实都来自于PHY的外部晶振。(还有一种方式是PHY芯片不使用外部晶振,而是单片机给它提供时钟)
1.STM32CubeMX生成代码
第一步首先用CubeMX生成开箱即用的代码,验证硬件功能是正常的。
打开cubemx,新建工程:
选择自己使用的芯片,双击进入:
先配置系统时钟,选择使用外部时钟HSE,类型是石英或者陶瓷晶振:
再配置sw调试接口:
然后可以配置时钟:
只需修改HSE的频率和想要设置的主频大小,回车后会自动配置。
接着配置引脚:
在右下角输入搜索的引脚号,对应的引脚就会闪烁,然后点击引脚选择功能:
根据自己的原理图依次设置完引脚后, 注意复位引脚选择output就可以了:
设置完成后可以在GPIO里查看:
此时因为ETH功能还没使能,右侧引脚图上的引脚都还是黄色:
当把ETH使能后引脚才会变成绿色:
设置完成后可以看到右边引脚视图的引脚都变成绿色:
在ETH的configuration里可以设置MAC地址,接收缓存的大小和接收模式,笔者建议都先不用改,注意提示,如果使用polling mode是不支持freertos的:
我们一开始测试先不用freertos,仅仅使用LWIP即可:
因为这里使用的芯片是LAN8720,所以直接选择了LAN8742,注意如果这里不选的话生成的文件中会少ETH引脚的初始化,所以无论你用的什么PHY芯片都可以先选择上。
再有就是一开始为了测试可以先把dhcp关掉,我们直接用静态IP测试:
到这一步如果引脚配置没问题,ETH基本功能已经可以使用了,剩下的就是生成代码:
最后点击右上角的生成:
使用vscode打开代码,生成的代码需要修改两个地方:
1.把Lwip处理添加到main的while循环:
注意,这个函数其实只有在不使用任何RTOS的时候才添加。
2.添加对PHY芯片的复位
因为复位引脚是单独的一个输出GPIO,并不属于ETH标准接口的一部分,所以需要我们自己设置和添加:
修改完成后,直接在终端里make,这里官方生成的工程有一个bug,在makefile里,有一个文件被添加了两次,所以会导致报一个重复定义的错误:
只需要删除掉其中一个就可以(如果没有这个bug请跳过):
最终编译完成结果是:
还要注意一点,如果单单修改头文件后再次make并不会重新编译,此时需要重新make clean后再make,但是windows下的powershell的rm指令和ubuntu不太一样,所以make clean会报错,这时可以手动在终端输入rm ./build/即可。build文件夹是makefile默认指定的生成文件夹。
2.代码下载与调试
vscode里面下载debug用的插件:
创建启动文件:
选择刚才下载的插件:
在打开的文件中输入:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug-jlink",
"cwd": "${workspaceRoot}/",
"executable": "${workspaceFolder}/build/STM32F407ZGT6.elf",
"request": "launch",
"type": "cortex-debug",
"servertype": "jlink",
"device": "STM32F407ZG",
"interface": "swd",
"runToEntryPoint": "main",
"showDevDebugTimestamps": true,
},
{
"name": "Cortex Debug-stlink",
"cwd": "${workspaceRoot}/",
"executable": "${workspaceFolder}/build/STM32F407ZGT6.elf",
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"device": "STM32F407ZG",
"interface": "swd",
"configFiles": [
"interface/stlink-v2.cfg",
"target/stm32f4x.cfg",
],
"runToEntryPoint": "main",
"showDevDebugTimestamps": true,
}
]
}
注意根据实际修改:
启动后会停在main函数,直接点击继续运行即可,然后使用其他设备设置在同个网段,这里407设置的IP是192.168.1.123,外接设备笔者设置的是192.168.1.120,ping的结果如下:
到这里,我们可以判断开发板的硬件是正常的。