ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:20.60KB ,
资源ID:6618661      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6618661.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(uip学习记录.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

uip学习记录.docx

1、uip学习记录1. 要知道uip是TCP/IP协议族一种简化并实现的协议栈。实现TCP/IP协议有uip还有lwip,这两种是比较常用的协议栈,在嵌入式应用中发挥了作用。2. uip可以作为webclient向指定的网站提交数据,也可以作为一个webserver作为网页服务器,提供一个小型的动态页面访问功能。3. uip用到的rom有6kb,而ram只有几百字节,相对于lwip更适合于非操作系统的单片机。Uip的文件架构学习uip需要知道uip协议里到底都有那些东东?1 uip_app; uip_lib, uip本身核心代码,uip底层驱动与以太网控制器模块有关,Uip_app 是uip的一些

2、应用示例程序smtp,rsolve,dhcp,telnetd,以及webclient。Lib 里边是memb.c是分配内存的文件。Uip 里边有uip.c timer.c 因为要为TCP和ARP提供定时器服务,比如心跳包,刷新老化程序需要有定时器的配置。如果使用ENC28U60,还需要ENC28U60.H Uip的数据通过网卡Enc28j60从物理层剥离,所以需要先配置Uip和Enc28j60的数据交互。这个部分在tapdev.c文件中:tapdev_init():网卡初始化函数,初始化网卡的工作模式。tapdev_read(void):读包函数。将网卡收到的数据放入全局缓存区uip_buf

3、中,返回包的长度,赋给uip_len。void tapdev_send(void):发包函数。将全局缓存区uip_buf 里的数据(长度放在uip_len 中)发送出去。在uip1.0中,clock_archo。C是用来管理时钟的。apps apps目录 下为uip提供的一些应用示例 dhcpc hello-world resolv smtp telnetd webclient webserver | |_tcpclient | |_tcpcserver httpd-fsdoc doc下放置的为说明文档,程序中用不上 htmllib lib下为内存块管理函数源码uip uip下为uip和核心实

4、现源码 unix unix环境里的uip应用例子,可以参照这个例子实现应用234567891011#include clock-arch.h#include stm32f10x.h extern_IO int32_t g_RunTime;/*-*/clock_time_tclock_time(void) returng_RunTime;/*-*/使用stm32 滴答定时器中断代码: User/stm32f10x_it.c123456789101112131415_IO int32_t g_RunTime = 0;voidSysTick_Handler(void) staticuint8_t s

5、_count = 0; if(+s_count = 10) s_count = 0; g_RunTime+; /* 全局运行时间每10ms增1 */ if(g_RunTime = 0x80000000) g_RunTime = 0; 3.uipopt.h/uip-conf.h 是配置文件,用来设置本地的IP 地址、网关地址、MAC 地址、全局缓冲区的大小、支持的最大连接数、侦听数、ARP 表大小等。可以根据需要配置。#define UIP_FIXEDADDR 1决定uIP是否使用一个固定的IP地址。如果uIP使用一个固定的IP地址,应该置位(set)这些uipopt.h中的选项。如果不的话,则

6、应该使用宏uip_sethostaddr(),uip_setdraddr() 和 uip_setnetmask()。 #define UIP_PINGADDRCONF 0 Ping IP地址赋值。#define UIP_FIXEDETHADDR 0 指明uIP ARP模块是否在编译时使用一个固定的以太网MAC地址。#define UIP_TTL 255 uIP发送的IP packets的IP TTL (time to live)。#define UIP_REASSEMBLY 0 uIP支持IP packets的分片和重组。#define UIP_REASS_MAXAGE 40 一个IP fra

7、gment在被丢弃之前可以在重组缓冲区中存在的最大时间。#define UIP_UDP 0 是否编译UDP的开关。#define UIP_ACTIVE_OPEN 1 决定是否支持uIP打开一个连接。#define UIP_CONNS 10 同时可以打开的TCP连接的最大数目。由于TCP连接是静态分配的,减小这个数目将占用更少的RAM。每一个TCP连接需要大约30字节的内存。#define UIP_LISTENPORTS 10 同时监听的TCP端口的最大数目。每一个TCP监听端口需要2个字节的内存。#define UIP_RECEIVE_WINDOW 32768 建议的接收窗口的大小。如果应用程

8、序处理到来的数据比较慢,那么应该设置的小一点(即,相对与uip_buf缓冲区的大小来说),相反如果应用程序处理数据很快,可以设置的大一点(32768字节)。#define UIP_URGDATA 1 决定是否支持TCP urgent data notification。#define UIP_RTO 3 The initial retransmission timeout counted in timer pulses.不要改变#define UIP_MAXRTX 8 在中止连接之前,应该重发一个段的最大次数。不要改变#define UIP_TCP_MSS (UIP_BUFSIZE UIP_L

9、LH_LEN 40) TCP段的最大长度。它不能大于UIP_BUFSIZE UIP_LLH_LEN 40.#define UIP_TIME_WAIT_TIMEOUT 120 一个连接应该在TIME_WAIT状态等待多长。不要改变#define UIP_ARPTAB_SIZE 8 ARP表的大小。如果本地网络中有许多到这个uIP节点的连接,那么这个选项应该设置为一个比较大的值。#define UIP_BUFSIZE 1500 uIP packet缓冲区不能小于60字节,但也不必大于1500字节。#define UIP_STATISTICS 1 决定是否支持统计数字。统计数字对调试很有帮助,并展示

