用户工具

站点工具


icore3_arm_hal_24

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore3_arm_hal_24 [2020/09/16 17:26]
fmj
icore3_arm_hal_24 [2022/03/18 15:11]
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-08-01 ​ |  gingko ​ |  初次建立 ​ |
行 10: 行 9:
 \\ \\
 \\ \\
 +
  
 ===== STM32CubeMX教程二十四——LAN_TCPS实验 ===== ===== STM32CubeMX教程二十四——LAN_TCPS实验 =====
行 60: 行 60:
 \\ \\
  
-===== 实验二十LAN_TCPC实验——以太网数据传输 =====+===== 实验二十LAN_TCPS实验——以太网数据传输 =====
  
 ==== 一、 实验目的与意义 ==== ==== 一、 实验目的与意义 ====
-  - 了解STM32的SPI和W5500的TCPC结构 +  - 了解STM32的SPI和W5500的TCPS结构 
-  - 了解STM32的SPI和W5500的TCPC特征 +  - 了解STM32的SPI和W5500的TCPS特征 
-  - 掌握SPI和TCPC使用方法 +  - 掌握STM32 HAL库中SPI和TCPS配置方法 
-  - 掌握STM32 HAL库中SPI和TCPC配置方法+  - 掌握STM32CubeMX使用方法
   - 掌握KEIL ​ MDK集成开发环境使用方法   - 掌握KEIL ​ MDK集成开发环境使用方法
  
行 93: 行 93:
     - SCLK时钟信号,由主设备产生。     - SCLK时钟信号,由主设备产生。
     - CS从设备片选信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。     - CS从设备片选信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。
-{{ :icore3:icore3_arm_hal_23_1.png?direct |}}+{{ :icore3:icore3_arm_hal_24_1.png?direct |}}
   * 在一个SPI时钟周期内,会完成如下操作:   * 在一个SPI时钟周期内,会完成如下操作:
     - 主设备通过MOSI线发送1位数据,从设备通过该线读取这1位数据;     - 主设备通过MOSI线发送1位数据,从设备通过该线读取这1位数据;
行 99: 行 99:
   * 这是通过移位寄存器来实现的。主机和从机都有一个串行移位寄存器,随着时钟脉冲,数据按照从高位到低位的方式依次移出主设备寄存器和从机寄存器,并且依次移入从设备寄存器和主设备寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。 ​   * 这是通过移位寄存器来实现的。主机和从机都有一个串行移位寄存器,随着时钟脉冲,数据按照从高位到低位的方式依次移出主设备寄存器和从机寄存器,并且依次移入从设备寄存器和主设备寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。 ​
   * 主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给主机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机,这样两个移位寄存器中的内容就被交换,外设的写操作和读操作是同时进行的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。   * 主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给主机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机,这样两个移位寄存器中的内容就被交换,外设的写操作和读操作是同时进行的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
