用户工具

站点工具


icore4t_43

差别

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

到此差别页面的链接

icore4t_43 [2020/10/15 17:52]
fmj 创建
icore4t_43 [2020/10/15 18:02] (当前版本)
fmj
行 4: 行 4:
 |购买链接|[[https://​item.taobao.com/​item.htm?​spm=a1z10.1-c-s.w4004-22598974120.6.5923532fw67dqQ&​id=610595120319|点击购买]]||| |购买链接|[[https://​item.taobao.com/​item.htm?​spm=a1z10.1-c-s.w4004-22598974120.6.5923532fw67dqQ&​id=610595120319|点击购买]]|||
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
-|  V0.1  |20200103 ​ |XiaomaGee|  初次建立 ​ |+|  V0.1  |20201015 ​ |FMJ|  初次建立 ​ |
  
  
行 11: 行 11:
 \\ \\
  
-===== 实验四十LWIP_UDP实验——以太网数据传输 ​=====+===== 实验四十LWIP_DHCP实验——动态分配IP ​=====
  
 ==== 一、 实验目的与意义 ==== ==== 一、 实验目的与意义 ====
-  - 了解LwIP协议栈和LAN8720物理层; +  - 了解DHCP的作用 
-  - 掌握UDP的使用方法; +  - 了解LWIP中DHCP的使用 
-  - 掌握STM32 HAL库中UDP配置方法; +  - 掌握以太网调试工具使用 
-  - 掌握KEILMDK 集成开发环境使用方法+  - 掌握KEILMDK 集成开发环境使用方法 
 ==== 二、 实验设备及平台 ==== ==== 二、 实验设备及平台 ====
   - iCore4T双核心板、扩展底板;   - iCore4T双核心板、扩展底板;
   - JLINK(或相同功能)仿真器;   - JLINK(或相同功能)仿真器;
-  - Micro USB线缆网线+  - Micro USB线缆; 
 +  - 以太通讯线
   - Keil MDK 开发平台;   - Keil MDK 开发平台;
   - STM32CubeMX开发平台;   - STM32CubeMX开发平台;
   - 装有WIN XP(及更高版本)系统的计算机。   - 装有WIN XP(及更高版本)系统的计算机。
 ==== 三、 实验原理 ==== ==== 三、 实验原理 ====
-=== 1、LwIP简介 ===+=== 1、DHCP简介 ===
  
-  * LwIP是Light Weight (轻型)IP协议有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。 +  * DHCP(Dynamic Host Configuration Protocol动态机配置协议是一个局域网网络协议,通常被应用在大型的局域网络环境中,主要作用中的理、分配IP地址使网络环境中主机得IP地址、Gateway地址、DNS服器地址等信息并能够升地址的使用率。 
-  * LwIP协议栈主要关注的怎么样减少内存的使用和代码的大小,这样就可以让LwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,LwIP对API进行了裁减,可以不需要复制一些数据。 +  * DHCP协议使用UDP通讯协议工作UDP通讯67和68两个通讯端,分别作为DHCP服务器和DHCP客户端。 ​DHCP协议端/服务模型,主机地址动态配任务由网络主机驱动当DHCP服务器接收到来自网络主机申请地址信息时才会向网络主机送相关地址配置等信息,以实现网络机地址信息的动态配置DHCP具以下功能: 
-  * LwIP提供三种API: +  ​保证任何IP地址一时刻只能由一台DHCP客户机所使用。  
-    * 1)RAW API  +  ​- DHCP当可以给户分配永久固定IP地址。  
-    * 2)LwIP API  +  ​- DHCP当可以同其他方法获得IP地址主机共存(如手工配置IP地址主机)。 
-    * 3)BSD API。 +  ​- DHCP服务应当向BOOTP客户端提供服务
-  * RAW API把协议栈和应用程序放到一个进程里边,该接口基于函数回调技术,使用该接口应用程序可以不用进行连续操作。不过,这会使应用程序编写难度加大且代 码不易被理解。为了接收数据,应用程序会向协议栈注册一个回调函数。该回调函数与特定的连接相关联当该关联的连接到达一个信息包,该回调函数就会协议 栈调用。这既有优点也有缺点。优点是既然应用程序和TCP/​IP协议栈驻留同一个进程中,那么发送和接收数据就不再产生进程切换。主要缺点应用程序不 能使自己陷入长期的连续运算,这样会导致通讯性能下降,原因是TCP/​IP处理与连续运算是不能并行发生。这个缺点可以通过把应用程序分为两部分来克 服,一部分处通讯,一部分处理运算。 +
-  * LwIP API把接收与处理放在一个线程里面。这样只要处理流程稍微被延迟,接收就会被阻塞,直接造成频繁丢包响应不及时等严重问题。因此,接收与协议处理必须 ​开。LwIP的作者显然已经考虑到了这一点他为我们提供了 tcpip_input() 函数来处理这个问题, 虽然他并没有在 rawapi 一文中说明。讲到这里,读者应该知道tcpip_input()函数投递的消息从哪里来的答案了吧,没错,它们来自于由底层网络驱动组成接收线程。我们在编写网络驱时, 其接收部分以任务形式创建。 数据包到达后, 去掉以太网包头IP包, 然后直接调用tcpip_input()函数将其 投递到mbox邮箱。投递结束,接收任继续下一个数据包的接收而被投递得IP包将由TCPIP线程继续处理。这样,即使某个IP包的处理时间过长也不 会造成频繁丢包现象的发生。这就是LwIP API。 +
-  * BSD API供了基于open-read-write-close模型UNIX标准API,它的最大特点是使程序移植到其它系统时比较容易,但用在嵌入式系统中效比较低,占用资源多。这对于我们的嵌入式应用有时是不能容忍的。 +
-  * 其主要特性如下: +
-    * (1) 支持多网络接口下的IP转发; +
-    * (2) 支持ICMP协议; +
-    * (3) 包括实验性扩展的UDP(用户数据报协议); +
-    * (4) 包括阻塞控制、RTT 估算、快速恢复和快速转发的TCP(传输控制协议); +
-    * (5) 提供专门的内部回调接口(Raw API),用于提高应用程序性能; +
-    * (6) 可选择Berkeley接API (在多线程情况下使用) ; +
-    * (7) 在最新的版本中支持ppp; +
-    * (8) 新版本中增加了的IP fragment的支持; +
-    * (9) 支持DHCP协议,​动态分配ip地址。 +
-=== 2、UDP简介 === +
-  * UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。 +
-  * UDP协议与TCP协议一样用于处理数据包,在OSI模型两者都位于传输层,处于IP协议上一层。UDP有不提供数据包组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用包括网络视频会议系统在内的众多的客户/​服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初光彩已经被一些类似协议所掩盖但即使在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。 +
-  * 许多应用只支持UDP,如:多媒体数据流,不产生任何额外的数据,即使知道有破坏的包也不进行重。当强调传输性能而不是传输完整性时,如:音频和多媒体应用,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为整个流量体的情况下,UDP也是一个好的选择。 +
-  * UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议接口UDP协议适用端口分别运行在同一台设备上的多个应用程序。 +
-  * UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。常用的UDP端口号有:53(DNS)、69(TFTP)、161(SNMP),使用UDP协议包括:TFTP、SNMP、NFS、DNS、BOOTP。 +
-  ​* UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。 +
-=== 3、UDP的主要特点 === +
-  * UDP是个无连接协议,传输数据之前源端和终端不建立连接,当它想传送就简单地去抓取来自应用程序的数据,并尽可快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。 +
-  * 于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。 +
-  ​* UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包而言UDP的额外开销很小。 +
-  * 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据速率、传输带宽、源端和终端主机性能的限制。 +
-  ​* UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文边界,因此,应用程序需要选择合适的报文大小。 +
-  * 虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、显示航空信息等等。UDP也用在路由信息协议RIPRouting Information Protocol)中修改路由表。在这些应用场合下,果有一个消息丢失,在几秒之后另一个新消息就会替换它。UDP广泛用在多媒体应用中。 +
-  ​* DMA(直接存储访问)传输不需要占用CPU,可以在存储器至存储器实高速数据传输本实验采用DMA2控制器的数据流0,选用通道0进行数据传输。通过LED的颜色来判断传输是否成功。 +
-=== 4、STM32H750以太网简介 ===+
  
