用户名 立即注册 找回密码

微雪课堂

搜索
微雪课堂 STM32 STM32CubeMX系列教程 查看内容

STM32CubeMX系列教程27:ETH

2016-5-23 17:51| 发布者: waveshare-admin| 查看: 74548| 评论: 16

摘要: 本章讲解LwIP协议栈实现HTTP服务器
在看本教程之前建议先看ST官方关于ETH的培训视频。本章不打算详细讲解LwIP协议栈,
本章只是介绍如何通过STM32CubeMX软件生成初始化程序,并移植官方固件库里面的示例程序。


        本章程序在LCD滚动显示字符工程的基础上修改,复制工程修改文件夹名。打开STM32cubeMX的工程文件重新配置,ETH选择RMII模式,使能LWIP。


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.0\Projects\STM32756G_EVAL\Applications\LwIP\LwIP_HTTP_Server_Raw


文件中包含这些文件,其中fsdata文件为网站的数据文件,不需添加到工程中,
fs.c文件类似一个文件系统,包含打开文件,读取文件等操作,读取fsdata中的数据。
httpd.c为静态网页处理程序文件。
httpd_cgi_ssi.c为动态网页处理程序文件。

在main函数中添加初始化程序,初始化LCD,HTTP。

01  /* USER CODE BEGIN 2 */
02    /* Initialize the SDRAM */
03#ifdef USE_LCD
04  
05  /* Initialize the LCD */
06  BSP_LCD_Init();
07    
08  /* Clear the LCD Background layer */
09  BSP_LCD_SetLayerVisible(1,DISABLE);
10    
11  /* Set LCD Foreground Layer  */
12  BSP_LCD_SelectLayer(0);
13    
14  BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
15    
16  /* Initialize LCD Log module */
17  LCD_LOG_Init();
18    
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");
22    
23  LCD_UsrLog ("  State: Ethernet Initialization ...\n");
24  
25#endif
26      
27  /* Http webserver Init */
28  httpd_init();
29  
30  /* Notify user about the netwoek interface config */
31  User_notification(&gnetif);
32  /* USER CODE END 2 */


其中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 */
04   
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
10     
11/*NETMASK*/
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
16  
17/*Gateway Address*/
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周期处理函数。
01/* USER CODE BEGIN WHILE */
02while (1)
03{
04/* USER CODE END WHILE */
05 
06/* USER CODE BEGIN 3 */
07  MX_LWIP_Process();
08  #ifdef USE_DHCP
09  /* handle periodic timers for DHCP */
10  DHCP_Periodic_Handle(&gnetif);
11      #endif
12}
13/* USER CODE END 3 */

最后导入外部变量以及添加头文件。

/* 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地址。如下为显示页面:



669

顶一下

刚表态过的朋友 (669 人)

发表评论

最新评论

引用 游客 2018-7-11 22:41
Обтирочная ветошь хб – часто применяемый расходный материал на различных производствах. Нашими постоянными клиентами являются строительные и клининговые компании, авторемонтные мастерские, покрасочные станции и многие другие компании, где сталкиваются с проливом разл ...
引用 游客 2018-1-3 11:38
非常感谢大神
引用 游客 2017-3-25 23:10
我现在直接屏蔽了slipif.c 文件没错了./
文件        说明
etharp.c        包含ARP协议的实现代码。主要用来实现主机以太网物理地址到IP地址的映射。
ethernetif.c        包含了与以太网网卡密切相关的初始化、发送、接收等函数的实现。这个文件夹中的函数并不能使用,它们都是一个框架性的结构,移植者需要根据自己使用的网卡特性来完成这些函数。
loopif.c        为协议栈提供回环网络接口功能。使用这个接口可以实现本地两个进程之间的数据传递。
slipif.c        SLIP(串行链路IP),提供一种在串行链路上传送IP数据包的函数定义,移植者需要根据自己使用的串行线路特 ...
引用 游客 2017-3-25 22:53
+FREEFTOS编译出现这个错误还望出freeRTOS教程
引用 游客 2017-3-25 22:53
PRJ\PRJ.axf: Error: L6218E: Undefined symbol sio_open (referred from slipif.o).
PRJ\PRJ.axf: Error: L6218E: Undefined symbol sio_read (referred from slipif.o).
PRJ\PRJ.axf: Error: L6218E: Undefined symbol sio_send (referred from slipif.o).
PRJ\PRJ.axf: Error: L6218E: Undefined symbol sio_tryread (referred from slipif.o).
引用 游客 2017-3-17 15:36
很好很强大、、、、
引用 Ezio_神仙醋 2017-1-19 15:02
学习
引用 游客 2016-12-22 11:01
有没有使用cubemx生成freeRTOS和lwip的历程,生成的历程进不去网络中断,不知道哪的原因? ...
引用 游客 2016-12-13 15:32
再添加 上FreeRTOS吧。
引用 我不怕 2016-11-24 17:11
MyMX1213: 这个没有用到PA8作为参考时钟,而是用PA1作为参考时钟输出。这个配置的时候已经设置了复用引脚了。 如果要用PA8作为参考时钟,则PA8设设置RCC_MCO。然后在时钟图 ...
我知道了,你是不是有外部50M时钟源的。谢谢你啊,版主,另外我用CUBEMX配置出来的程序网口可以起来,但一直Ping的情况会出现丢包,不知道你有没有遇到这种情况?
引用 我不怕 2016-11-24 15:48
MyMX1213: 这个没有用到PA8作为参考时钟,而是用PA1作为参考时钟输出。这个配置的时候已经设置了复用引脚了。 如果要用PA8作为参考时钟,则PA8设设置RCC_MCO。然后在时钟图 ...
版主,你那一句“用PA1作为参考时钟输出。这个配置的时候已经设置了复用引脚了”是什么意思呀?和硬件设计上有关系么?
引用 游客 2016-11-24 14:32
[quote]MyMX1213: 这个没有用到PA8作为参考时钟,而是用PA1作为参考时钟输出。这个配置的时候已经设置了复 ...
引用 MyMX1213 2016-11-24 09:36
我不怕: RMII模式,为什么上述文档中没有讲到PA8引脚的相关配置?
这个没有用到PA8作为参考时钟,而是用PA1作为参考时钟输出。这个配置的时候已经设置了复用引脚了。
如果要用PA8作为参考时钟,则PA8设设置RCC_MCO。然后在时钟图中设置输出频率。
这个你可以参考我们Open746-C示例程序中DCMI-OV2640摄像头的设置,里面有用到PA8作为时钟输出的。
引用 我不怕 2016-11-22 18:36
RMII模式,为什么上述文档中没有讲到PA8引脚的相关配置?
引用 zhangyie10 2016-10-26 22:46
引用 游客 2016-9-3 17:20
支持一下

查看全部评论(16)

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2025-4-14 18:21 , Processed in 0.024659 second(s), 20 queries .

返回顶部