-{{ :icore3:icore3_arm_hal_23_2.png?direct |}}+{{ :icore3:icore3_arm_hal_24_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_23_3.png?direct |}} +{{ :icore3:icore3_arm_hal_24_3.png?direct |}} 
-{{ :icore3:icore3_arm_hal_23_4.png?direct |}} +{{ :icore3:icore3_arm_hal_24_4.png?direct |}} 
-{{ :icore3:icore3_arm_hal_23_5.png?direct |}}+{{ :icore3:icore3_arm_hal_24_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: 行 110:
    * 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_23_6.png?direct |}}+{{ :icore3:icore3_arm_hal_24_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_23_7.png?direct |}}+{{ :icore3:icore3_arm_hal_24_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_23_8.png?direct |}}+{{ :icore3:icore3_arm_hal_24_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_23_9.png?direct |}}+{{ :icore3:icore3_arm_hal_24_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_23_10.png?direct |}}+{{ :icore3:icore3_arm_hal_24_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 模式下生 +      * Sn_DPORT 配置或指示了 Socket n 的目标主机端口号,在 TCP/UDP 模式下生效。在 TCP 客户端模式下,在 CONNET 配置命令前,该寄存器配置了 TCP Server监听的端口号。例如: Socket 0 的目标端口号 = 5000(0x1388) ,配置应如下: 
-效。在 TCP 客户端模式下,在 CONNET 配置命令前,该寄存器配置了 TCP Server +{{ :icore3:icore3_arm_hal_24_11.png?direct |}}
-监听的端口号。例如: Socket 0 的目标端口号 = 5000(0x1388) ,配置应如下: +
-{{ :icore3:icore3_arm_hal_23_11.png?direct |}}+
 === 3、TCPC简介 ===  ​ === 3、TCPC简介 ===  ​
   * TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内[1] ​ 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。   * TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内[1] ​ 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
   * 基于TCP/​IP协议的服务器和客户端程序的一般流程,如下图所示:   * 基于TCP/​IP协议的服务器和客户端程序的一般流程,如下图所示:
-{{ :icore3:icore3_arm_hal_23_12.png?direct |}}+{{ :icore3:icore3_arm_hal_24_12.png?direct |}}
   * 客户端与服务器在使用TCP传输协议时要先建立一个“通道”,在传输完毕之后又要关闭这“通道”,前者可以被形象地成为“三次握手”,而后者则可以被称为“四次挥手”。   * 客户端与服务器在使用TCP传输协议时要先建立一个“通道”,在传输完毕之后又要关闭这“通道”,前者可以被形象地成为“三次握手”,而后者则可以被称为“四次挥手”。
  
行 147: 行 145:
  
 ==== 四、 实验原理 ==== ==== 四、 实验原理 ====
-  * iCore3带有W5500嵌入式以太网控制器,本实验实现TCP客户端功能。以PC作为服务器,iCore3作为客户端,PC的IP地址192.168.0.2,端口号为60001,iCore3的IP地址为192.168.0.10,端口随机。当客户端连接到服务器,TCP建立成功即可进行数据信息传输。以下为实验原理图。 +  * iCore3带有W5500嵌入式以太网控制器,本实验实现TCP服务器功能。以iCore3作为服务器,PC作为客户端,PC的IP地址192.168.0.2,iCore3的IP地址为192.168.0.10,端口为60000。当客户端连接到服务器,TCP建立成功即可进行数据信息传输。硬件连接示意如下。 
-{{ :icore3:icore3_arm_hal_23_13.png?direct |}}+{{ :icore3:icore3_arm_hal_24_13.png?direct |}} 
 +  * iCore3双核心板CPU采用STM32F407IGT6,STM32F407通过SPI接口与W5500通信,来进行W5500寄存器的访问,从而进行IP地址、MAC地址、网关信息、子网掩码地址等信息的读写。同时通过SPI驱动W5500建立Socket通信,来与客户端进行TCP连接。
 ==== 五、 实验程序 ==== ==== 五、 实验程序 ====
-=== 1. main()函数中建立的客户端程序 ===+=== 1. main()函数中建立的服务器程序 === 
 +  * 实现TCP通信需要移植的文件为socket.c、w5500.c文件。socket.c 文件夹里面主要是socket的一些函数,比如close connect socket等等函数,实现了一些应用层的封装 ;w5500.c 文件主要实现的是对W5500模块寄存器的读写和操作,包括读写那些寄存器,地址是多少等等。 
 +  * W5500内部自己实现了TCP/​IP协议,STM32与W5500正常通信以后,可以通过SPI驱动W5500实现TCP通信。在将本设备IP地址、默认网关、MAC地址、子网掩码信息写入到W5500的通用寄存器中后,通过获取socket 0的状态来进行通信。首先在未连接时打开端口60000,在TCP的模式下监听客户端,与客户端连接成功以后,接收客户端的数据,同时将数据再发送给客户端,从而实现交互通信。 
 <code c> <code c>
  while (1)  while (1)
-  ​+
- //​处理TCP ​client信息 +//​处理TCP ​server信息 
- switch(getSn_SR(0)) ​   /​*获取socket0的状态*/​ +switch(getSn_SR(0)) ​                          ​/​*获取socket0的状态*/​ 
-+
- case SOCK_INIT: ​                  /​*socket初始化完成*/​ +case SOCK_INIT:​ 
- connect(0, remote_ip ,60001);  /​*在TCP模式下向服务器发送连接请求*/  +listen(0);            /​*在TCP模式下监听客户端*/ 
- break; +break; 
- case SOCK_ESTABLISHED: ​         /​*socket连接建立*/​ +case SOCK_ESTABLISHED:​ 
- if(getSn_IR(0) & Sn_IR_CON) +if(getSn_IR(0) & Sn_IR_CON) 
- +
- setSn_IR(0, Sn_IR_CON); ​  /​*Sn_IR的第0位置1*/​ +setSn_IR(0, Sn_IR_CON);​ 
- +
- receive_length = getSn_RX_RSR(0);​ /*len为已接收数据的大小*/ +receive_length = getSn_RX_RSR(0); ​       
- if(receive_length > 0) + /*receive_length为已接收数据长度*/ 
- +if(receive_length>​0) 
- memset(receive_buffer,​0,​sizeof(receive_buffer))+
- recv(0,​receive_buffer,​receive_length);​ +LED_GREEN_ON
-/*W5500接收来自Sever的数据*/​ +recv(0,​receive_buffer,​receive_length);​ /​*接收来自客户端的数据*/​ 
- send(0,​receive_buffer,​receive_length);​ +send(0,​receive_buffer,​receive_length);​/​*接收到的数据发给客户端*/ ​ 
- }   ​ +      ​LED_GREEN_OFF;​ 
- break; +    
- case SOCK_CLOSE_WAIT: ​         /​*socket等待关闭状态*/​ +    break; 
- disconnect(0);​ +  case SOCK_CLOSE_WAIT:​ 
- break; +     ​disconnect(0); ​                           /​*断开连接*/​ 
- case SOCK_CLOSED: ​             /​*socket关闭*/​ +  break; 
- local_port = rand() % 10000 + 50000; +  case SOCK_CLOSED:​ 
- socket(0,​Sn_MR_TCP,​local_port,​Sn_MR_ND); ​      +     ​socket(0,​Sn_MR_TCP,​60000,Sn_MR_ND); /​*打开socket0的60000端口*/ 
-/​*打开socket0的一个端口*/ +  break;
- break;+
  }  }
 } }
  
 </​code>​ </​code>​