-  * STM32H750芯片自带以太网模块通过工业介质独立接口(MII)或简化独立接口(RMII)为以太网LAN通信提供符合IEEE-802.3-2002的媒体访问控制(MAC)。微控制器需要一个外部物理接口设备(PHY)连接到物理LAN总线。PHY使用17个信号(用于MII)或9个信号(用于RMII)连接到设备MII端口并且可以使用来自微控制器25MHz(MII)时钟。 +  * 在日常应用中路由就是一个典型的DHCP服务器,而手机、电脑等联网设备为DHCP客户端,路由器为连接到网络的设备分配IP地址进而实现设备联网。 
-  * STM32H750自带以太网模块特点包括: +  * 验例程采用LWIP 版本位1.4.1,其中包含了DHCP协议,在对LWIPDHCP功能进行使能启动后,即可通过路由器对设备进行IP地址的分配
-    * 现10M/​100Mbit/​s数据传输速率; +
-    * 专用DMA控制器允许专用SRAM之间高速传输; +
-    * 标明MAC支持(VLAN支持); +
-    * 通过符合IEEE802.3MII/​RMII接口与外部以太网PHY进行通信; +
-    * 支持全双工半双工操作; +
-    * MAC控制子层(控制帧)支持; +
-    * 32位CRC生成和删除; +
-    * 支持多种灵活的地址过滤模式; +
-    * 每次发送或接收32位状态码; +
-    * 提供接收和发送两组FIFO; +
-    * 通过SMI(MDIO)接口配置和管理PHY设备; +
-    * 支持以太网时间戳(参见IEEE1588-2008),时间戳比较器连接到TIM2输入; +
-    * 当系统时间大于目标时间时触发中断 +
-    * 支持DMA。 +
-  * STM32H750以太网功能框图,如图所示: +
-{{ :​icore4t:​icore4t_arm_hal_41_1.png?​direct |}}  +
-=== 5、LAN8720A简介 ===+
  
