STM32以太网程序解析一

发布者:MysticSerenade最新更新时间:2022-02-14 来源: eefocus关键字:STM32  以太网程序  数据包 手机看文章 扫描二维码
随时随地手机看文章

本篇博文以上一篇文章TCP/IP/ARP/ICMP首部分析为基础,根据STM32中以太网程序来着重看一下,以太网数据包的解析过程。


我们以一个简单的服务器应用为主线,进行以太网数据包的解析。在贴程序之前我们先看一下对于以太网数据包各部分的宏定义。


1. //******************* ETH ********************  


2.   


3. // 目标地址(6),源地址(6),类型/长度(2)  


4. #define ETH_HEADER_LEN  14      


5.   


6. // 类型/长度的定义   


7. #define ETHTYPE_ARP_H_V 0x08  // ETH包类型/长度ARP包标识符高位   


8. #define ETHTYPE_ARP_L_V 0x06  // ETH包类型/长度ARP包标识符低位   


9. #define ETHTYPE_IP_H_V  0x08  // ETH包类型/长度IP包标识符高位   


10. #define ETHTYPE_IP_L_V  0x00  // ETH包类型/长度IP包标识符低位   


11.   


12. // Ethernet type field (2bytes)   


13. #define ETH_TYPE_H_P 12       // ETH包类型/长度偏移地址   


14. #define ETH_TYPE_L_P 13       // ETH包类型/长度偏移地址   


15.   


16. // 目的地址与源地址的位置   


17. #define ETH_DST_MAC 0         // ETH包目的MAC偏移地址   


18. #define ETH_SRC_MAC 6         // ETH包源始MAC偏移地址   


19.   


20. //******************* ARP ********************  


21. #define ETH_ARP_OPCODE_REPLY_H_V 0x0   // ARP包操作类型字节:ARP响应高位   


22. #define ETH_ARP_OPCODE_REPLY_L_V 0x02  // ARP包操作类型字节:ARP响应低位   


23.   


24. #define ETHTYPE_ARP_L_V 0x06  


25.   


26. //#define ETH_ARP_DST_IP_P 0x26     // arp.dst.ip   


27.   


28. #define ETH_ARP_OPCODE_H_P 0x14   // ETH包中ARP包类型,ARP头中存储操作类型高位的地址   


29. #define ETH_ARP_OPCODE_L_P 0x15   // ETH包中ARP包类型,ARP头中存储操作类型低位的地址   


30.   


31. // arp.src.mac    


32. #define ETH_ARP_SRC_MAC_P 0x16    // ETH包中ARP包类型,ARP头中存储源始MAC的首地址   


33. #define ETH_ARP_SRC_IP_P 0x1c     // ETH包中ARP包类型,ARP头中存储源始IP的首地址   


34. #define ETH_ARP_DST_MAC_P 0x20    // ETH包中ARP包类型,ARP头中存储目的MAC的首地址   


35. #define ETH_ARP_DST_IP_P 0x26     // ETH包中ARP包类型,ARP头中存储目的IP的首地址   


36.   


37. //******************* IP ********************  


38. #define IP_HEADER_LEN   20        // IP包头文件长度   


39.   


40. #define IP_SRC_P 0x1a             // ETH包中IP包类型,IP头中存储源始IP地址的首地址   


41. #define IP_DST_P 0x1e             // ETH包中IP包类型,IP头中存储目的IP地址的首地址   


42. #define IP_HEADER_LEN_VER_P 0xe   // ETH包中IP包类型,IP头中存储版本的首地址   


43. #define IP_CHECKSUM_P 0x18        // ETH包中IP包类型,IP头中存储校验和的首地址   


44. #define IP_TTL_P 0x16             // ETH包中IP包类型,IP头中存储生存时间的首地址   


45. #define IP_FLAGS_P 0x14           // ETH包中IP包类型,IP头中存储标志的首地址   


46. #define IP_P 0xe                  // ETH包中IP包类型,IP头的首地址   


47. #define IP_TOTLEN_H_P 0x10        // ETH包中IP包类型,IP头中存储包裹总长高位的地址   


48. #define IP_TOTLEN_L_P 0x11        // ETH包中IP包类型,IP头中存储包裹总长低位的地址   


49.   


50. #define IP_PROTO_P 0x17    


51.   


52. #define IP_PROTO_ICMP_V 1         // ETH包中IP包类型,IP头中协议代码1表示ICMP   


53. #define IP_PROTO_TCP_V 6          // ETH包中IP包类型,IP头中协议代码6表示TCP   


