这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
icore3_arm_hal_25 [2020/09/16 17:50] fmj 创建 |
icore3_arm_hal_25 [2022/03/18 15:12] (当前版本) sean |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801** ||| | |技术支持电话|**0379-69926675-801** ||| | ||
|技术支持邮件|Gingko@vip.163.com ||| | |技术支持邮件|Gingko@vip.163.com ||| | ||
- | |技术论坛|http://www.eeschool.org ||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
- | | V1.0 | 2020-08-01 | gingko | 初次建立 | | + | | V1.0 | 2020-09-16 | gingko | 初次建立 | |
\\ | \\ | ||
\\ | \\ | ||
行 11: | 行 10: | ||
\\ | \\ | ||
- | ===== STM32CubeMX教程二十四——LAN_TCPS实验 ===== | + | |
+ | ===== STM32CubeMX教程二十五——LAN_UDP实验 ===== | ||
1. 新建工程:在主界面选择File-->New Project 或者直接点击ACCEE TO MCU SELECTOR | 1. 新建工程:在主界面选择File-->New Project 或者直接点击ACCEE TO MCU SELECTOR | ||
- | {{ :icore3:icore3_cube_24_1.png?direct | }} | + | {{ :icore3:icore3_cube_25_1.png?direct | }} |
2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 | 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 | ||
在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。 | 在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。 | ||
- | {{ :icore3:icore3_cube_24_2.png?direct | }} | + | {{ :icore3:icore3_cube_25_2.png?direct | }} |
3. 配置RCC,使用外部时钟源 | 3. 配置RCC,使用外部时钟源 | ||
- | {{ :icore3:icore3_cube_24_3.png?direct | }} | + | {{ :icore3:icore3_cube_25_3.png?direct | }} |
4. 配置调试引脚 | 4. 配置调试引脚 | ||
- | {{ :icore3:icore3_cube_24_4.png?direct | }} | + | {{ :icore3:icore3_cube_25_4.png?direct | }} |
5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output | 5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output | ||
- | {{ :icore3:icore3_cube_24_5.png?direct | }} | + | {{ :icore3:icore3_cube_25_5.png?direct | }} |
6. 引脚模式配置 | 6. 引脚模式配置 | ||
- | {{ :icore3:icore3_cube_24_6.png?direct | }} | + | {{ :icore3:icore3_cube_25_6.png?direct | }} |
7. 选中SPI1,Mode选择Full_Duplex Master,配置PB3(SPI1_SCK)、PB4(SPI1_MISO)、PA7(SPI1_MOSI)和PA15(CS)为SPI引脚。 | 7. 选中SPI1,Mode选择Full_Duplex Master,配置PB3(SPI1_SCK)、PB4(SPI1_MISO)、PA7(SPI1_MOSI)和PA15(CS)为SPI引脚。 | ||
- | {{ :icore3:icore3_cube_24_7.png?direct | }} | + | {{ :icore3:icore3_cube_25_7.png?direct | }} |
配置PA15(CS)的GPIO输出模式 | 配置PA15(CS)的GPIO输出模式 | ||
- | {{ :icore3:icore3_cube_24_8.png?direct | }} | + | {{ :icore3:icore3_cube_25_8.png?direct | }} |
8. 时钟源设置,选择外部高速时钟源,配置为最大主频 | 8. 时钟源设置,选择外部高速时钟源,配置为最大主频 | ||
- | {{ :icore3:icore3_cube_24_9.png?direct | }} | + | {{ :icore3:icore3_cube_25_9.png?direct | }} |
9. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK5 | 9. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK5 | ||
- | {{ :icore3:icore3_cube_24_10.png?direct | }} | + | {{ :icore3:icore3_cube_25_10.png?direct | }} |
10. 点击Code Generator,进行进一步配置 | 10. 点击Code Generator,进行进一步配置 | ||
- | {{ :icore3:icore3_cube_24_11.png?direct | }} | + | {{ :icore3:icore3_cube_25_11.png?direct | }} |
* **Copy all used libraries into the project folder** | * **Copy all used libraries into the project folder** | ||
* 将HAL库的所有.C和.H都复制到所建工程中 | * 将HAL库的所有.C和.H都复制到所建工程中 | ||
行 52: | 行 52: | ||
11. 然后点击GENERATE CODE 创建工程 | 11. 然后点击GENERATE CODE 创建工程 | ||
- | {{ :icore3:icore3_cube_24_12.png?direct | }} | + | {{ :icore3:icore3_cube_25_12.png?direct | }} |
创建成功,打开工程。 | 创建成功,打开工程。 | ||
行 60: | 行 60: | ||
\\ | \\ | ||
- | ===== 实验二十四:LAN_TCPS实验——以太网数据传输 ===== | + | ===== 实验二十五:LAN_UDP实验——以太网数据传输 ===== |
==== 一、 实验目的与意义 ==== | ==== 一、 实验目的与意义 ==== | ||
- | - 了解STM32的SPI和W5500的TCPS结构 | + | - 了解STM32 的SPI和W5500的UDP结构 |
- | - 了解STM32的SPI和W5500的TCPS特征 | + | - 了解STM32 的SPI和W5500的UDP特征 |
- | - 掌握STM32 HAL库中SPI和TCPS的配置方法 | + | - 掌握STM32 HAL库中SPI和UDP的配置方法 |
- 掌握STM32CubeMX的使用方法 | - 掌握STM32CubeMX的使用方法 | ||
- | - 掌握KEIL MDK集成开发环境使用方法 | + | - 掌握KEIL MDK 集成开发环境使用方法 |
==== 二、 实验设备及平台 ==== | ==== 二、 实验设备及平台 ==== | ||
行 93: | 行 94: | ||
- SCLK时钟信号,由主设备产生。 | - SCLK时钟信号,由主设备产生。 | ||
- CS从设备片选信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。 | - CS从设备片选信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。 | ||
- | {{ :icore3:icore3_arm_hal_24_1.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_1.png?direct |}} |
* 在一个SPI时钟周期内,会完成如下操作: | * 在一个SPI时钟周期内,会完成如下操作: | ||
- 主设备通过MOSI线发送1位数据,从设备通过该线读取这1位数据; | - 主设备通过MOSI线发送1位数据,从设备通过该线读取这1位数据; | ||
行 99: | 行 100: | ||
* 这是通过移位寄存器来实现的。主机和从机都有一个串行移位寄存器,随着时钟脉冲,数据按照从高位到低位的方式依次移出主设备寄存器和从机寄存器,并且依次移入从设备寄存器和主设备寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。 | * 这是通过移位寄存器来实现的。主机和从机都有一个串行移位寄存器,随着时钟脉冲,数据按照从高位到低位的方式依次移出主设备寄存器和从机寄存器,并且依次移入从设备寄存器和主设备寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。 | ||
* 主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给主机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机,这样两个移位寄存器中的内容就被交换,外设的写操作和读操作是同时进行的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。 | * 主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给主机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机,这样两个移位寄存器中的内容就被交换,外设的写操作和读操作是同时进行的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。 | ||
- | {{ :icore3:icore3_arm_hal_24_2.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_2.png?direct |}} |
* iCore3 双核心板采用的ARM控制器为STM32F407IGT6,SPI接口引脚选用的是PB3(SPI1_SCK)、PB4(SPI1_MISO)、PA7(SPI1_MOSI)和PA15(CS)这4个引脚。初始化SPI,通过SPI读写控制W5500内部寄存器。 | * iCore3 双核心板采用的ARM控制器为STM32F407IGT6,SPI接口引脚选用的是PB3(SPI1_SCK)、PB4(SPI1_MISO)、PA7(SPI1_MOSI)和PA15(CS)这4个引脚。初始化SPI,通过SPI读写控制W5500内部寄存器。 | ||
- | {{ :icore3:icore3_arm_hal_24_3.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_3.png?direct |}} |
- | {{ :icore3:icore3_arm_hal_24_4.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_4.png?direct |}} |
- | {{ :icore3:icore3_arm_hal_24_5.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_5.png?direct |}} |
=== 2、W5500简介 === | === 2、W5500简介 === | ||
* W5500是一款全硬件TCP/IP嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案。W5500集成了TCP/IP协议栈,10/100M以太网数据链路层(MAC)及物理层(PHY),使得用户使用单芯片就能够在他们的应用中拓展网络连接。久经市场考验的WIZnet全硬件TCP/IP协议栈支持TCP,UDP,IPv4,ICMP,ARP,IGMP 以及PPPoE协议。W5500内嵌32K字节片上缓存以供以太网包处理。如果你使用W5500,你只需要一些简单的Socket编程就能实现以太网应用。这将会比其他嵌入式以太网方案更加快捷、简便。用户可以同时使用8个硬件Socket独立通讯。W5500提供了SPI(外设串行接口)从而能够更加容易与外设MCU整合。而且,W5500使用了新的高效SPI协议支持80MHz速率,从而能够更好的实现高速网络通讯。 | * W5500是一款全硬件TCP/IP嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案。W5500集成了TCP/IP协议栈,10/100M以太网数据链路层(MAC)及物理层(PHY),使得用户使用单芯片就能够在他们的应用中拓展网络连接。久经市场考验的WIZnet全硬件TCP/IP协议栈支持TCP,UDP,IPv4,ICMP,ARP,IGMP 以及PPPoE协议。W5500内嵌32K字节片上缓存以供以太网包处理。如果你使用W5500,你只需要一些简单的Socket编程就能实现以太网应用。这将会比其他嵌入式以太网方案更加快捷、简便。用户可以同时使用8个硬件Socket独立通讯。W5500提供了SPI(外设串行接口)从而能够更加容易与外设MCU整合。而且,W5500使用了新的高效SPI协议支持80MHz速率,从而能够更好的实现高速网络通讯。 | ||
行 110: | 行 111: | ||
* GAR (网关 IP 地址寄存器) [R/W] [0x0001 – 0x0004] [0x00] | * GAR (网关 IP 地址寄存器) [R/W] [0x0001 – 0x0004] [0x00] | ||
* 该寄存器用来设置默认网关地址,例如: “192.168.0.1”。 | * 该寄存器用来设置默认网关地址,例如: “192.168.0.1”。 | ||
- | {{ :icore3:icore3_arm_hal_24_6.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_6.png?direct |}} |
* SUBR (子网掩码寄存器) [R/W] [0x0005 – 0x0008] [0x00] | * SUBR (子网掩码寄存器) [R/W] [0x0005 – 0x0008] [0x00] | ||
* 该寄存器用来设置子网掩码地址,例如“255.255.255.0”。 | * 该寄存器用来设置子网掩码地址,例如“255.255.255.0”。 | ||
- | {{ :icore3:icore3_arm_hal_24_7.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_7.png?direct |}} |
* SHAR (源 MAC 地址寄存器) [R/W] [0x0009 – 0x000E] [0x00] | * SHAR (源 MAC 地址寄存器) [R/W] [0x0009 – 0x000E] [0x00] | ||
* 该寄存器用来设置源 MAC 地址。例如: “00.08.DC.01.02.03”。 | * 该寄存器用来设置源 MAC 地址。例如: “00.08.DC.01.02.03”。 | ||
- | {{ :icore3:icore3_arm_hal_24_8.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_8.png?direct |}} |
* SIPR (源 IP 地址寄存器) [R/W] [0x000F – 0x0012] [0x00] | * SIPR (源 IP 地址寄存器) [R/W] [0x000F – 0x0012] [0x00] | ||
* 该寄存器用来设置源 IP 地址。例如: “192.168.0.2”。 | * 该寄存器用来设置源 IP 地址。例如: “192.168.0.2”。 | ||
- | {{ :icore3:icore3_arm_hal_24_9.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_9.png?direct |}} |
* (2)Socket 端口寄存器 | * (2)Socket 端口寄存器 | ||
* Socket寄存器用于建立socket通信。TCP是一种连接的通信。两个socket连接之前,必定要有一个Socket处在监听状态,而另一个socket启动连接,处于监听状态的就是服务器,启动连接的Socket就是客户端。启动TCP连接之前,必须正确设置Socket的目标IP和目的端口号。以下为配置目标IP地址和目的端口号的Socket寄存器。 | * Socket寄存器用于建立socket通信。TCP是一种连接的通信。两个socket连接之前,必定要有一个Socket处在监听状态,而另一个socket启动连接,处于监听状态的就是服务器,启动连接的Socket就是客户端。启动TCP连接之前,必须正确设置Socket的目标IP和目的端口号。以下为配置目标IP地址和目的端口号的Socket寄存器。 | ||
* Sn_DIPR (Socket 目标 IP 地址寄存器) [R/W] [0x000C-0x000F] [0x00000000] | * Sn_DIPR (Socket 目标 IP 地址寄存器) [R/W] [0x000C-0x000F] [0x00000000] | ||
* Sn_DIPR配置或指示的为 Socket n 的目标主机 IP 地址,在 TCP/UDP 模式下生效。在 TCP 客户端模式下,在 CONNECT 配置命令前,该寄存器设置了 TCP 服务器的 IP 地址。例如: Socket 0 的目标 IP 地址= 192.168.0.11, 配置应如下: | * Sn_DIPR配置或指示的为 Socket n 的目标主机 IP 地址,在 TCP/UDP 模式下生效。在 TCP 客户端模式下,在 CONNECT 配置命令前,该寄存器设置了 TCP 服务器的 IP 地址。例如: Socket 0 的目标 IP 地址= 192.168.0.11, 配置应如下: | ||
- | {{ :icore3:icore3_arm_hal_24_10.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_10.png?direct |}} |
* Sn_DPORT (Socket n 目标端口寄存器) [R/W] [0x0010-0x0011] [0x00] | * Sn_DPORT (Socket n 目标端口寄存器) [R/W] [0x0010-0x0011] [0x00] | ||
* Sn_DPORT 配置或指示了 Socket n 的目标主机端口号,在 TCP/UDP 模式下生效。在 TCP 客户端模式下,在 CONNET 配置命令前,该寄存器配置了 TCP Server监听的端口号。例如: Socket 0 的目标端口号 = 5000(0x1388) ,配置应如下: | * Sn_DPORT 配置或指示了 Socket n 的目标主机端口号,在 TCP/UDP 模式下生效。在 TCP 客户端模式下,在 CONNET 配置命令前,该寄存器配置了 TCP Server监听的端口号。例如: Socket 0 的目标端口号 = 5000(0x1388) ,配置应如下: | ||
- | {{ :icore3:icore3_arm_hal_24_11.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_11.png?direct |}} |
- | === 3、TCPC简介 === | + | |
- | * TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内[1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 | + | === 3、UDP简介 === |
- | * 基于TCP/IP协议的服务器和客户端程序的一般流程,如下图所示: | + | * UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。 |
- | {{ :icore3:icore3_arm_hal_24_12.png?direct |}} | + | * UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。 |
- | * 客户端与服务器在使用TCP传输协议时要先建立一个“通道”,在传输完毕之后又要关闭这“通道”,前者可以被形象地成为“三次握手”,而后者则可以被称为“四次挥手”。 | + | * UDP 协议具备以下特点: |
+ | * 没有各种连接:在传输数据前不需要建立连接,也避免了后续的断开连接。 | ||
+ | * 不重新排序:对到达顺序混乱的数据包不进行重新排序。 | ||
+ | * 没有确认:发送数据包无须等待对方确认。因此,使用 UDP 协议可以随时发 | ||
+ | * UDP通信流程图如下: | ||
+ | {{ :icore3:icore3_arm_hal_25_12.png?direct |}} | ||
- | * 通道的建立——三次握手: | ||
- | - 在建立通道时,客户端首先要向服务端发送一个SYN同步信号。 | ||
- | - 服务端在接收到这个信号之后会向客户端发出SYN同步信号和ACK确认信号。 | ||
- | - 当服务端的ACK和SYN到达客户端后,客户端与服务端之间的这个“通道”就会被建立起来 | ||
- | * 通道的关闭——四次挥手: | ||
- | - 在数据传输完毕之后,客户端会向服务端发出一个FIN终止信号 | ||
- | - 服务端在收到这个信号之后会向客户端发出一个ACK确认信号 | ||
- | - 如果服务端此后也没有数据发给客户端时服务端会向客户端发送一个FIN终止信号 | ||
- | - 客户端在收到这个信号之后会回复一个确认信号,在服务端接收到这个信号之后,服务端与客户端的通道也就关闭了 | ||
==== 四、 实验原理 ==== | ==== 四、 实验原理 ==== | ||
- | * iCore3带有W5500嵌入式以太网控制器,本实验实现TCP服务器功能。以iCore3作为服务器,PC作为客户端,PC的IP地址192.168.0.2,iCore3的IP地址为192.168.0.10,端口为60000。当客户端连接到服务器,TCP建立成功即可进行数据信息传输。硬件连接示意图如下。 | + | * iCore3带有W5500嵌入式以太网控制器,本实验实现UDP功能。PC的IP地址192.168.0.2, iCore3的IP地址为192.168.0.10,端口号为30000。上电即可进行数据信息传输。以下为实验原理图。 |
- | {{ :icore3:icore3_arm_hal_24_13.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_13.png?direct |}} |
- | * iCore3双核心板CPU采用STM32F407IGT6,STM32F407通过SPI接口与W5500通信,来进行W5500寄存器的访问,从而进行IP地址、MAC地址、网关信息、子网掩码地址等信息的读写。同时通过SPI驱动W5500建立Socket通信,来与客户端进行TCP连接。 | + | * iCore3双核心板CPU采用STM32F407IGT6,STM32F407通过SPI接口与W5500通信,来进行W5500寄存器的访问,从而进行IP地址、MAC地址、网关信息、子网掩码地址等信息的读写。同时通过SPI驱动W5500建立Socket通信,来进行UDP连接。 |
==== 五、 实验程序 ==== | ==== 五、 实验程序 ==== | ||
=== 1. main()函数中建立的服务器程序 === | === 1. main()函数中建立的服务器程序 === | ||
- | * 实现TCP通信需要移植的文件为socket.c、w5500.c文件。socket.c 文件夹里面主要是socket的一些函数,比如close connect socket等等函数,实现了一些应用层的封装 ;w5500.c 文件主要实现的是对W5500模块寄存器的读写和操作,包括读写那些寄存器,地址是多少等等。 | + | * W5500的UDP建立过程也是非常方便的,通过简单的读写寄存器便可以轻松实现。程序初始化完成以后,进入主循环函数。当Socket处于关闭状态时,在进行通信之前,我们先将该UDP模式的Socket端口初始化。当socket将处于 初始化完成状态即SOCK_UDP状态,此时就可以通过广播方式发送数据了。在测试之前要注意两个问题,首先建议关闭PC的防火墙;其次,若W5500模块与PC直接通过网线连接,需要修改PC的IP地址为静态IP,且保持与W5500的IP在 同一个网段;如果直接连接路由器,可以不用修改PC的IP地址。 |
- | * W5500内部自己实现了TCP/IP协议,STM32与W5500正常通信以后,可以通过SPI驱动W5500实现TCP通信。在将本设备IP地址、默认网关、MAC地址、子网掩码信息写入到W5500的通用寄存器中后,通过获取socket 0的状态来进行通信。首先在未连接时打开端口60000,在TCP的模式下监听客户端,与客户端连接成功以后,接收客户端的数据,同时将数据再发送给客户端,从而实现交互通信。 | + | |
<code c> | <code c> | ||
while (1) | while (1) | ||
+ | { | ||
+ | switch(getSn_SR(0)) /*获取socket0的状态*/ | ||
{ | { | ||
- | //处理TCP server信息 | + | case SOCK_UDP: |
- | switch(getSn_SR(0)) /*获取socket0的状态*/ | + | if(getSn_IR(0) & Sn_IR_RECV) |
- | { | + | { |
- | case SOCK_INIT: | + | setSn_IR(0, Sn_IR_RECV); |
- | listen(0); /*在TCP模式下监听客户端*/ | + | } |
+ | if((receive_length = getSn_RX_RSR(0))>0) | ||
+ | /*receive_length为已接收数据长度*/ | ||
+ | { | ||
+ | length = recvfrom(0, receive_buffer, receive_length, pc_ip,&pc_port); /*接收数据*/ | ||
+ | sendto(0, receive_buffer,length, pc_ip, pc_port); | ||
+ | /*发送接收到的数据*/ | ||
+ | } | ||
+ | break; | ||
+ | case SOCK_CLOSED: /*socket关闭*/ | ||
+ | socket(0,Sn_MR_UDP,30000,0); /*打开socket0的一个端口*/ | ||
break; | break; | ||
- | case SOCK_ESTABLISHED: | + | } |
- | if(getSn_IR(0) & Sn_IR_CON) | + | } |
- | { | + | |
- | setSn_IR(0, Sn_IR_CON); | + | |
- | } | + | |
- | receive_length = getSn_RX_RSR(0); | + | |
- | /*receive_length为已接收数据长度*/ | + | |
- | if(receive_length>0) | + | |
- | { | + | |
- | LED_GREEN_ON; | + | |
- | recv(0,receive_buffer,receive_length); /*接收来自客户端的数据*/ | + | |
- | send(0,receive_buffer,receive_length);/*接收到的数据发给客户端*/ | + | |
- | LED_GREEN_OFF; | + | |
- | } | + | |
- | break; | + | |
- | case SOCK_CLOSE_WAIT: | + | |
- | disconnect(0); /*断开连接*/ | + | |
- | break; | + | |
- | case SOCK_CLOSED: | + | |
- | socket(0,Sn_MR_TCP,60000,Sn_MR_ND); /*打开socket0的60000端口*/ | + | |
- | break; | + | |
- | } | + | |
- | } | + | |
</code> | </code> | ||
行 275: | 行 262: | ||
- 把iCore3(USB OTG)通过Micro USB线与计算机相连,为iCore3供电; | - 把iCore3(USB OTG)通过Micro USB线与计算机相连,为iCore3供电; | ||
- 把iCore3网口通过网线与计算机网口相连; | - 把iCore3网口通过网线与计算机网口相连; | ||
- | - 设置本机电脑IP;(方法见附录1) | ||
- 打开Keil MDK 开发环境,并打开本实验工程; | - 打开Keil MDK 开发环境,并打开本实验工程; | ||
- 打开TCP&UDP测试工具;(安装及使用方法见附录) | - 打开TCP&UDP测试工具;(安装及使用方法见附录) | ||
行 283: | 行 269: | ||
==== 七、 实验现象 ==== | ==== 七、 实验现象 ==== | ||
* 在发送区编辑完要发送的数据信息后,点击发送即可收到发送的数据包。如图所示 | * 在发送区编辑完要发送的数据信息后,点击发送即可收到发送的数据包。如图所示 | ||
- | {{ :icore3:icore3_arm_hal_24_14.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_14.png?direct |}} |
==== 附录 ==== | ==== 附录 ==== | ||
行 289: | 行 275: | ||
双击TCPUDPDebug102_Setup.exe,点击下一步,在这里安装路径我们默认即可,点击安装,然后Finish。 | 双击TCPUDPDebug102_Setup.exe,点击下一步,在这里安装路径我们默认即可,点击安装,然后Finish。 | ||
* 2、TCP&UDP测试工具的使用 | * 2、TCP&UDP测试工具的使用 | ||
- | (1)打开测试工具,界面如下。点击创建服务器,弹出了设置端口的窗口,端口设置为60001。 | + | (1)打开测试工具,界面如下。点击创建服务器,弹出了设置端口的窗口,端口设置为30000。 |
- | {{ :icore3:icore3_arm_hal_24_15.png?direct |}} | + | {{ :icore3:icore3_arm_hal_25_15.png?direct |}} |
- | (2)服务器已经创建完成(如下图),点击启动服务器 | + | (2)点击创建,创建完成即可通信。(若连接不上请关闭电脑防火墙) |
- | {{ :icore3:icore3_arm_hal_24_16.png?direct |}} | + | |
- | (3)iCore3客户端自动连接服务器,即可进行通信。(若连接不上请关闭电脑防火墙) | + | |