-  * LAN8720A功能框图如图所示: 
-{{ :​icore4t:​icore4t_arm_hal_41_2.png?​direct |}}  
-  * LAN8720A是低功耗的10/​100M以太网PHY层芯片,I/​O引脚电压符合IEEE802.3-2005标准,支持通过RMII接口与以太网MAC层通信,内置10-BASE-T/​100BASE-TX全双工传输模块,支持10Mbps和100Mbps。 
-  * LAN8720A可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式),支持HPAuto-MDIX自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。LAN8720A的主要特点如下: 
-  * 高性能的10/​100M以太网传输模块 
-  * 支持RMII接口以减少引脚数 
-  * 支持全双工和半双工模式 
-  * 两个状态LED输出 
-  * 可以使用25M晶振以降低成本 
-  * 支持自协商模式 
-  * 支持HPAuto-MDIX自动翻转功能 
-  * 支持SMI串行管理接口 
-  * 支持MAC接口 
-=== 6、原理图 === 
- 
-  * iCore4T带有LAN8720A嵌入式以太网控制器,本实验实现TCP客户端功能。以PC作为服务器,iCore4T作为客户端,PC的IP地址192.168.0.1,端口号为60001,iCore4T的IP地址为192.168.0.10,端口随机。当客户端连接到服务器,TCP建立成功即可进行数据信息传输。实验原理图如下 
-{{ :​icore4t:​icore4t_arm_hal_41_3.png?​direct |}}  
 ==== 四、 实验程序 ==== ==== 四、 实验程序 ====
  
 === 1. 主函数 === === 1. 主函数 ===
 <code c> <code c>
 +int main(void)
 +{
 +  /* USER CODE BEGIN 1 */
 + int cnt;
 +  /* USER CODE END 1 */
 +  /*MCU Configuration-----------------------------------------------*/​
 +  /* Reset of all peripherals,​ Initializes the Flash interface and the Systick. */
 +  HAL_Init();
 +  /* USER CODE BEGIN Init */
 +  /* USER CODE END Init */
 +  /* Configure the system clock */
 +  SystemClock_Config();​
 +  /* USER CODE BEGIN SysInit */
 +i2c.initialize();​
 +axp152.initialize();​
 +axp152.set_dcdc1(3500);//​[ARM & FPGA BK1/2/6 &OTHER]
 +axp152.set_dcdc2(1200);//​[FPGA INT & PLL D]
 +axp152.set_aldo1(2500);//​[FPGA PLL A]
 +axp152.set_dcdc4(3300);//​[POWER_OUTPUT]
 +axp152.set_dcdc3(3300);//​[FPGA BK4][Adjustable]
 +axp152.set_aldo2(3300);//​[FPGA BK3][Adjustable]
 +axp152.set_dldo1(3300);//​[FPGA BK7][Adjustable]
 +axp152.set_dldo2(3300);//​[FPGA BK5][Adjustable]
 +  /* USER CODE END SysInit */
 +  /* Initialize all configured peripherals */
 +  MX_GPIO_Init();​
 +  MX_ETH_Init();​
 +MX_USART2_UART_Init();​
 +  /* USER CODE BEGIN 2 */
 +usart2.printf("​\033[1;​32;​40m"​);//​设置字体终端为绿色
 +usart2.printf("​\r\nHello,​ I am iCore4T!\r\n"​);​ //​串口信息输出 ​
 +//​LWIP初始化
 +while(lwip.initialize())//​lwip初始化
 +{
 +//​ETH初始化失败
 + usart2.printf("​\r\nETH initialize error!\r\n\r\n"​);​
 +}
 + NETMPU_Config();​
 + eth_tcps.initialize();​
 + usart2.initialize(115200);​
 + /* USER CODE END 2 */
 + /* Infinite loop */
 + /* USER CODE BEGIN WHILE */
 +  while (1)
 +  {
 +    /* USER CODE END WHILE */
 +    /* USER CODE BEGIN 3 */
 + if((cnt ++ / 800000) % 2){
 + LED_ON;
 + }else{
 + LED_OFF;
 + }
 + lwip.periodic_handle();​
 + key.process();​
 + //tcp process
 + if(eth_tcps.receive_ok_flag == 1){
 + eth_tcps.receive_ok_flag = 0;
 + eth_tcps.send_data(eth_tcps.tcppcbnew);​
 + }
 +  }
 + /* USER CODE END 3 */
 +}
  
 </​code> ​ </​code> ​
