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

编程入门 行业动态 更新时间:2024-10-06 15:30:32

【ThreadX<a href=https://www.elefans.com/category/jswz/34/1770131.html style=全家桶】STM32CubeMX+NetX Duo(一)"/>

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

文章目录

  • 前言
  • 一、HAL与NetX发送逻辑对比
    • 1、HAL库TX初始化及发送
    • 2、NetX的TX初始化及发送
    • 3、NetX的TX发送完成后包释放
  • 二、HAL与NetX接收逻辑对比
    • 1、HAL库RX初始化及接收
    • 2、NetX的RX初始化及发送
    • 3、NetX的RX发送完成后包释放
  • 总结


前言

本教程基于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中关于帧拆包/组包的逻辑进行重构。

更多推荐

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

本文发布于:2024-02-28 11:27:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769380.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:全家   ThreadX   STM32CubeMX   Duo   NetX

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!