1、什么是UIP协议栈:
UIP是一种适用于小型嵌入式通信的TCP/IP协议栈,由瑞典计算机科学院的人开发编写的,它去掉了完整的TCP/IP中不常用的功能,简化了通讯过程,但其保留了网络通信中必须使用的协议,把设计重点放在IP、TCP和ARP协议的实现上。简单易用、占用资源少是它的设计特点。
2、协议栈接口
UIP协议栈通过一系列接口函数与底层函数和上层应用程序通信,在两者之中,UIP接口函数处于中间。 其中UIP提供两个个接口函数给底层系统。分别是
(1)uip_input()
当网卡驱动收到一个输入包时,将放入全局缓冲区uip_buf中,包的大小由全局变量uip_len约束。同时将调用 uip_input() 函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序。当 uip_input() 返回时,一个输出包同样放在全局缓冲区uip_buf里,大小赋给uip_len。如果uip_len 是0,则说明没有包要发送。否则调用底层系统的发包函数将包发送到网络上。
(2)uip_periodic()
uIP 周期计时是用于驱动所有的uIP 内部时钟事件。当周期计时激发,每一个TCP 连接都会调用uIP 函数uip_periodic() 。类似于 uip_input() 函数。uip_periodic()函数返回时,输出的IP 包要放到uip_buf中,供底层系统查询uip_len的大小发送。
UIP提供一个调用函数uip——appcall() 与 上位机应用程序通信。当uip在接收到底层传来的数据包后,直接调用uip_appcall()就可以把数据传送到上层应用程序进行处理。
系统底层其实在一开始时还需要调用初始化UIP的函数——uip_init(),主要是初始化协议栈的侦听端口和默认所有连接都是关闭的。
3、UIP协议栈在STM32上的移植
(1)DM9000A 初始化和UIP初始化;
tapdev_init(); uip_init();
(2)设置IP地址
uip_ipaddr(ipaddr, 192,168,1,10);
(3)设置默认的路由器地址
uip_ipaddr(ipaddr, 192,168,1,1);
(4)设置网络掩码
uip_setnetmask(ipaddr);
(5)当DM9000A接收到数据后会产生中断,这时候从DM9000A读取一个IP包,返回数据长度;
uip_len = tapdev_read();
(6)校验处理数据包
BUF->type == htons(UIP_ETHTYPE_IP
(7)去除以太网帧头结构,更新ARP表
uip_arp_ipin();
(8)IP包处理
uip_input();
关键字:网络通信 UIP STM32 移植
引用地址:
网络通信之UIP在STM32上的移植
推荐阅读最新更新时间:2024-03-16 15:37
STM32使用freertos时在中断中调用系统函数的注意点
CORTEX内核的优先级是数值越小优先级越高,即0是最高优先级。FreeRTOS正好相反,为了满足某些应用对中断实时性要求高的需求,使得中断优先级高于某个值之后,就不能调用操作系统的内核函数来提高实时性。而我们经常所犯的错误就是将中断的优先级设置的高于这个值,却还在中断中调用操作系统提供的API引起的。当把优先级改小也就是数值改大之后,程序能够正常运行。 注意点: 1:首先要将中断的嵌套设置为抢占优先级。 2:将freertos系统内核中断(configKERNEL_INTERRUPT_PRIORITY)的优先级设置成最低。 3:将freertos的最大系统调用中断优先级(configMAX_SYSCALL_IN
[单片机]
浅析STM32的hex文件
前段时间需要用到BIN文件 随便把HEX文件也了解了一下 参考查阅了一些网上资料,如有雷同除了巧合还有借鉴参考。。。 正题:HEX文件格式如下 0x3a 0x0d 0x0a 分析下面具体例子 :020000040800F2 : 这个就是 0x3a ,也就是冒号 02 这个就是说明这行数据区的数据内容长度,也就是数据内容为两个字节在后面的 0800 那里 0000 这个是数据要送往的地址 要看具体数据类型 04 解释整行数据的数据类型,主要有这几种 '00' Data Record 数据 '01' End of File Record 文件结束标志 '02' Extended
[单片机]
STM32:DMA实例之串口(USART)通信
硬件平台:stm32f10xZET6 开发环境:keil MDK uVision v4.10 开发语言:C、ST_lib_3.5固件库 /* 代码演示 main.c */ #include stm32f10x.h #include bsp_usart1.h #include bsp_led.h extern uint8_t SendBuff ; static void Delay(__IO u32 nCount); /** * @brief 主函数 */ int main(void) { /* USART1 config 115200 8-N-1 */
[单片机]
STM32基于固件库学习笔记(3)串口的收发功能+WiFi基础配置
串口设置的一般步骤 1) 串口时钟使能,GPIO 时钟使能 注:串口是挂载在 APB2 下面的外设还需要需要挂载复用时钟使能 //挂载时钟(复用PA) 串口时钟使能,GPIO 时钟使能,复用时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); 2) 串口复位 //系统刚开始配置外设的时候,都会先执行复位该外设的操作。 void USART_DeInit(USART_TypeDef* USARTx);//串口复位 3) GPIO 端口模式设置 注意:RXT、TXT输
[单片机]
STM32控制16路舵机控制板PCA9685
介绍 PCA9685 是最新的快速模式 Plus(Fm+)系列中的一员。 Fm+器件可以提供更高的频率 (高达 1MHz)和更频繁(densely populated) 的总线操作(高达 4000pF)。 OE引脚一定要至低使能,或者直接接地 网上Arduino的教程很多,商家给的也是Arduino的驱动文件,那怎么在STM32上用呢? STM32与驱动板的连接 驱动板 STM32 VCC 3.3V GND GND SCL I2C_SCL SDA I2C_SDA OE GND(低电平) V+ 不接 V+可以不接而采用电源接线柱使用外部供电,用5V的充电宝即可 由于PCA9685是使用IIC的,那么如何使用I
[单片机]
stm32 数据类型的定义
在Keil MDK 开发环境里,比如一个 无符号32位整形数据会有很多种表示方法:1,unsigned int 32 (C语言标准表达方法) 2,uint32_t ; 3 ,u32; 这三种方式都是在表达同一个意思,可为什么ST的开发人员要搞的这么乱呢? 还有其他好多你可能看起来很陌生 ,很不好理解的表达方式,如:_IO int32_t 他等同于vs32(这个你同样很陌生),不过他还等同于 volatile int32_t, 还等同于 volatile signed int 32;最后这种表达方式才是C语言的标准表达方式,够乱吧,能把初学者弄的晕头转向。 其实ST 搞这么多花样,无非是想开发人员在写代码时定义数据类型能少写几个符
[单片机]
可移植的嵌入式WEB服务器软件设计
引言
随着互联网技术的飞速发展,嵌入式WEB服务器技术在工业生产的过程控制、环境监测以及远程数据采集等方面得到了广泛的应用,通过嵌入在目标设备中的WEB服务器,可以非常方便地获取远程数据,并实现对远程设备的干预,达到对远程现场进行监视和控制的目的。在实际系统中,远程设备往往千差万别,为了在这些目标设备中构建WEB服务器,必须针对不同的系统编写相应的WEB服务器代码,通过采用基于操作系统适配层的中间件技术,可以很好的解决WEB服务器软件在不同系统之间的移植问题,同时改善软件的可维护性。
1、嵌入式软件的可移植问题
可移植性主要指把同一软件放置到不同系统平台(如不同的硬件平台或操作系统)并使之正常运行的难易程度,可移植性有
[嵌入式]
STM32中GPIO工作模式
在Cortex-M3里,对于GPIO的配置种类有8种: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 I/O端口位的基本结构 1、推挽输出 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有
[单片机]