-=== 2. LwIP初始化 ===+=== 2. LwIP初始化函数(在配置LWIP的DHCP功能前,需要将lwipopts.h中的LWIP_DHCP宏定义,定义为1,否则无法使用DHCP功能)===
 <code c> <code c>
 +unsigned char initialize(void)
 +{
 +unsigned char retry = 0;
 + struct netif *Netif_Init_Flag;//​调用netif_add()函数时的返回值,​用于判断网络初始化是否成功
 + struct ip_addr ipaddr; ​ //​ip地址
 + struct ip_addr netmask; //​子网掩码
 + struct ip_addr gw;      //​默认网关 ​
 + while(lan8720.initialize()){ //​初始化LAN8720,​如果失败的话就重试5次
 + retry++;
 + if(retry > 5){
 + retry = 0;
 +   return 3;
 + } //​LAN8720初始化失败
 + }
 + lwip_init();//​初始化LWIP内核
 +//​设置MAC地址
 + for(i=0;​i<​6;​i++)
 + {
 + lwipdev.mac[i] = lan8720.mac[i];​
 + }
 +#if LWIP_DHCP //​使用动态IP
 + ipaddr.addr = 0;
 + netmask.addr = 0;
 + gw.addr = 0;
 +#else
 + //​设置默认IP
 + IP4_ADDR(&​ipaddr,​lan8720.ip[0],​lan8720.ip[1],​lan8720.ip[2],​lan8720.ip[3]);​
 + IP4_ADDR(&​netmask,​lan8720.sub[0],​lan8720.sub[1] ,​lan8720.sub[2],​lan8720.sub[3]);​
 + IP4_ADDR(&​gw,​lan8720.gw[0],​lan8720.gw[1],​lan8720.gw[2],​lan8720.gw[3]);​
 +#endif
 + //​向网卡列表中添加一个网口
 + Netif_Init_Flag = netif_add(&​lwip_netif,&​ipaddr,&​netmask,&​gw,​NULL,&​ethernetif_init,&​ethernet_input); ​
 +
 + if(Netif_Init_Flag==NULL){
 + return 4; //​网卡添加失败 ​
 + }else{//​网口添加成功后,​设置netif为默认值,​并且打开netif网口
 + netif_set_default(&​lwip_netif);//​设置netif为默认网口
 + netif_set_up(&​lwip_netif);​ //​打开netif网口
 + }
 + usart2.printf("​开启 DHCP ...\r\n"​);​
 + dhcp_start(&​lwip_netif);//​开启DHCP ​
 + return 0;//​操作OK.
 +}   
  
 </​code> ​ </​code> ​