10、给用户。#define UIP_LOGGING 0 输出uIP登陆信息。#define UIP_LLH_LEN 14 链接层头部长度。对于SLIP,应该设置成0。 uip-conf.h 中增加几个主要结构体定义,不include任何应用 1234567891011121314#define UIP_CONF_LOGGING 0 /logging off typedefintuip_tcp_appstate_t; /出错可注释typedefintuip_udp_appstate_t; /出错可注释 /*#include smtp.h*/*#include hello-world.h*/*#inc

11、lude telnetd.h*/*#include webserver.h*/*#include dhcpc.h*/*#include resolv.h*/*#include webclient.h*/ #include app_call.h /加入一个Uip的数据接口文件uIP 在接受到底层传来的数据包后,调用UIP_APPCALL( ),将数据送到上层应用程序处理。User/app_call.c1234567891011121314151617181920212223#include stm32f10x.h #ifndef UIP_APPCALL #define UIP_APPCALL U

12、ip_Appcall#endif #ifndef UIP_UDP_APPCALL #define UIP_UDP_APPCALL Udp_Appcall#endif voidUip_Appcall(void);voidUdp_Appcall(void); voidUip_Appcall(void) voidUdp_Appcall(void) 4.加入uIP 的的主循环代码架构User/main.c1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545

13、556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171#include stm32f10x.h#include stdio.h#include string.h #include uip.h#include uip_arp.h#include tapdev.h#include timer.h#include ENC28J60.h#include SPI.h #de

14、fine PRINTF_ON 1 #define BUF (struct uip_eth_hdr *)&uip_buf0) #ifndef NULL#define NULL (void *)0#endif /* NULL */ staticunsignedcharmymac6 = 0x04,0x02,0x35,0x00,0x00,0x01; voidRCC_Configuration(void);voidGPIO_Configuration(void);voidUSART_Configuration(void); intmain(void) inti; uip_ipaddr_t ipaddr;

15、 structtimer periodic_timer, arp_timer; RCC_Configuration(); GPIO_Configuration(); USART_Configuration(); SPInet_Init(); timer_set(&periodic_timer, CLOCK_SECOND / 2); timer_set(&arp_timer, CLOCK_SECOND * 10); SysTick_Config(72000); /配置滴答计时器 /以太网控制器驱动初始化 tapdev_init(mymac); /Uip 协议栈初始化 uip_init(); ui

16、p_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_ETHT

17、YPE_IP) /如果收到的是IP数据,调用uip_input()处理 uip_arp_ipin(); uip_input(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value 0. */ if(uip_len 0) uip_arp_out(); tapdev_send(); elseif(BUF-type = htons(UIP_ETHTYPE_ARP) /如果收到

18、的是ARP数据,调用uip_arp_arpin处理 uip_arp_arpin(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value 0. */ if(uip_len 0) tapdev_send(); elseif(timer_expired(&periodic_timer) /查看0.5s是否到了,调用uip_periodic处理TCP超时程序 timer_res

19、et(&periodic_timer); for(i = 0; i 0. */ if(uip_len 0) uip_arp_out(); tapdev_send(); for(i = 0; i 0. */ if(uip_len 0) uip_arp_out(); tapdev_send(); /* Call the ARP timer function every 10 seconds. */ /10s到了就处理ARP if(timer_expired(&arp_timer) timer_reset(&arp_timer); uip_arp_timer(); /*Stm32 Set*/ voi

20、dGPIO_Configuration(void) GPIO_InitTypeDef GPIO_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_InitStruc

21、ture.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA , &GPIO_InitStructure); voidRCC_Configuration(void) /* 定义枚举类型变量 HSEStartUpStatus */ ErrorStatus HSEStartUpStatus; /* 复位系统时钟设置*/ RCC_DeInit(); /* 开启HSE*/ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE起振并稳定*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 判

22、断HSE起是否振成功,是则进入if()内部 */ if(HSEStartUpStatus = SUCCESS) /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */ 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

23、_2); /* 使能FLASH预取缓存 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为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); /* 选择SYSCL

24、K时钟源为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_InitTypeDef USART_InitStructure; USART_ClockInitT

25、ypeDef USART_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_C

26、lockInitStructure); 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); #if PRINTF_ON intfputc(intch,FILE*f) USART_SendData(USART1,(u8) ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) = RESET); returnc

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1