完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大神,最近在调试STM32F4+UCOSIII+LWIP网口功能,但是速度一直上不去,实在没有好的办法了!
之前参考了论坛中http://www.openedv.com/thread-43116-1-1.html 这篇文档,如下图 @zuozhongkai 我把我自己的测试结果发上来! |
|
相关推荐
23个回答
|
|
期望各位”码友“能给点参考意见!
|
|
|
|
我们实测TCP传输,速度可以到5MB/S。
|
|
|
|
|
|
|
|
不知道
|
|
|
|
楼主网速是怎提高的 给点参考意见
|
|
|
|
|
|
|
|
我基于UCOSIII移植的LWIP总是会在连接一段时间(差不多2个小时)后出现自动断线的情况,这是什么原因呢?
|
|
|
|
TCP长连接,短连接的基本知识啊,你看看就知道了,只要设置一下就可以了。
|
|
|
|
LZ,您好,您用的RMII还是MII模式了??我也正在使用DP83848,使用MII模式,好像MII与RMII只是引脚配置,还有外部晶振不一样????
|
|
|
|
我现在菜鸟一枚,不知道在哪里设置,可以指点一二么,万分感谢
|
|
|
|
楼主为什么不贴出解决方法?不厚道。
|
|
|
|
大哥 讲一下怎么调试的呗 跪求啊
|
|
|
|
我用的是RMII。
不过RMII和MII配置基本上没什么区别。我两个调过,我将代码贴出来供你参考![C] 纯文本查看 复制代码 /** * @brief Configures the different GPIO ports. * @param None * @retval None * @author Zhangkeyan */static void ETH_GPIO_Config_RMII(void){GPIO_InitTypeDef GPIO_InitStructure;/* 网卡接口采用RMIIPA1/ETH_RMII_RX_CLKPA2/ETH_MDIOPA7/RMII_CRS_DVPC1/ETH_MDCPC4/ETH_RMII_RX_D0PC5/ETH_RMII_RX_D1PG11/ETH_RMII_TX_ENPB12/ETH_RMII_TXD0PB13/ETH_RMII_TXD1//PH6/MII_INT*//* Enable GPIOs clocks */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOH, ENABLE);/* Enable SYSCFG clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);/* Configure PA1, PA2 and PA7 */GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);/* Configure PC1, PC4 and PC5 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);/* Configure PG11 **/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_Init(GPIOG, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, GPIO_AF_ETH);/* Configure PB12 and PG13 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH); //ETHERNET_NVICConfiguration();//以太网中断分组配置}/** * @brief Configures the different GPIO ports. * @param None * @retval None * @author Zhangkeyan */static void ETH_GPIO_Config_MII(void){ GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOs clocks */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG , ENABLE); /* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);/* MII/RMII Media interface selection --------------------------------------*/#ifdef MII_MODE /* Mode MII with STM324xx-EVAL */ SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);#endif /* Configure PA0,PA1,PA2,PA3,PA7 */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_7; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); /* Configure PB0,PB1,PB10,PB12,PB13 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_10| GPIO_Pin_12| GPIO_Pin_13; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH); /* Configure PC1, PC2, PC3, PC4 , PC5 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); /* Configure PE2 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOE, GPIO_PinSource2, GPIO_AF_ETH); /* Configure PG11 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH); //ETHERNET_NVICConfiguration();//以太网中断分组配置} |
|
|
|
改用中断方式!
|
|
|
|
你的调试问题在哪? 稍微阐述具体点,我好帮你回答!
|
|
|
|
|
|
|
|
|
|
|
|
第一个问题用到的代码如下:[AppleScript] 纯文本查看 复制代码
#include "tcp_client_demo.h"#include "lwip/opt.h"#include "lwip_comm.h"#include "lwip/lwip_sys.h"#include "lwip/api.h"#include "includes.h"#include "key.h"struct netconn *tcp_clientconn; //TCP CLIENT网络连接结构体u8 tcp_client_recvbuf[TCP_CLIENT_RX_BUFSIZE]; //TCP客户端接收数据缓冲区u8 tcp_client_sendbuf[TCP_CLIENT_TX_BUFSIZE]; //TCP客户端接收数据缓冲区//u8 *tcp_client_sendbuf="Explorer STM32F407 NETCONN TCP Client send datarn"; //TCP客户端发送数据缓冲区u8 tcp_client_flag; //TCP客户端数据发送标志位static u16* recv_data;OS_EVENT *Sem_Event; //定义一个信号量OS_EVENT *Str_Box; //定义一个消息邮箱//TCP客户端任务#define TCPCLIENT_PRIO 6//任务堆栈大小#define TCPCLIENT_STK_SIZE 300//任务堆栈OS_STK TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE];////TCP客户端发送任务#define TCPCLIENT_SEND_PRIO 7//任务堆栈的大小 #define TCPCLIENT_SEND_STK_SIZE 300 ////任务堆栈OS_STK TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE];u8 Recv_Lwip_Flag = 0x80;//任务函数声明static void tcp_client_send_thread(){ OS_CPU_SR cpu_sr; err_t err;// u8 Recv_Lwip_Flag; while(1) {// Recv_Lwip_Flag = *((u8*)OSMboxPend(Str_Box,5,&err));//请求消息邮箱 if((tcp_client_flag & LWIP_SEND_DATA)==LWIP_SEND_DATA) { err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,8192,NETCONN_COPY); //发送tcp_server_sentbuf中的数据 if(err != ERR_OK) { printf("发送失败rn"); }// Recv_Lwip_Flag &= ~LWIP_SEND_DATA; } else OS_Sched(); }}//tcp客户端任务函数static void tcp_client_thread(void *arg){ OS_CPU_SR cpu_sr; u32 data_len = 0; err_t err,recv_err; static ip_addr_t server_ipaddr,loca_ipaddr; static u16_t server_port,loca_port; LWIP_UNUSED_ARG(arg); server_port = REMOTE_PORT; IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]); tcp_clientconn = netconn_new(NETCONN_TCP); //创建一个TCP链接 err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器 if(err != ERR_OK) netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接 else if (err == ERR_OK) //处理新连接的数据 { struct netbuf *recvbuf; netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号 printf("连接上服务器%d.%d.%d.%d,本机端口号为:%drn",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3],loca_port); while(1) { if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK) //接收到数据 { OS_ENTER_CRITICAL(); //关中断 recv_data = (u16*)recvbuf->p->payload; //得到上位机发送的数据 data_len = recvbuf->p->len; OS_EXIT_CRITICAL(); //开中断 tcp_client_flag |= LWIP_SEND_DATA; // OSMboxPost(Str_Box,&tcp_client_flag); //发送消息tcp_client_flag netbuf_delete(recvbuf); }else if(recv_err == ERR_CLSD) //关闭连接 { netconn_close(tcp_clientconn); netconn_delete(tcp_clientconn); printf("服务器%d.%d.%d.%d断开连接rn",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]); break; }else OS_Sched(); } }}//创建TCP客户端线程//返回值:0 TCP客户端创建成功// 其他 TCP客户端创建失败INT8U tcp_client_init(void){ INT8U res; OS_CPU_SR cpu_sr; u16 i; for(i=0;i<9000;i++) { tcp_client_sendbuf = i; } OS_ENTER_CRITICAL(); //关中断 res = OSTaskCreate(tcp_client_thread,(void*)0,(OS_STK*)&TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE-1],TCPCLIENT_PRIO); //创建TCP客户端线程 res = OSTaskCreate(tcp_client_send_thread,(void*)0,(OS_STK*)&TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE-1],TCPCLIENT_SEND_PRIO); //创建TCP客户端线程// Sem_Event = OSSemCreate(0); //创建一个信号量用于任务间的同步// Str_Box = OSMboxCreate((void*)0); //创建消息邮箱 OS_EXIT_CRITICAL(); //开中断 return res;} |
|
|
|
LWIPOPTS.h的配置如下:
[AppleScript] 纯文本查看 复制代码 #ifndef __LWIPOPTS_H__#define __LWIPOPTS_H__//线程优先级#ifndef TCPIP_THREAD_PRIO#define TCPIP_THREAD_PRIO 5 //定义内核任务的优先级为5#endif#undef DEFAULT_THREAD_PRIO#define DEFAULT_THREAD_PRIO 2#define SYS_LIGHTWEIGHT_PROT 1 //为1时使用实时操作系统的轻量级保护,保护关键代码不被中断打断#define NO_SYS 0 //使用UCOS操作系统#define MEM_ALIGNMENT 4 //使用4字节对齐模式#define MEM_SIZE 32000 //内存堆heap大小#define MEMP_NUM_PBUF 30 //MEMP_NUM_PBUF:memp结构的pbuf数量,如果应用从ROM或者静态存储区发送大量数据时,这个值应该设置大一点#define MEMP_NUM_UDP_PCB 6 //MEMP_NUM_UDP_PCB:UDP协议控制块(PCB)数量.每个活动的UDP"连接"需要一个PCB.#define MEMP_NUM_TCP_PCB 10 //MEMP_NUM_TCP_PCB:同时建立激活的TCP数量#define MEMP_NUM_TCP_PCB_LISTEN 6 //MEMP_NUM_TCP_PCB_LISTEN:能够监听的TCP连接数量#define MEMP_NUM_TCP_SEG 300 //MEMP_NUM_TCP_SEG:最多同时在队列中的TCP段数量#define MEMP_NUM_SYS_TIMEOUT 8 //MEMP_NUM_SYS_TIMEOUT:能够同时激活的timeout个数//pbuf选项#define PBUF_POOL_SIZE 20 //PBUF_POOL_SIZE:pbuf内存池个数#define PBUF_POOL_BUFSIZE 1500 //PBUF_POOL_BUFSIZE:每个pbuf内存池大小#define LWIP_TCP 1 //使用TCP#define TCP_TTL 255 //生存时间#undef TCP_QUEUE_OOSEQ#define TCP_QUEUE_OOSEQ 0 //当TCP的数据段超出队列时的控制位,当设备的内存过小的时候此项应为0#undef TCPIP_MBOX_SIZE#define TCPIP_MBOX_SIZE MAX_QUEUE_ENTRIES //tcpip创建主线程时的消息邮箱大小#undef DEFAULT_TCP_RECVMBOX_SIZE#define DEFAULT_TCP_RECVMBOX_SIZE MAX_QUEUE_ENTRIES #undef DEFAULT_ACCEPTMBOX_SIZE#define DEFAULT_ACCEPTMBOX_SIZE MAX_QUEUE_ENTRIES #define TCP_MSS (1500 - 40) //最大TCP分段,TCP_MSS = (MTU - IP报头大小 - TCP报头大小#define TCP_SND_BUF (25*TCP_MSS) //TCP发送缓冲区大小(bytes).#define TCP_SND_QUEUELEN (10* TCP_SND_BUF/TCP_MSS) //TCP_SND_QUEUELEN: TCP发送缓冲区大小(pbuf).这个值最小为(2 * TCP_SND_BUF/TCP_MSS)#define TCP_WND (10*TCP_MSS) //TCP发送窗口#define LWIP_ICMP 1 //使用ICMP协议#define LWIP_DHCP 0 //使用DHCP#define LWIP_UDP 1 //使用UDP服务#define UDP_TTL 255 //UDP数据包生存时间#define LWIP_STATS 0#define LWIP_PROVIDE_ERRNO 1//帧校验和选项,STM32F4x7允许通过硬件识别和计算IP,UDP和ICMP的帧校验和#define CHECKSUM_BY_HARDWARE //定义CHECKSUM_BY_HARDWARE,使用硬件帧校验#ifdef CHECKSUM_BY_HARDWARE //CHECKSUM_GEN_IP==0: 硬件生成IP数据包的帧校验和 #define CHECKSUM_GEN_IP 0 //CHECKSUM_GEN_UDP==0: 硬件生成UDP数据包的帧校验和 #define CHECKSUM_GEN_UDP 0 //CHECKSUM_GEN_TCP==0: 硬件生成TCP数据包的帧校验和 #define CHECKSUM_GEN_TCP 0 //CHECKSUM_CHECK_IP==0: 硬件检查输入的IP数据包帧校验和 #define CHECKSUM_CHECK_IP 0 //CHECKSUM_CHECK_UDP==0: 硬件检查输入的UDP数据包帧校验和 #define CHECKSUM_CHECK_UDP 0 //CHECKSUM_CHECK_TCP==0: 硬件检查输入的TCP数据包帧校验和 #define CHECKSUM_CHECK_TCP 0#else //CHECKSUM_GEN_IP==1: 软件生成IP数据包帧校验和 #define CHECKSUM_GEN_IP 1 // CHECKSUM_GEN_UDP==1: 软件生成UDOP数据包帧校验和 #define CHECKSUM_GEN_UDP 1 //CHECKSUM_GEN_TCP==1: 软件生成TCP数据包帧校验和 #define CHECKSUM_GEN_TCP 1 // CHECKSUM_CHECK_IP==1: 软件检查输入的IP数据包帧校验和 #define CHECKSUM_CHECK_IP 1 // CHECKSUM_CHECK_UDP==1: 软件检查输入的UDP数据包帧校验和 #define CHECKSUM_CHECK_UDP 1 //CHECKSUM_CHECK_TCP==1: 软件检查输入的TCP数据包帧校验和 #define CHECKSUM_CHECK_TCP 1#endif#define LWIP_NETCONN 1 //LWIP_NETCONN==1:使能NETCON函数(要求使用api_lib.c)#define LWIP_SOCKET 1 //LWIP_SOCKET==1:使能Sicket API(要求使用sockets.c)#define LWIP_COMPAT_MUTEX 1#define LWIP_SO_RCVTIMEO 1 //通过定义LWIP_SO_RCVTIMEO使能netconn结构体中recv_timeout,使用recv_timeout可以避免阻塞线程//有关系统的选项#define TCPIP_THREAD_STACKSIZE 1000 //内核任务堆栈大小#define DEFAULT_UDP_RECVMBOX_SIZE 2000#define DEFAULT_THREAD_STACKSIZE 1500//LWIP调试选项#define LWIP_DEBUG 0 //关闭DEBUG选项#define ICMP_DEBUG LWIP_DBG_OFF //开启/关闭ICMPdebug#endif /* __LWIPOPTS_H__ */ |
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2553 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2340 浏览 5 评论
3171 浏览 3 评论
2813 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2770 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
626浏览 1评论
873浏览 0评论
987浏览 0评论
636浏览 0评论
465浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 04:12 , Processed in 1.495680 second(s), Total 114, Slave 98 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号