uip stm32移植问题总结changingsblogWord下载.docx
- 文档编号:20008263
- 上传时间:2023-01-15
- 格式:DOCX
- 页数:9
- 大小:18.74KB
uip stm32移植问题总结changingsblogWord下载.docx
《uip stm32移植问题总结changingsblogWord下载.docx》由会员分享,可在线阅读,更多相关《uip stm32移植问题总结changingsblogWord下载.docx(9页珍藏版)》请在冰豆网上搜索。
g_RunTime=0;
}
}
}3.uipopt.h/uip-conf.h是配置文件,用来设置本地的IP地址、网关地址、MAC地址、全局缓冲区的大小、支持的最大连接数、侦听数、ARP表大小等。
可以根据需要配置。
#defineUIP_FIXEDADDR1决定uIP是否使用一个固定的IP地址。
如果uIP使用一个固定的IP地址,应该置位(set)这些uipopt.h中的选项。
如果不的话,则应该使用宏uip_sethostaddr(),uip_setdraddr()和uip_setnetmask()。
#defineUIP_PINGADDRCONF0PingIP地址赋值。
#defineUIP_FIXEDETHADDR0指明uIPARP模块是否在编译时使用一个固定的以太网MAC地址。
#defineUIP_TTL255uIP发送的IPpackets的IPTTL(timetolive)。
#defineUIP_REASSEMBLY0uIP支持IPpackets的分片和重组。
#defineUIP_REASS_MAXAGE40一个IPfragment在被丢弃之前可以在重组缓冲区中存在的最大时间。
#defineUIP_UDP0是否编译UDP的开关。
#defineUIP_ACTIVE_OPEN1决定是否支持uIP打开一个连接。
#defineUIP_CONNS10同时可以打开的TCP连接的最大数目。
由于TCP连接是静态分配的,减小这个数目将占用更少的RAM。
每一个TCP连接需要大约30字节的内存。
#defineUIP_LISTENPORTS10同时监听的TCP端口的最大数目。
每一个TCP监听端口需要2个字节的内存。
#defineUIP_RECEIVE_WINDOW32768建议的接收窗口的大小。
如果应用程序处理到来的数据比较慢,那么应该设置的小一点(即,相对与uip_buf缓冲区的大小来说),相反如果应用程序处理数据很快,可以设置的大一点(32768字节)。
#defineUIP_URGDATA1决定是否支持TCPurgentdatanotification。
#defineUIP_RTO3Theinitialretransmissiontimeoutcountedintimerpulses.不要改变#defineUIP_MAXRTX8在中止连接之前,应该重发一个段的最大次数。
不要改变#defineUIP_TCP_MSS(UIP_BUFSIZE–UIP_LLH_LEN–40)TCP段的最大长度。
它不能大于UIP_BUFSIZE–UIP_LLH_LEN–40.#defineUIP_TIME_WAIT_TIMEOUT120一个连接应该在TIME_WAIT状态等待多长。
不要改变#defineUIP_ARPTAB_SIZE8ARP表的大小。
如果本地网络中有许多到这个uIP节点的连接,那么这个选项应该设置为一个比较大的值。
#defineUIP_BUFSIZE1500uIPpacket缓冲区不能小于60字节,但也不必大于1500字节。
#defineUIP_STATISTICS1决定是否支持统计数字。
统计数字对调试很有帮助,并展示给用户。
#defineUIP_LOGGING0输出uIP登陆信息。
#defineUIP_LLH_LEN14链接层头部长度。
对于SLIP,应该设置成0。
uip-conf.h中增加几个主要结构体定义,不include任何应用#defineUIP_CONF_LOGGING0//loggingoff
typedefintuip_tcp_appstate_t;
//出错可注释
typedefintuip_udp_appstate_t;
/*#include"
smtp.h"
*/
hello-world.h"
telnetd.h"
webserver.h"
dhcpc.h"
resolv.h"
webclient.h"
app_call.h"
//加入一个Uip的数据接口文件
uIP在接受到底层传来的数据包后,调用UIP_APPCALL(),将数据送到上层应用程序处理。
User/app_call.c#include"
#ifndefUIP_APPCALL
#defineUIP_APPCALLUip_Appcall
#endif
#ifndefUIP_UDP_APPCALL
#defineUIP_UDP_APPCALLUdp_Appcall
voidUip_Appcall(void);
voidUdp_Appcall(void);
voidUip_Appcall(void)
voidUdp_Appcall(void)
4.加入uIP的的主循环代码架构User/main.c#include"
stdio.h"
string.h"
uip.h"
uip_arp.h"
tapdev.h"
timer.h"
ENC28J60.h"
SPI.h"
#definePRINTF_ON1
#defineBUF((structuip_eth_hdr*)&
amp;
uip_buf[0])
#ifndefNULL
#defineNULL(void*)0
#endif/*NULL*/
staticunsignedcharmymac[6]={0x04,0x02,0x35,0x00,0x00,0x01};
voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidUSART_Configuration(void);
intmain(void)
inti;
uip_ipaddr_tipaddr;
structtimerperiodic_timer,arp_timer;
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
SPInet_Init();
timer_set(&
periodic_timer,CLOCK_SECOND/2);
arp_timer,CLOCK_SECOND*10);
SysTick_Config(72000);
//配置滴答计时器
//以太网控制器驱动初始化
tapdev_init(mymac);
//Uip协议栈初始化
uip_init();
uip_ipaddr(ipaddr,192,168,1,15);
//配置Ip
uip_sethostaddr(ipaddr);
uip_ipaddr(ipaddr,192,168,1,1);
//配置网关
uip_setdraddr(ipaddr);
uip_ipaddr(ipaddr,255,255,255,0);
//配置子网掩码
uip_setnetmask(ipaddr);
while
(1){
uip_len=tapdev_read();
//从网卡读取数据
if(uip_len&
0)
{//如果数据存在则按协议处理
if(BUF-&
type==htons(UIP_ETHTYPE_IP)){//如果收到的是IP数据,调用uip_input()处理
uip_arp_ipin();
uip_input();
/*Iftheabovefunctioninvocationresultedindatathat
shouldbesentoutonthenetwork,theglobalvariableuip_lenissettoavalue&
0.*/
if(uip_len&
{
uip_arp_out();
tapdev_send();
}
}elseif(BUF-&
type==htons(UIP_ETHTYPE_ARP)){//如果收到的是ARP数据,调用uip_arp_arpin处理
uip_arp_arpin();
}
}elseif(timer_expired(&
periodic_timer)){//查看0.5s是否到了,调用uip_periodic处理TCP超时程序
timer_reset(&
periodic_timer);
for(i=0;
i&
lt;
UIP_CONNS;
i++){
uip_periodic(i);
/*Iftheabovefunctioninvocationresultedindatathat
shouldbesentoutonthenetwork,theglobalvariableuip_lenissettoavalue&
if(uip_len&
{
uip_arp_out();
tapdev_send();
}
for(i=0;
UIP_UDP_CONNS;
i++)
{
uip_udp_periodic(i);
//处理udp超时程序
/*CalltheARPtimerfunctionevery10seconds.*///10s到了就处理ARP
if(timer_expired(&
arp_timer))
timer_reset(&
arp_timer);
uip_arp_timer();
/*******************************Stm32Set***************************************/
voidGPIO_Configuration(void)
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&
GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
voidRCC_Configuration(void)
/*定义枚举类型变量HSEStartUpStatus*/
ErrorStatusHSEStartUpStatus;
/*复位系统时钟设置*/
RCC_DeInit();
/*开启HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/*等待HSE起振并稳定*/
HSEStartUpStatus=RCC_WaitForHSEStartUp();
/*判断HSE起是否振成功,是则进入if()内部*/
if(HSEStartUpStatus==SUCCESS)
/*选择HCLK(AHB)时钟源为SYSCLK1分频*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/*选择PCLK2时钟源为HCLK(AHB)1分频*/
RCC_PCLK2Config(RCC_HCLK_Div1);
/*选择PCLK1时钟源为HCLK(AHB)2分频*/
RCC_PCLK1Config(RCC_HCLK_Div2);
/*设置FLASH延时周期数为2*/
FLASH_SetLatency(FLASH_Latency_2);
/*使能FLASH预取缓存*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*选择锁相环(PLL)时钟源为HSE1分频,倍频数为9,则PLL输出频率为8MHz*9=72MHz*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
/*使能PLL*/
RCC_PLLCmd(ENABLE);
/*等待PLL输出稳定*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
/*选择SYSCLK时钟源为PLL*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/*等待PLL成为SYSCLK时钟源*/
while(RCC_GetSYSCLKSource()!
=0x08);
}
/*打开APB2总线上的GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
voidUSART_Configuration(void)
USART_InitTypeDefUSART_InitStructure;
USART_ClockInitTypeDefUSART_ClockInitStructure;
USART_ClockInitStructure.USART_Clock=USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL=USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable;
USART_ClockInit(USART1,&
USART_ClockInitStructure);
USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&
USART_InitStructure);
USART_Cmd(USART1,ENABLE);
#ifPRINTF_ON
intfputc(intch,FILE*f)
USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
returnch;
#endif5.解决编译过程中的错误。
归总如下:
Uip/uip-split.c注释所有的tcpip_output()函数消除uip_fw_output()函数的注释Uip/memb.c中memb_free()函数返回值return-1改为return1Apps/resolv.c中resolv_conf()中//resolv_conn=uip_udp_new(dnsserver,HTONS(53));
resolv_conn=uip_udp_new((uip_ipaddr_t*)dnsserver,HTONS(53));
解决完所有问题后,编译成功后下载到stm32,ping测试。
。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uip stm32移植问题总结changingsblog stm32 移植 问题 总结 changingsblog