修改udp_echo_client示例程序步骤:1、从官方网站下载STSW-STM32070面向STM32F4x7微控制器的LwIPTCP/IP协议栈的演示代码的英文文档DM00036052.pdf和软件包stsw-stm32070.zip。stsw-stm32070.zip是面向STM32F4x7微控制器的LwIPTCP/IP协议栈的演示代码,DM00036052.pdf是演示代码的说明文档。2、将stsw-stm32070.zip解压得到STM32F4x7_ETH_LwIP_V1.1.0文件夹,下面是STM32F4x7_ETH_LwIP_V1.1.0文件夹架构3、删除_htmresc文件夹,这个文件夹是ST及CMSIS公司logo,没什么用。4、打开project文件夹,这个文件夹包括两个文件夹:FreeRTOS和Standalone。FreeRTOS文件夹里的程序示例是基于系统的LWIP移植示例,这里我们不需要,直接删除。Standalone文件夹里是一些无操作系统LWIP移植示例程序,在这里我们工程需要的是普通的数据传输,所以只使用到UDP,所以我们只保留udp_echo_client文件夹,其他的都删除掉。在udp_echo_client文件夹中EWARM文件夹是IAREWARM建立的工程,MDK-ARM是以keilMDK建立的工程。在这里我们选择MDK工程,IAR建立的工程可以保留也可以删除。还有一个文件夹RIDE,打开看了看,应该是用另一款编译软件建立的工程空间,这里我们不需要,直接删除掉。5、Utilities-Third_Party文件夹下面有三个文件夹FatFs_vR0、FreeRTOSV7.3、lwip-1.4.1。FatFs_vR0一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统,FreeRTOSV7.3一个迷你操作系统内核的小型嵌入式系统,在这里我们用不上,直接删除。lwip-1.4.1文件夹是LWIP源码,是我们所需要的。6、打开MDK-ARM文件夹里面的MDK工程,我们先编译一下,可以看到有0个错误,三个警告,其中两个警告是定义了变量但是没有使用,我们不去管它,另一个警告是..\..\..\..\Utilities\Third_Party\lwip-1.4.1\port\STM32F4x7\Standalone\ethernetif.c(366):warning:#1-D:lastlineoffileendswithoutanewline提示ethernetif.c文件的最后一行(也就是366行)没有换行,MDK里面每个文件的最后一行必须换行,不然会提示一个警告,这里把366行后面换行再编译,这个警告就去掉了。7、打开main.h文件,因为我们电路板上使用的是RMII接口,所以将#defineMII_MOD注释掉,将//#defineRMII_MODE取消注释,如下所示:在这里要注意RMII的时钟为50MHz,在电路板上直接焊接一个50MHz的有源晶振就可以了。取消//#defineUSE_DHCP的注释,启用动态地址分配,当地址分配不成功则使用静态IP地址。如图:注释掉或删除USE_LCD和serial_debug,本项目没有这两项,如下图:本项目中直接删除掉,因为删除掉了SERIAL_DEBUG,所以我们可以将serial_debug.c文件从项目中移除。点击红色的叉号删除serial_debug.c,然后点击OK就可以了。将STM324xG_EVAL中的stm324x7i_eval.c和stm324x7i_eval_lcd.c删除,将MDK_ARM中的启动文件startup_stm32f427x.s删除,将ProjectTargets分栏中的项目名STM324x7I_EVAL删除,将STM324xG_EVAL中的stm324xg_eval_lcd.c删除这是和本项目无关的东西。编译会提示错误,我们将stm32f4x7_eth_bsp.h文件里关于包含LCD头文件的函数删除掉,如下图,将该行删除掉。将stm32f4x7_eth_bsp.c文件里面关于LCD的部分删除掉,如下图,将这些行删除。再编译就没有问题了。8、修改stm32f4xx.h中宏定义标识符HSE_VALUE的值为我们的外部时钟20MHz设置主PLL时钟,在System_stm32f4xx.c文件开头的地方配置所以我们的主PLL时钟为:PLL=20MHz*N/(M*P)=20MHz*336/(20*2)=168MHzSystemInit()函数中设置的系统时钟大小:SYSCLK(系统时钟)=168MHzAHB总线时钟(HCLK=SYSCLK)=168MHzAPB1总线时钟(PCLK1=SYSCLK/4)=42MHzAPB2总线时钟(PCLK2=SYSCLK/2)=84MHzPLL主时钟=168MHz9、这个例程默认的是STM324xG_EVAL开发板,它使用的主芯片是STM32F407IG,而我们项目所使用的主芯片是STM32F407VE。点击弹出如下窗口选择Device将下面的主芯片改为10、下面我们进入main.c函数看一下程序:首先的注释是说明系统时钟已经配置完成,如果修改的话可以参考第8条。接下来就是配置终端优先级分组NVIC_PriorityGroupConfig,这个很重要,只要定义了中断,就必须配置终端优先级分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。这里分配了的是组4,4位抢占优先级,0位响应优先级。接下来的是条件编译和LCD初始化,在前面我们已经删除SERIAL_DEBUG串口调试和LCD头文件,这里我们直接将这段程序删除。如下图,将这几行代码删除掉。删除mian.c下面关于LCD的信息:删除128行以后的所有数据。打开stm324xg_eval.h,注释掉第39行#includestm32_eval_legacy.h,这个头文件是关于开发板上LCD及按键的声明,本项目中没有用到LCD和按键。打开stm32f4x7_eth_bsp.c文件,删除关于LCD的一些程序,删除447至472行的程序及485到495行的程序,这里的程序时在LCD屏上显示一些语句及本机的IP。删除如下图所示程序。打开netconf.c文件,删除关于LCD的程序,删除第219至223行程序,删除239至255行程序,删除274至290行程序。这是关于显示分配动态IP的信息的程序。11、下面是ETH_BSP_Config();配置以太网(GPIOs,clocks,MAC,DMA),对于GPIO的配置,我们选用的是RMII接口,而且芯片是STM32F407VE,和开发板上有些引脚定义有些差别,所以我们可以对网口的GPIO接口修改:注意以太网配置那段注释里面,双斜线的是我们RMII没有用到的引脚,还有就是要将PG11/PG13/PG14修改为PB11/PB12/PB13。12、接下来就是修改关于LED和按键的程序了,删除netconf.c里面第179行、第234行和252行将stm324xg_eval.c文件除了#includestm324xg_eval.h其他全部删除,如图所示将stm324xg_eval.h文件除了下图所示程序其他全部删除:我们项目电路板上所用到的功能就可以在这两个文件夹定义和声明了。13、在UDP客户端这个例程中式利用按键中断来发送数据包的,本项目是当收到下位机的数据后就将数据转发给PC,所以在这里用不到按键中断。之前我们删除了LCD_LED_BUTTON_Init();这个函数,这个函数就是配置LED、LCD、以及按键初始化及按键中断的函数。所以在这里这个按键中断已经没有作用了,我们可以将UDP客户端发送数据包的函数直接复制到主函数中,将按键中断函数清空。按键中断函数在stm32f4xx_it.c函数中,如下图,将udp_echoclient_connect();复制到主函数中就可以了,等我们改写主函数会用到这个函数。复制完之后直接将这个函数内容清空就可以了。在main.c中还有添加udp_echoclient_connect()函数的头文件udp_echoclient_connect()。LWIP协议栈的UDP收发数据??voidUDP_Receive(void*arg,structudp_pcb*upcb,structpbuf*p,structip_addr*addr,u16_tport){uint8_ti=0;structip_addrdestAddr=*addr;if(p!=NULL)/*如果收到的数据不为空*/{//pbuf_copy_partial(p,UDPData,p-len,0);udp_sendto(upcb,p,&destAddr,port);/*将收到的数据再发送出去*/pbuf_free(p);/*释放缓冲区数据*/}}UDP收数据,再将其收的数据返回PC,我一旦使用了pbuf_copy_partial把UDP接收的数据拷贝至UDPdata数组后,就不能再将接收的数据发出去了,该如何正确使用pbuf_copy_partial函数将udp收到的数据保存在自己定义的数组里呢?没有搞过这个,看描述,估计是pbuf_copy_partial()这个函数会把UDP的数据从p开始的地址拷贝到UDPData,长度为p-len,最后那个参数0不知道是什么意思,是把p开始的缓冲区清空吗,LZ看看是不是这个要改改。如果是清空了,udp_sendto当然发不出去数据了,没有数据了嘛。不过你可以不要用p吧,替换一下,用udp_sendto(upcb,UDPData,&destAddr,port);试试看行不行。如果这些都不行,你在查查有没有你需要的API能实现你要的功能吧。STM32F107调试lwIP心得开发板:STM3210C-EVAL(STM原厂开发板,用起来确实很爽)因为公司有项目,要做一个以太网的通讯模块,所以这段时间就一直在调试lwIP裸机程序。大体上实现了lwIP的UDP通讯。后续对UDP传输协议中的数据分析、控制等都会很快就出来了。在lwIP中实现UDP协议的客户端,主要过程如下:unsignedcharconstUDPArr[6]={hello!};intmain(void){structudp_pcb*Udppcb1;structip_addripaddr1;structpbuf*p;/*SetupSTM32system(clocks,Ethernet,GPIO,NVIC)andSTM3210C-EVALresources*/System_Setup();/*InitilaizetheLwIPsatck*/LwIP_Init();//测试UDP客户端发送数据p=pbuf_alloc(PBUF_RAW,sizeof(UDPArr),PBUF_RAM);p-payload=(void*)(UDPArr);IP4_ADDR(&ipaddr1,192,168,1,11);Udppcb1=udp_new();udp_bind(Udppcb1,IP_ADDR_ANY,161);udp_connect(Udppcb1,&ipaddr1,161);udp_send(Udppcb1,p);/*Infiniteloop*/while(1){/*Periodictasks*/System_Periodic_Handle();}}大体解释一下:该程序就是将开发板作为一个UDP客户端,不停的向主机发送“hello!”字符,目前已经实现,程序完整调试通过。在UDP处理机制中,System_Periodic_Handle();是一个周期性的任务,在UDP中其实只是做ARP的老化实现,而不像TCPIP协议中那样需要对连接超时进行处理,这里都不需要。下面一个例子是UDP