-  * Main函数中对SDIO与USB分别进行了初始化,在while循环中用三色灯循环点亮表明程序正在运行。+
 === 2. SPI初始化配置 === === 2. SPI初始化配置 ===
   * 初始化SPI 主要是对SPI要使用到的引脚以及SPI通信协议中时钟相位和极性进行设置   * 初始化SPI 主要是对SPI要使用到的引脚以及SPI通信协议中时钟相位和极性进行设置
行 276: 行 277:
   - 设置本机电脑IP;(方法见附录1)   - 设置本机电脑IP;(方法见附录1)
   - 打开Keil MDK 开发环境,并打开本实验工程;   - 打开Keil MDK 开发环境,并打开本实验工程;
-  - 打开TCP&​UDP测试工具;(安装及使用方法见附录2+  - 打开TCP&​UDP测试工具;(安装及使用方法见附录)
   - 烧写程序到iCore3上;   - 烧写程序到iCore3上;
   - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。   - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。
行 282: 行 283:
 ==== 七、 实验现象 ==== ==== 七、 实验现象 ====
   * 在发送区编辑完要发送的数据信息后,点击发送即可收到发送的数据包。如图所示   * 在发送区编辑完要发送的数据信息后,点击发送即可收到发送的数据包。如图所示
-{{ :icore3:icore3_arm_hal_23_14.png?direct |}}+{{ :icore3:icore3_arm_hal_24_14.png?direct |}}
  
-==== 附录1 ==== +==== 附录 ==== 
-1、打开控制面板网络和Internet网络和共享中心更改适配器设置以太网属性 +  ​* ​1、TCP&​UDP测试工具安装
-{{ :​icore3:​icore3_arm_hal_23_14.png?​direct |}} +
-2、Internet协议版本选择使用下面的IP地址(如下图所示),然后更改IP地址和默认网关 +
-{{ :​icore3:​icore3_arm_hal_23_14.png?​direct |}} +
-==== 附录2 ​==== +
-1、TCP&​UDP测试工具安装+
 双击TCPUDPDebug102_Setup.exe,点击下一步,在这里安装路径我们默认即可,点击安装,然后Finish。 双击TCPUDPDebug102_Setup.exe,点击下一步,在这里安装路径我们默认即可,点击安装,然后Finish。
-2、TCP&​UDP测试工具的使用+  * 2、TCP&​UDP测试工具的使用
 (1)打开测试工具,界面如下。点击创建服务器,弹出了设置端口的窗口,端口设置为60001。 (1)打开测试工具,界面如下。点击创建服务器,弹出了设置端口的窗口,端口设置为60001。
-{{ :icore3:icore3_arm_hal_23_14.png?direct |}}+{{ :icore3:icore3_arm_hal_24_15.png?direct |}}
 (2)服务器已经创建完成(如下图),点击启动服务器 (2)服务器已经创建完成(如下图),点击启动服务器
-{{ :icore3:icore3_arm_hal_23_14.png?direct |}}+{{ :icore3:icore3_arm_hal_24_16.png?direct |}}
 (3)iCore3客户端自动连接服务器,即可进行通信。(若连接不上请关闭电脑防火墙) (3)iCore3客户端自动连接服务器,即可进行通信。(若连接不上请关闭电脑防火墙)
  
icore3_arm_hal_24.txt · 最后更改: 2022/03/18 15:11 由 sean