54. #define IP_PROTO_UDP_V 17         // ETH包中IP包类型,IP头中协议代码17表示UDP   


55.   


56. //******************* ICMP ********************  


57. #define ICMP_TYPE_ECHOREPLY_V 0   // ETH包中IP包类型ICMP包,ICMP头类型代码回射应答   


58. #define ICMP_TYPE_ECHOREQUEST_V 8 // ETH包中IP包类型ICMP包,ICMP头类型代码回射请求   


59. //  


60. #define ICMP_TYPE_P 0x22          // ETH包中IP包类型ICMP包,ICMP头类型代码的首地址   


61. #define ICMP_CHECKSUM_P 0x24      // ETH包中IP包类型ICMP包,ICMP头校验和的首地址   


62.   


63. //******************* UDP ********************  


64. #define UDP_HEADER_LEN  8         // ETH包中IP包类型UDP包,UDP头长度   


65. //  


66. #define UDP_SRC_PORT_H_P 0x22     // ETH包中IP包类型UDP包,UDP头源始端口号高位地址   


67. #define UDP_SRC_PORT_L_P 0x23     // ETH包中IP包类型UDP包,UDP头源始端口号低位地址   


68. #define UDP_DST_PORT_H_P 0x24     // ETH包中IP包类型UDP包,UDP头目的端口号高位地址   


69. #define UDP_DST_PORT_L_P 0x25     // ETH包中IP包类型UDP包,UDP头目的端口号低位地址   


70. //  


71. #define UDP_LEN_H_P 0x26          // ETH包中IP包类型UDP包,UDP头UDP长度高位地址   


72. #define UDP_LEN_L_P 0x27          // ETH包中IP包类型UDP包,UDP头UDP长度低位地址   


73. #define UDP_CHECKSUM_H_P 0x28     // ETH包中IP包类型UDP包,UDP头UDP校验和高位地址   


74. #define UDP_CHECKSUM_L_P 0x29     // ETH包中IP包类型UDP包,UDP头UDP校验和低位地址   


75. #define UDP_DATA_P 0x2a           // ETH包中IP包类型UDP包,UDP包数据区首地址   


76.   


77. //******************* TCP ********************  


78. #define TCP_SRC_PORT_H_P 0x22     // ETH包中IP包类型TCP包,TCP头中存储源始端口高位的地址   


79. #define TCP_SRC_PORT_L_P 0x23     // ETH包中IP包类型TCP包,TCP头中存储源始端口低位的地址   


80. #define TCP_DST_PORT_H_P 0x24     // ETH包中IP包类型TCP包,TCP头中存储目的端口高位的地址   


81. #define TCP_DST_PORT_L_P 0x25     // ETH包中IP包类型TCP包,TCP头中存储目的端口低位的地址   


82.   


83. // the tcp seq number is 4 bytes 0x26-0x29   


84. #define TCP_SEQ_H_P 0x26          // ETH包中IP包类型TCP包,TCP头中存储数据序号的首地址   


85. #define TCP_SEQACK_H_P 0x2a       // ETH包中IP包类型TCP包,TCP头中存储确认序号的首地址   


86.   


87. #define TCP_FLAGS_P 0x2f          // ETH包中IP包类型TCP包,TCP头中存储标志字节的地址   


88. #define TCP_FLAGS_SYN_V 2                                                                      


89. #define TCP_FLAGS_FIN_V 1  


90. #define TCP_FLAGS_PUSH_V 8  


91. #define TCP_FLAGS_SYNACK_V 0x12   // ETH包中IP包类型TCP包,TCP头中同步比特确认值   


92. #define TCP_FLAGS_ACK_V 0x10      // ETH包中IP包类型TCP包,TCP头中确认比特值   


93. #define TCP_FLAGS_PSHACK_V 0x18   // ETH包中IP包类型TCP包,TCP头中PSH比特确认值   


94.   


95. // TCP数据头中没有可选选项字节   


96. #define TCP_HEADER_LEN_PLAIN 20   // ETH包中IP包类型TCP包,TCP头长度(如果不包含可选选项)   


97. #define TCP_HEADER_LEN_P 0x2e     // ETH包中IP包类型TCP包,TCP头中存储偏移的首地址   


98. #define TCP_CHECKSUM_H_P 0x32     // ETH包中IP包类型TCP包,TCP头中存储包校验和地址   


99. #define TCP_CHECKSUM_L_P 0x33     // ETH包中IP包类型TCP包,TCP头中存储包校验和地址   


