RL_TCPNET是ARM的RL库中的网络协议栈,之前只在工程中见过,没有实际研究过。刚好需要在STM32F2上开发网络接口,对比了几个常用的嵌入式网络栈,发现比较常用的就LwIP,刚开始也是想用LwIP,但怕调试时间来不及,且初试了一下,感觉内容比较多,暂时放弃。后决定参考之前的工程,使用RL_TCPNET。

主要参考了野火和硬汉的嵌入式开发版配套资料,大概熟悉了关于MAC、PHY、RMII/SMI等基础概念,然后根据MDK的文档开始网络开发。

首先,使用的STM32F207芯片自带MAC控制器,需要外部通过RMII/SMI接口连接一个PHY芯片。这里直接使用ARM的CMSIS-Driver中的Ethernet_MAC和Ethernet_PHY进行开发。

PHY根据实际情况选择相似的,由于之前项目有PHY驱动文件,所以没有后面勾选KSZ8081RNA,而使用的之前的PHY_general驱动文件(文件内容没有太多差异)。

选择Ethernet_MAC后,Project的CMSIS-Driver下会多出两个文件,“EMAC_STM32F2xx.c”和“EMAC_STM32F2xx.h”,其中C文件中主要定义了一个MAC对象的操作集。

/* MAC Driver Control Block */
ARM_DRIVER_ETH_MAC Driver_ETH_MAC0 = {GetVersion,GetCapabilities,Initialize,Uninitialize,PowerControl,GetMacAddress,SetMacAddress,SetAddressFilter,SendFrame,ReadFrame,GetRxFrameSize,GetRxFrameTime,GetTxFrameTime,ControlTimer,Control,PHY_Read,PHY_Write
};

其中,ARM_DRIVER_ETH_MAC的定义在“Driver_ETH_MAC.h”中,该文件中有很多函数的声明,类似“ARM_ETH_MAC_XXX( )”,由于RT_TCPNET不开源,具体操作不清楚,只能根据函数名意会。

选择Ethernet_PHY后,Project的CMSIS-Driver下会多出两个文件,“KSZ8081RNA.c”和“KSZ8081RNA.h”,其中C文件中主要定义了一个PHY对象的操作集(实际是"PHY_general.c"和"PHY_general.h")。

/* PHY Driver Control Block */
ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY_(ETH_PHY_NUM) = {GetVersion,Initialize,Uninitialize,PowerControl,SetInterface,SetMode,GetLinkState,GetLinkInfo
};

其中,ARM_DRIVER_ETH_PHY的定义在“Driver_ETH_PHY.h”中,该文件中有很多函数的声明,类似“ARM_ETH_PHY_XXX( )”,由于RT-TCPNET不开源,具体操作不清楚,只能根据函数名意会。

MAC和PHY对象操作集最终会被RL-TCPNET调用,这两个对象操作集会被“net_config.h”文件中的“net_eth0_config”结构体引用。