-=== 3. eth_udp初始化 ​===+=== 3.DHCP信息获取函数 ​===
 <code c> <code c>
 +void lwip_dhcp_task(void)
 +{
 + u32 ip=0,​netmask=0,​gw=0;​
 + lwipdev.dhcpstatus=0;​ //​正在DHCP
 +
 + usart2.printf("​正在获取地址...\r\n"​);​
 + ip=lwip_netif.ip_addr.addr;//​读取新IP地址
 + netmask=lwip_netif.netmask.addr;//​读取子网掩码
 + gw=lwip_netif.gw.addr;//​读取默认网关 ​
 + if(ip!=0) ​ //​当正确读取到IP地址的时候
 + {
 + lwipdev.dhcpstatus=2;​ //​DHCP成功
 + dhcp_stop(&​lwip_netif);​ //​关闭DHCP
 + usart2.printf("​网卡en的MAC地址为:​................%d.%d.%d.%d.%d.%d\r\n",​lwipdev.mac[0],​lwipdev.mac[1],​lwipdev.mac[2],​lwipdev.mac[3],​lwipdev.mac[4],​lwipdev.mac[5]);​
 + //​解析出通过DHCP获取到的IP地址
 + lwipdev.ip[3]=(uint8_t)(ip>>​24); ​
 + lwipdev.ip[2]=(uint8_t)(ip>>​16);​
 + lwipdev.ip[1]=(uint8_t)(ip>>​8);​
 + lwipdev.ip[0]=(uint8_t)(ip);​
 + usart2.printf("​通过DHCP获取到IP地址..............%d.%d.%d.%d\r\n",​lwipdev.ip[0],​lwipdev.ip[1],​lwipdev.ip[2],​lwipdev.ip[3]);​
 + //​解析通过DHCP获取到的子网掩码地址
 + lwipdev.netmask[3]=(uint8_t)(netmask>>​24);​
 + lwipdev.netmask[2]=(uint8_t)(netmask>>​16);​
 + lwipdev.netmask[1]=(uint8_t)(netmask>>​8);​
 + lwipdev.netmask[0]=(uint8_t)(netmask);​
 + usart2.printf("​通过DHCP获取到子网掩码............%d.%d.%d.%d\r\n",​lwipdev.netmask[0],​lwipdev.netmask[1],​lwipdev.netmask[2],​lwipdev.netmask[3]);​
 + //​解析出通过DHCP获取到的默认网关
 + lwipdev.gateway[3]=(uint8_t)(gw>>​24);​
 + lwipdev.gateway[2]=(uint8_t)(gw>>​16);​
 + lwipdev.gateway[1]=(uint8_t)(gw>>​8);​
 + lwipdev.gateway[0]=(uint8_t)(gw);​
 + usart2.printf("​通过DHCP获取到的默认网关..........%d.%d.%d.%d\r\n",​lwipdev.gateway[0],​lwipdev.gateway[1],​lwipdev.gateway[2],​lwipdev.gateway[3]);​
 +
 + }else if(lwip_netif.dhcp->​tries>​LWIP_MAX_DHCP_TRIES) //​通过DHCP服务获取IP地址失败,​且超过最大尝试次数
 + {  ​
 + lwipdev.dhcpstatus=0XFF;//​DHCP失败.
 + //​使用静态IP地址
 +IP4_ADDR(&​(lwip_netif.ip_addr),​lwipdev.ip[0],​lwipdev.ip[1],​lwipdev.ip[2],​lwipdev.ip[3]);​  ​     ​
 +IP4_ADDR(&​(lwip_netif.netmask),​lwipdev.netmask[0],​lwipdev.netmask[1],​lwipdev.netmask[2],​lwipdev.netmask[3]);​
 +IP4_ADDR(&​(lwip_netif.gw),​lwipdev.gateway[0],​lwipdev.gateway[1],​lwipdev.gateway[2],​lwipdev.gateway[3]);​
 + usart2.printf("​DHCP服务超时,​使用静态IP地址!\r\n"​);​
 + usart2.printf("​网卡en的MAC地址为:​................%d.%d.%d.%d.%d.%d\r\n",​lwipdev.mac[0],​lwipdev.mac[1],​lwipdev.mac[2],​lwipdev.mac[3],​lwipdev.mac[4],​lwipdev.mac[5]);​
 + usart2.printf("​静态IP地址........................%d.%d.%d.%d\r\n",​lwipdev.ip[0],​lwipdev.ip[1],​lwipdev.ip[2],​lwipdev.ip[3]);​
 + usart2.printf("​子网掩码..........................%d.%d.%d.%d\r\n",​lwipdev.netmask[0],​lwipdev.netmask[1],​lwipdev.netmask[2],​lwipdev.netmask[3]);​
 + usart2.printf("​默认网关..........................%d.%d.%d.%d\r\n",​lwipdev.gateway[0],​lwipdev.gateway[1],​lwipdev.gateway[2],​lwipdev.gateway[3]);​
 + }  ​
 +}
 +
 +</​code> ​
 +
 +=== 4.按键处理函数 ===
 +<code c>
 +static void process(void)
 +{
 + //​按键处理
 + if(key.value != key.bak_value){
 + switch(key.value){
 + case ARM_KEY:
 + lwip.lwip_dhcp_task();//​获取DHCP信息
 + break;
 + }
 + key.bak_value = key.value;
 + }
 +}
  
 </​code> ​ </​code> ​
