【ThreadX全家桶】STM32CubeMX+NetX Duo(一)


前言

本教程基于STM32CubeMX生成的HAL库,开发NetX Duo驱动程序。
NetX Duo驱动中关于ETH的使用,主要有7个方面:
1、ETH控制器初始化
2、TX描述符初始化
3、数据发送
4、数据发送后,NetX的有关后续处理
5、RX描述符初始化
6、中断接收
7、中断接收后,NetX的有关后续处理


提示:以下是本篇文章正文内容,下面案例可供参考

一、HAL与NetX发送逻辑对比

1、HAL库TX初始化及发送

①初始化:将TX描述符首尾链接起来,形成链表。
②初始化:每一个节点挂接一个BUFF,长度固定为ETH_TX_BUF_SIZE。(注:TX_BUFF是一个连续的大BUFF)
③发送:在TX_BUFF起始地址填充长度为length的帧内容。
④发送:根据length/ETH_TX_BUF_SIZE计算需要占用几个描述符,进行相应的设置。
⑤发送:将使用的描述符的所有权设为DMA所有,等待DMA发送完成后会自动将描述符所有权归还给CPU。
在这里插入图片描述

2、NetX的TX初始化及发送

NETX协议栈产出的帧并不是放在一个buff中,而是存储在NX_PACK链表中。因为NX_PACK结构体含有其他信息,所以不能直接将NX_PACK链表放到HAL的TX_BUFF中。
①初始化:将TX描述符首尾链接起来,形成链表(初始化时不挂接BUFF)。
在这里插入图片描述

②发送:将NX_PACK链表中每个节点指向的包指针赋值给相应描述符的Buffer1Addr。
③发送:根据NX_PACK链表节点数量计算需要占用几个描述符,进行相应的设置,并且最后一个描述符设置“完成时中断”标志。
④发送:将使用的描述符的所有权设为DMA所有,等待DMA发送完成后会自动将描述符所有权归还给CPU,并产生一次中断。
在这里插入图片描述

3、NetX的TX发送完成后包释放

①HAL中没有关于数据发送完成后的后续处理。
②NETX在帧发送完成后,需要释放存储帧的NX_PACK链表到包池中。

二、HAL与NetX接收逻辑对比

1、HAL库RX初始化及接收

①RX初始化与TX初始化类似,但是在初始化时将所有的RX描述符所有权设置为DMA所有。
②当ETH收到数据时,设置相应的RX描述符状态,将其所有权归还给CPU,并产生中断。
③中断接收函数分析描述符状态,在ETH控制字中保存该帧的头部描述符、结尾描述符、帧长度、帧起始地址(即头部描述符的Buffer1Addr),以供后续处理。

2、NetX的RX初始化及发送

①初始化:将RX描述符首尾链接起来,形成链表。
②初始化:使用nx_packet_pool_create函数,从包池中申请一个NX_PACK,将该结构体中的包地址、包长度赋值给RX描述符,并将描述符的所有权设置为DMA所有。
③初始化:重复申请,直至为所有描述符都分配到NX_PACK。此时所有NX_PACK 的 nx_packet_next都指向NX_NULL。
④接收:当ETH收到数据时,设置相应的RX描述符状态,将其所有权归还给CPU,并产生中断。
⑤接收:中断接收函数分析描述符状态,在ETH控制字中保存该帧的头部描述符、结尾描述符、帧长度、帧起始地址(即头部描述符的Buffer1Addr)。
在这里插入图片描述

3、NetX的RX发送完成后包释放

HAL没有关于帧接收完成后的后续处理,不做过多讨论。下面主要讲述NetX接收完成后的后续处理。
①头部描述符对应的NX_PACK_01 的 nx_pack_next指向下一个描述符对应的NX_PACK地址,即NX_PACK_02地址。
②重复步骤1,直至到结尾描述符对应的NX_PACK。此时形成了一条NX_PACK链表,该链表中保存这接收到的帧。
在这里插入图片描述
③因为保存着帧数据的NX_PACK链表需要传递给NetX协议栈处理,不能继续接收数据。所以需要给其对应的描述符分配新的NX_PACK,操作过程与“NetX的RX初始化及发送”小结的步骤②③相同。分配完成后如下图所示,此时保存帧的NX_PACK链表已经独立。
在这里插入图片描述
④将NX_PACK根据类型,出入相应的NetX API即可,NetX处理完成后会自动释放该链表。


总结

HAL提供的API,其TX与RX的缓存区为一段连续的buff,以参数length计算出发送需要使用多少个TX描述符,接收时需要从RX_BUFF中读取多长的数据。
NetX Duo将帧数据保存在NX_PACK链表中,以 NX_PACK 的 nx_pack_next 指向 NX_NULL 作为结尾包。其帧参数特性与HAL完全不同,所以需要针对HAL中关于帧拆包/组包的逻辑进行重构。

版权声明:本文为CSDN博主「药岩&云芝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mdzz6666/article/details/121669816

生成海报
点赞 0

药岩&云芝

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

实验一 stm32F407VETx点亮流水灯

二、设计指标 使电路板上的8个LED轮流点亮,并按键控制点亮速度。 三、操作 1、CubeMX操作 1.1依据开发板LED引脚设置CubeMX中8个LED的引脚为GPIO_Output模式, 2、按键设置

基于单片机的智能家居控制系统

设计简介: 本设计是基于单片机的智能家居控制系统,主要实现以下功能: 可通过DS18B20实时测量环境温度温度具有上下限,自动模式下温度超出限值,GMS发送短信温度上下限

什么是串口通讯

串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。 典型的串口通信使用3根线完成,分别是地线