/* ETH0 device configuration */NET_ETH_CFG net_eth0_config = {&ARM_Driver_ETH_MAC_(ETH0_DRIVER),&ARM_Driver_ETH_PHY_(ETH0_DRIVER),osThread(netETH_Thread),osSemaphore(eth0_lock),eth0_mac_addr,ETH0_MAC_ADDR,#if (ETH0_IP4_ENABLE)&eth0_ip4_config,#elseNULL,#endif#if (ETH0_IP6_ENABLE)&eth0_ip6_config#elseNULL#endif};

然后按照MDK的网络组件文档,回到KEIL的RTE,配置Network,使用一个以太网口,“ETH”数量1个。

通过netInitialize( )函数进行初始化,但后来编译通过却发现程序会在这个函数卡死,无法完成初始化。后来仔细看了文档,原来是要多开两个用户线程。

所以需要到RTX_Conf_CM.c中进行额外配置。

之后netInitialize( )成功执行,网络其他配置也正常,设置了固定IP、网关、掩码和MAC,可以正常ping通。后以为网络开发差不多了,但有发现一个问题,刚开始确实可以ping通,但过一会儿就不行了,后来测试了多次,大概就是启动后一分钟,就再也ping不通了,程序也没死,其他线程正常运行。百思不得其解,偶然在网上搜到一个关于打印机一分钟后ping不通的提问,才发现原来是开了DHCP,一分钟后自动重配IP地址,所以取消DHCP之后,网络正常了。

记录一波,因为RL-TCPNET不开源,有些东西理解的不深,后期有机会再用LwIP试试,毕竟都是主流嵌入式网络协议栈。

STM32使用RL_TCPNET网络协议栈的开发相关推荐

  1. 【STM32+cubemx】0021 HAL库开发:EN28J60芯片移植uIP以太网协议栈

    上一节我们学习了使用ENC28J60芯片来实现简单的以太网通信,使用的是一个极其简陋的网络协议栈,这个协议栈的功能是很不完善的,只能用作演示验证. 想要用到产品上,要使用相对成熟的协议栈.本节我们就以 ...

  2. TCP/IP网络协议栈在Linux内核中的如何使用丨内核开发丨驱动开发丨操作系统丨内核源码

    TCP/IP网络协议栈在Linux内核中的如何使用 视频讲解如下,点击观看: TCP/IP网络协议栈在Linux内核中的如何使用丨内核开发丨驱动开发丨操作系统丨内核源码 C/C++Linux服务器开发 ...

  3. 深入浅出Linux内核网络协议栈|结构sk_buff|Iptables|Netfilter丨内核源码丨驱动开发丨内核开发丨C/C++Linux服务器开发

    深入浅出Linux内核网络协议栈 视频讲解如下,点击观看: 深入浅出Linux内核网络协议栈|结构sk C/C++Linux服务器开发高级架构师知识点精彩内容包括:C/C++,Linux,Nginx, ...

  4. 100行源代码搞定用户态协议栈丨udp,icmp,arp协议的现实丨网络协议栈丨Linux服务器开发丨C++后端开发丨Linux后台开发

    100行源代码搞定用户态协议栈 视频讲解如下,点击观看: 100行源代码搞定用户态协议栈丨udp,icmp,arp协议的现实丨网络协议栈丨Linux服务器开发丨C++后端开发丨Linux后台开发丨网络 ...

  5. 【Linux服务器开发系列】手写一个用户态网络协议栈,瞬间提升你网络功底丨netmap/dpdk的实现

    手写一个用户态网络协议栈,瞬间提升你网络功底 1. 网卡基础架构 2. netmap/dpdk的实现 3. 网络协议栈实战 [Linux服务器开发系列]手写一个用户态网络协议栈,瞬间提升你网络功底丨n ...

  6. 一个开源且完全自主开发的国产网络协议栈

    已剪辑自: https://mp.weixin.qq.com/s/_1LE7mGc9mRuajRgNsyirQ onps是一个开源且完全自主开发的国产网络协议栈,适用于资源受限的单片机系统,提供完整地 ...

  7. Linux 网络协议栈开发—— 二层桥实现原理

    网桥原理: 网桥工作在链路层,所以它是二层的东西,对于以太网来说网桥和二层网络设备交换机的工作方式几乎是一样的,每个交换机包含一系列以太网接口,交换机通过其内部的硬件交换芯片实现对这些以太网接口出入报 ...

  8. Linux 网络协议栈开发基础篇—— 网桥br0

    一.桥接的概念 简单来说,桥接就是把一台机器上的若干个网络接口"连接"起来.其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去.以使得网口之间的报文能够互相转发. 交换机 ...

  9. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...

    1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...

最新文章

  1. 2022-2028年中国分离膜外壳行业市场调查研究及投资前景预测报告
  2. mybatis 操作动态表+动态字段+存储过程
  3. Jetty开发指导:框架
  4. 20145221 《信息安全系统设计基础》第3周学习总结
  5. Oracle Database 12c DBA文官手册(第8版)——第5章 开发和实现应用程序
  6. 26、HTML 区块
  7. VTK:可视化算法之ClipSphereCylinder
  8. MySQL-InnoDB引擎
  9. C++11中线程所有权转移分析
  10. Ubuntu 16.04-17.04开机自动root用户登录(测试可用)
  11. React组件复用的方式
  12. yandex 浏览器 linux,业界动态
  13. 2019年12月中国编程语言排行和薪资分析
  14. 如何切换计算机用户界面,让我来教大家从WIN10界面切换到WIN 7界面吧!嘻嘻
  15. php json_encode options,json_encode($json,$option) 对变量进行 JSON 编码说明
  16. tcpdump 一个比较详细的用法
  17. 利用线程池单线程下载网页信息
  18. spring事务的传播属性和事务隔离级别及配置事务(注解方式)
  19. Python 求水仙花数
  20. STM8L建立IAR工程

热门文章

  1. 邵雍·《渔樵问对》译文和原文
  2. 聚焦五大亮点,神策数据 A/B 测试功能全新发布!
  3. 电压电流双闭环PFC单相PWM整流
  4. 翻译文章后再来看翻译文章
  5. 前端vue项目(使用pdf.js) pdf展示及pdf工具栏放大缩小功能实现
  6. 超融合一体机 oracle,oracle的pca私有云一体机超融合解决之道.pdf
  7. 解决“Could not find @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol“问题
  8. centos7几种版本x86_64、aarch64、armhfp、i386、power9、ppc64、ppc64el简单说明
  9. 【数据库管理】数据库自动维护任务介绍
  10. python基础教程读书笔记_《Python基础教程》 读书笔记 第五章(下)循环语句