行 118: 行 226:
  
   - 把仿真器与iCore4T的SWD调试口相连(直接相连或者通过转接器相连);   - 把仿真器与iCore4T的SWD调试口相连(直接相连或者通过转接器相连);
-  - iCore4T插在扩展底板上,通过扩展底板供电给iCore4T; +  - 采用12V电源为iCore4T底板供电; 
-  - 把iCore4T扩展底板网口通过线与计算机网口相连; +  - 把iCore4T通过Micro USB线与计算机相连,便于与计算机通讯; 
-  - 设置本机电脑IP(方法件附录1) +  - 把iCore4T通过以太网与路由备连接; 
-  - 打开Keil MDK 开发环境,并打开本实验工程; +  - 打开Keil MDK 开发环境,并打开本实验工程,并烧写程序到iCore4T上; 
-  - 打开TCP&​UDP测试工具;(安装及使用方法件附录2) +  - 通过putty打开对应串口,按下ARM按键即获取DHCP信息。 
-  - 烧写程序到iCore4T上; +  ​- 同网络中电脑,通过TCP通讯测试工具采TCP协议向iCore4T发送数据
-  - 以进入Debug 模式,单步运行或设置断点验证程序逻辑。 +
-  ​* **注:STM32H750 ETH默认使用DMA功能。但是DTCM虽然和其他的MCU和RAM起始地址样,缺无法被DMA访问。也就是通用RAM地址变了但是编译器还是会把DTCM的地址作为通用RAM的起始地址请将内存起始地址修改为D1域,操作步骤如图所示,也就是在RAM2上打勾。** +
-{{ :​icore4t:​icore4t_arm_hal_41_4.png?​direct&​850 |}}  +
-==== 六、 实验现象 ====+
  
-  * 在发送区编辑完要发送的数据信息后,点击发送即可收到发送的数据包。如图所示: 
-{{ :​icore4t:​icore4t_arm_hal_41_5.png?​direct |}}  
-==== 附录: ==== 
  
-  * 1、打开控制面板-->​网络和Internet-->​网络和共享中心-->​更改适配器设置-->​以太网属性 +==== 六、 实验现象 ​====
-{{ :​icore4t:​icore4t_arm_hal_41_6.png?​direct |}}  +
-  * 2、Internet协议版本4,选择使用下面的IP地址,然后更改IP地址和默认网关 +
-{{ :​icore4t:​icore4t_arm_hal_41_7.png?​direct |}}  +
-==== 附录: ​====+
  
-  * **1、TCP&​UDP测试工具安装** +  * ARM按键每按下一,在putty将打印DHCP信息如图所示从图中可以看到iCore4T被分配地址以及网关等信息。 
-    * 双击TCP&​UDPDebug102_setup.exe,点击下一,在这里安装路径默认即可点击安装 +{{ :icore4t:icore4t_arm_hal_43_1.png?direct |}}  
-  * **2、TCP&​UDP测试工具使用** +  * 采用TCP通讯测试工具向iCore4T发送消息可以看到返回的消息与发送的消息一致。 
-  * (1)打开测试工具点击创建连接,弹出设置端口的窗口,设置为30001. +{{ :icore4t:icore4t_arm_hal_43_2.png?direct |}} 
- {{ :icore4t:icore4t_arm_hal_41_8.png?direct |}}  +
-  * (2)创建完成(如下图)点击连接 +
-{{ :icore4t:icore4t_arm_hal_41_9.png?direct |}}  +
-  * (3)iCore4T自动连接即可通信。(若连接不成功,请关闭电脑防火墙)+
  
icore4t_43.1602755575.txt.gz · 最后更改: 2020/10/15 17:52 由 fmj