通过STM32cubeMX将STM32F767+LAN8720+LwIP+FreeRTOS的以太网实现
本文使用了正点原子的阿波罗开发板,接下来我将粗略的对STM32F767通过STM32cubeMX进行以太网协议配置。
具体步骤
1.首先使能ETH,模式选择RMII;
2.使能LWIP和FREERTOS;
因为阿波罗的开发板PHY芯片的ETH_DXT1和ETH_DXT0用的是PG13,PG14引脚,和默认的不同,所以这里改一下
3.配置时钟,在这里我放上我自己的时钟配置图,只要不标红就行,我用的是25MHz外部晶振作时钟源 ;
4.配置ETH,由于阿波罗开发板的LAN8720芯片的PHYAD0引脚悬空,故PHY Address设置为0;
5.由于我用的STM32cubeMX的版本是将LAN8742A作为默认芯片,所以我们这里不做修改,只用将内部参数改为LAN8720参数即可;
6.配置LWIP,本人这里不使用DHCP获取IP地址等信息,并且我使用的是TCP,所以未对UDP使能,设置如图;
7.配置FREERTOS,我在这里加了两个线程备用
8.按下生成按钮,生成项目,生成时需要选择编译软件为自己用的软件,本人使用的是V5;
由于阿波罗开发板的PHY芯片的RESET引脚是依靠PCF8574的P7位控制,所以我们要在项目中引入PCF8574的代码,以下代码可以在阿波罗资料盘中找到
打开main.c里的加上#include “pcf8574.h”,并在初始化部分将PCF8574初始化
#include "main.h"
#include "stm32f7xx_hal.h"
#include "cmsis_os.h"
#include "lwip.h"
#include "gpio.h"
#include "pcf8574.h"
void SystemClock_Config(void);
void MX_FREERTOS_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
PCF8574_Init();
MX_GPIO_Init();
MX_FREERTOS_Init();
osKernelStart();
while (1)
{
}
}
打开freertos.c里的加上
#include “gpio.h”
#include “sys.h”
#include “pcf8574.h”
#include “tcp_echoserver.h”,并在主线程将PCF8574初的P7管脚使能
PCF8574_WriteBit(ETH_RESET_IO,0);代码如下
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
#include "gpio.h"
#include "sys.h"
#include "pcf8574.h"
#include "tcp_echoserver.h"
osThreadId defaultTaskHandle;
osThreadId myTaskLEDHandle;
osThreadId myTaskTCPHandle;
extern void tcp_echoserver_init(void);
void StartDefaultTask(void const * argument);
void LEDTask(void const * argument);
void TCPTask(void const * argument);
extern void MX_LWIP_Init(void);
void MX_FREERTOS_Init(void);
void MX_FREERTOS_Init(void) {
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
osThreadDef(myTaskLED, LEDTask, osPriorityIdle, 0, 128);
myTaskLEDHandle = osThreadCreate(osThread(myTaskLED), NULL);
osThreadDef(myTaskTCP, TCPTask, osPriorityIdle, 0, 1024);
myTaskTCPHandle = osThreadCreate(osThread(myTaskTCP), NULL);
}
void StartDefaultTask(void const * argument)
{
MX_LWIP_Init();
PCF8574_WriteBit(ETH_RESET_IO,0);
Tcp_Server_Init();
for(;;)
{
osDelay(1);
}
}
void LEDTask(void const * argument)
{
for(;;)
{
osDelay(1);
}
}
void TCPTask(void const * argument)
{
for(;;)
{
osDelay(1);
}
}
接下来我们的开发板连上电脑,保证电脑IP地址和开发板IP地址在同一网段后按Windows+R后输入cmd回车打开CMD,在界面输入ping xxx.xxx.xxx.xxx(xxx代表开发板IP地址),可以得到
这样开发板就ping通了,这个时候就可以引入服务器或是客户端的代码,实现对应功能。
源码以上上传Gitee,链接放在旁边,点赞打赏走一走
ModbusTCP代码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)