100. #define TCP_OPTIONS_P 0x36        // ETH包中IP包类型TCP包,TCP头中存储可选选项的首地址  


上面的宏定义中记录了在各个协议首部一些关键数据的位置及关键代码的参数。对于占用多个字节的参数高位在前


在以太网中数据包的解析主要有4条线路,分别是


ETH  ---> ARP


ETH  ---> IP  ---> TCP  ---> 应用程序


ETH  ---> IP  ---> UDP  ---> 应用程序


ETH  ---> IP  ---> ICMP

关键字:STM32  以太网程序  数据包 引用地址:STM32以太网程序解析一

上一篇:STM32以太网程序解析三
下一篇:STM32关于printf重定向到串口

推荐阅读最新更新时间:2024-11-10 10:28

stm32的堆与栈
首先我们来认识一下堆与栈的含义(): ​(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。 (2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。 (3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。 (4)文字常量区:常量字符串就是存放在这里的。 (5)程序代码区:存放函数体的二进制代码。 解释的名词有点多了,但这不是重点,重点是看例子!
[单片机]
STM32学习笔记(2)外部中断
一、中断 1.什么是中断 操作系统需要管理外设,但是外设的速度远远低于CPU的速度,所以我们需要一种机制来弥补这种速度鸿沟,提高CPU的效率。 为此我们引入了中断机制,让外设在需要操作系统处理外设相关事件的时候,能够主动通知操作系统,即当CPU收到中断或者异常的事件时,打断操作系统和应用的正常执行,暂停执行当前的程序或任务,让操作系统完成外设的相关处理,在完成对这个事件的处理后,再恢复操作系统和应用的正常执行。 举个栗子,当你在读文章时忽然来了一个电话,你会先去接电话,等电话挂断后你又接着回来读文章,接电话这一过程就是执行中断。 正是由于中断机制,计算机系统才能有条不紊地“同时”完成多个任务,中断机制实质上帮助提高了并
[单片机]
<font color='red'>STM32</font>学习笔记(2)外部中断
结合STM32单片来讲讲结构体的运用
摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一些低级的项目。看得懂结构体并且能够灵活运用结构体才能说你入门了单片机。本篇将以最通俗的方式结合STM32单片来讲讲结构体的运用。解决你学完C语言、考过了计算机二级还是看不懂单片机结构体的苦恼。宝藏文章,记得点赞转发收藏。 大家知道指针和结构体是单片机的难点,所以就去学习C语言,找视频看书。 这里面每一个视频的播放量都非常高。对于单纯的学习C语言,这里讲的很清楚。看完你不禁在下面评论一句:哇!讲的真的太清楚了吧!但是等你真正的学单片机的时候,你会发现我不是学过C语言吗?计算机二级我也过了
[单片机]
STM32 外部看门狗 的使用
之前项目在设计之初,在STM32F4复位电路增加了MAX809低电平复位芯片(图1)。在样板焊接成功,调试时发现单片机复位引脚一直为低电平,移除MAX809后正常。具体原因,当时没有分析。今天偶然看看到如图2。 网上看到一个说法是:在NRST与复位芯片的引脚之间串入一个电阻 图1 图2
[单片机]
<font color='red'>STM32</font> 外部看门狗 的使用
stm32通用定时器中断问题
在使用stm32的通用定时器定时中断的时候,发现定时器在完成初始化配置后,定时器UIF位会立刻置位,导致在使能中断后,程序会立刻进入定时器中断。 如果设计代码时不希望定时器配置完成后,立刻进入中断,可以在定时器配置完成后,立刻清除UIF标志位(TIMx- SR &= 0xFFFE) ,再使能定时器更新中断。比如用库函数这么写: TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能TIM4的更新中断 TIM_Cmd(TIM4, ENABLE); 但又发现个特别奇怪的问题,TIM_ClearITPen
[单片机]
一种无OS的STM32实用软件框架
介绍 一种无OS的STM32实用软件框架,包括任务轮询管理,命令管理器、低功耗管理、环形缓冲区等实用模块。系统中广泛利用自定义段技术减少各个模块间的耦合关系,大大提供程序的可维护性。 主要功能 支持模块自动化管理,并提供不同优先等级初始化声明接口。 支持任务轮询管理,通过简单的宏声明即可实现,不需要复杂的声明调用。 支持低功耗管理,休眠与唤醒通知。 支持命令行解析,命令注册与执行。 blink设备支持,统一管理LED、震动马达、蜂鸣器 使用说明 点击STM32嵌入式开发公众号文末的“阅读原文”,可以完整的工程代码,系统开发平台如下: MCU:STM32F401RET6 IDE:IAR 7.4或者K
[单片机]
16. 定时器中断实验
STM32的定时器的分类: 1. 高级定时器 TIME1,TIME8 2. 通用定时器 TIME2~TIME5 3. 基本定时器 TIME6,TIME7 本章讲解通用定时器,参考《开发指南》第13,14,15章以及《中文参考手册》第14章。 一。 计数器的计数模式 1. 向上计数模式 2. 向下计数模式 在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。 3. 中央对齐模式(向上/向下) 本实验中使用向下计数模式 二。 STM32通用定时器 STM32 的通用 TIMx (TIM2、TIM3、TIM4
[单片机]
16. 定时器中断实验
STM32学习1:GPIO输出实验——点亮三色LED
一、概述: 1、发光二极管简介 发光二极管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约为5V。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算: R = (E - UF)/IF 式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。LED广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。 2、STM32 GPIO简介 STM32F4每组通用I/O 端口包括4 个32 位配置寄存器(MODER、OTYPER、OSPEEDR 和PUPDR)、2 个32 位数据寄存
[单片机]
<font color='red'>STM32</font>学习1:GPIO输出实验——点亮三色LED

推荐帖子

AD14.3 :PCB中制作任意LOGO
哪位大神会AD14.3:PCB中制作任意LOGO,求制作方法,谢谢!file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\272085450\QQ\WinTemp\RichOle\HZ7X$~U3WSB.pngfile:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\272085450\QQ\WinTemp\RichOle\3HO`@HVY$SOAD)
zttian PCB设计
LPC1788运行在SDRAM中,不知道为什么运行速度比在FLASH中运行变慢了。
使用LPC1788,APP运行在SDRAM地址0XA0000000处,感觉程序执行速度明显变慢了。APP应用程序原本在FLASH地址为0X2000处执行没有问题的。(1)、BootLoader基本情况,使用CPUCLK=120MHZ,EMCCLK=60MHZ,PCLK=60MHZ,跳转到SDRAM中执行APP,中断向量表存放在SRAM。(2)、APP基本情况,使用CPUCLK=120MHZ,EMCCLK=60MHZ,PCLK=60MHZ,TFT显示,NAND使用Yaffs2文件系统,SD卡使
cybinlyc NXP MCU
这个创意你想到了吗?妮维雅RFID儿童手环
这是段妮维雅的广告,主要介绍基于RFID技术的儿童手环应用;把RFID芯片整合到宣传单上,妈妈们可以从杂志上直接摘下来,戴在孩子手腕上,接着在手机上配对手环信息,再设定孩子可跑远的范围;当孩子远离妈妈设定的范围时,应用就会提醒父母,从而让父母可以愉快的享受阳光,而不用处处担心孩子的安全。不知道RFID技术的有效范围是多少?看起来成本应该不高。这个创意你想到了吗?妮维雅RFID儿童手环这个RFID可以做得到?wg
eric_wang 移动便携
LM3s8962体验之八……异常与中断
一、简介异常:也就是意外突发事件,该请求来自外面,来自片上外设秒外扩的外设。可是说是异步的。中断:是因内核活动产生的,如在执行命令和访问存储器时产生。应是同步。Corter-M3的异常响应系统,支持众多的系统异常和外部中断。编号1-15的对应异常,》15的是外部中断。如下所示:异常:通过上表可以看出,编号4-6,11-12,14-15共
sdjntl 微控制器 MCU
小试microbit
开机动画播放音乐如果您对microbit非常感兴趣,欢迎加入我们的众筹,一起制作中国版的microbit小试microbit牛,很炫酷啊{:1_103:}看起来很炫酷啊,是不是还支持mbed?shihuntaotie发表于2016-12-718:26看起来很炫酷啊,是不是还支持mbed? 是,可以用mbed开发,板载了DAPLink仿真器,和CMSIS-DAP差不多https://developer.mbed.org/
dcexpert MicroPython开源版块
【2024 DigiKey创意大赛】环境智眼-可视化智能环境观测器
环境智眼-可视化智能环境观测器作者:小神123一、作品简介环境智眼是一款革命性的智能环境观测器,它能够实时监测和分析各种环境参数,如温度、湿度、空气质量等。通过集成的高精度传感器阵列和强大的数据处理能
小神123 DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved