在看本教程之前建议先看ST官方关于ETH的培训视频。 本章不打算详细讲解LwIP协议栈,
本章只是介绍如何通过STM32 CubeMX软件生成初始化程序,并移植官方固件库里面的示例程序。
http://www.stmcu.com.cn/videos.html
本章程序在LCD滚动显示字符工程的基础上修改, 复制工程修改文件夹名。打开 STM32cubeMX 的工程文件重新配置,ETH选择RMII模式,使能LWIP。
1
ETH 参数不作修改为默认设置。
LWIP General配置不作修改,为默认配置。
提交评论
All LwIP Options中,TCP_QUEUE_OOSEQ选项为Disabled,否则编译会提示错误。
提交评论
开启ETH中断,优先级为默认。
提交评论
生成报告以及初始化代码,编译程序。应用层多出下面三个文件。
提交评论
其中ethernetif.c文件包括ETH管脚初始化,寄存器参数初始化,以及底层驱动接口等函数。
lwip.c为LWIP协议栈初始化文件,通过DHCP获取IP或者设置静态IP。本实验中DHCP选择设置为使能,故有路由器动态分配IP地址。
提交评论
下载一下应用程序解压并添加到工作目录中。这些文件移植ST官方固件库示例程序。
STM32Cube_FW_F7_V1.3.0ProjectsSTM32756G_EVALApplicationsLwIPLwIP_HTTP_Server_Raw
LwIP_HTTP_Server_Raw.zip
提交评论
文件中包含这些文件,其中fsdata文件为网站的数据文件,不需添加到工程中,
fs.c文件类似一个文件系统,包含打开文件,读取文件等操作,读取fsdata中的数据。
httpd.c为静态网页处理程序文件。
httpd_cgi_ssi.c为动态网页处理程序文件。
提交评论
在main函数中添加初始化程序,初始化LCD,HTTP。
01
/* USER CODE BEGIN 2 */
02
/* Initialize the SDRAM */
05
/* Initialize the LCD */
08
/* Clear the LCD Background layer */
09
BSP_LCD_SetLayerVisible(1,DISABLE);
11
/* Set LCD Foreground Layer */
12
BSP_LCD_SelectLayer(0);
14
BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
16
/* Initialize LCD Log module */
19
/* Show Header and Footer texts */
20
LCD_LOG_SetHeader((uint8_t *)"Webserver Application Raw API");
21
LCD_LOG_SetFooter((uint8_t *)"WaveShare Open7XXI-C board");
23
LCD_UsrLog (" State: Ethernet Initialization ...n");
27
/* Http webserver Init */
30
/* Notify user about the netwoek interface config */
31
User_notification(&gnetif);
提交评论
其中 User_notification()输出当前网络接口配置的函数。判断是否通过DHCP获取IP地址。如果不能动态IP地址则设置静态IP。在mxconstants.h常量头文件中添加如下宏定义设置IP地址以及网关等。
01
/* USER CODE BEGIN Private defines */
02
#define USE_LCD /* enable LCD */
03
#define USE_DHCP /* enable DHCP, if disabled static address is used */
05
/*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */
06
#define IP_ADDR0 (uint8_t) 192
07
#define IP_ADDR1 (uint8_t) 168
08
#define IP_ADDR2 (uint8_t) 1
09
#define IP_ADDR3 (uint8_t) 110
12
#define NETMASK_ADDR0 (uint8_t) 255
13
#define NETMASK_ADDR1 (uint8_t) 255
14
#define NETMASK_ADDR2 (uint8_t) 255
15
#define NETMASK_ADDR3 (uint8_t) 0
18
#define GW_ADDR0 (uint8_t) 192
19
#define GW_ADDR1 (uint8_t) 168
20
#define GW_ADDR2 (uint8_t) 1
21
#define GW_ADDR3 (uint8_t) 1
22
/* USER CODE END Private defines */
提交评论
在while循环中添加LWIP处理任务函数以及DHCP周期处理函数。
[color=#0820 !important]01
/* USER CODE BEGIN WHILE */
04
/* USER CODE END WHILE */
06 /* USER CODE BEGIN 3 */
09
/* handle periodic timers for DHCP */
10
DHCP_Periodic_Handle(&gnetif);
提交评论
最后导入外部变量以及添加头文件。
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern struct netif gnetif;
/* USER CODE END PV */
/* USER CODE BEGIN Includes */
#include "stm32746g_sdram.h"
#include "stm32746g_LCD.h"
#include "lcd_log.h"
#include "app_ethernet.h"
#include "httpd.h"
/* USER CODE END Includes */
提交评论
最后编译程序,并下载到开发板,将DP83848 Ethernet Board接入Open746I-C的ETH接口并接上网线,网线另一端连接到和电脑统一局域网,或者和电脑直接相连。打开LCD上显示的IP地址。如下为显示页面:
提交评论