硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5002|回复: 29
收起左侧

[以太网] STM32H7新版HAL库1.11以太网驱动将HAL库API换了,这给软件升级带来极大的不便

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2023-12-19 10:22:42 | 显示全部楼层 |阅读模式


之前是这两个:

[C] 纯文本查看 复制代码
    while (HAL_ETH_GetRxDataBuffer(&heth, RxBuff) == HAL_OK)
    {
        HAL_ETH_GetRxDataLength(&heth, &framelength);



现在换成了这个,函数HAL_ETH_GetRxDataLength没有了

[C] 纯文本查看 复制代码
  while (HAL_ETH_ReadData(ð_handle, (void **)&received_packet_ptr) == HAL_OK)
  {





回复

使用道具 举报

14

主题

260

回帖

302

积分

高级会员

积分
302
发表于 2023-12-19 10:30:50 | 显示全部楼层
这是自动帮你申请空间吗?空间不够咋办?
回复

使用道具 举报

4

主题

192

回帖

204

积分

高级会员

积分
204
发表于 2023-12-19 10:39:47 | 显示全部楼层
长度在回调里有
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2023-12-19 10:41:47 | 显示全部楼层
不知道他们为何需要更换这些函数啊 ?

难道是新版本的使用方面上会更好吗 ??

还是他们吧底层的驱动也有相应的修改 ??
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2023-12-19 10:42:56 | 显示全部楼层
看来用HAL还是无法完全解决兼容的问题
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2023-12-19 10:59:17 | 显示全部楼层
zhang0352505 发表于 2023-12-19 10:30
这是自动帮你申请空间吗?空间不够咋办?

对,手动分配空间。

/**
  \brief       Rx Allocate callback.
  \param[in]   buff  pointer to allocated buffer
  \return      None
*/
void HAL_ETH_RxAllocateCallback(uint8_t **buff) {
  /* Allocate one of the RX-DMA buffers sequentially */
  *buff = &Rx_Buff[Emac.alloc_idx][ETH_MAX_PACKET_SIZE];
  if (++Emac.alloc_idx >= ETH_RX_DESC_CNT) {
    Emac.alloc_idx = 0;
  }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2023-12-19 10:59:48 | 显示全部楼层
fyyxxm 发表于 2023-12-19 10:39
长度在回调里有

对,在回调里面了

[C] 纯文本查看 复制代码
/**
  \brief       Rx Link callback.
  \param[in]   pStart  pointer to packet start
  \param[in]   pStart  pointer to packet end
  \param[in]   buff    pointer to received data
  \param[in]   Length  received data length
  \return      None
*/
void HAL_ETH_RxLinkCallback(void **pStart, void **pEnd, uint8_t *buff, uint16_t Length) {
  (void)pStart;
  (void)pEnd;

  Emac.rx_buf.buffer = buff;
  Emac.rx_buf.len    = Length;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2023-12-19 11:00:25 | 显示全部楼层
hpdell 发表于 2023-12-19 10:41
不知道他们为何需要更换这些函数啊 ?

难道是新版本的使用方面上会更好吗 ??

实现方式做了修改,导致API都换了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2023-12-19 11:01:18 | 显示全部楼层
庄永 发表于 2023-12-19 10:42
看来用HAL还是无法完全解决兼容的问题

HAL库修改比较随意,几乎没有考虑过兼容问题。
回复

使用道具 举报

3

主题

78

回帖

87

积分

初级会员

积分
87
发表于 2023-12-19 14:29:57 | 显示全部楼层
F4的也改了,硬件驱动的数据结构直接砍掉一半,
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
发表于 2023-12-19 21:18:10 | 显示全部楼层
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2023-12-19 22:36:21 | 显示全部楼层
eric2013 发表于 2023-12-19 11:01
HAL库修改比较随意,几乎没有考虑过兼容问题。

初看在不同芯片上对应的API是一样的,代码复用性应该还不错,我还以为兼容性也不还不错
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2023-12-20 11:15:33 | 显示全部楼层
eric2013 发表于 2023-12-19 11:00
实现方式做了修改,导致API都换了。

貌似太不像话了呀  
回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2023-12-20 11:29:07 | 显示全部楼层
这样看因为LL库是直接和寄存器打交道,没那么多结构体,反而改动最小
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2023-12-20 11:33:09 | 显示全部楼层
Dazen35 发表于 2023-12-20 11:29
这样看因为LL库是直接和寄存器打交道,没那么多结构体,反而改动最小

以太网没有LL库。
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2023-12-20 13:18:00 | 显示全部楼层
Dazen35 发表于 2023-12-20 11:29
这样看因为LL库是直接和寄存器打交道,没那么多结构体,反而改动最小

Flash之类的是没有LL库的,只有hal库。LL库的缺点就是stm32不同系列西片外设寄存器都有差异,换芯片就得重新写代码。高级一点的外设要么用hal库要么照着hal库重写,效率不高
回复

使用道具 举报

4

主题

192

回帖

204

积分

高级会员

积分
204
发表于 2023-12-20 17:34:04 | 显示全部楼层
eric2013 发表于 2023-12-19 10:59
对,手动分配空间。

/**

HAL_ETH_RxAllocateCallback
这个必须要有的吗?必须要给rx malloc一块空间?
回复

使用道具 举报

5

主题

53

回帖

68

积分

初级会员

积分
68
发表于 2023-12-21 14:25:42 | 显示全部楼层
速度快一点不多,但是实现上麻烦很多,总不能在中断回调里面动态申请内存,就只能做一个专用于以太网的空内存块链表,耗费空间.
我改完之后还是搞回来了旧版本的.
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2023-12-21 15:24:56 | 显示全部楼层
fyyxxm 发表于 2023-12-20 17:34
HAL_ETH_RxAllocateCallback
这个必须要有的吗?必须要给rx malloc一块空间?

我看的这个是CMSIS Driver里面得H7驱动,他这里搞了这个接口函数使用。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-7-24 13:17:28 | 显示全部楼层
H743的以太网描述符是不是没有链式结构,只有环式结构的,对比了F7和H7,H7里面手册里只是讲了环状结构(一个描述符指向两个buffer)

而且H7和F7里有些寄存器也不一样了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2024-7-25 11:13:53 | 显示全部楼层
William_Chen 发表于 2024-7-24 13:17
H743的以太网描述符是不是没有链式结构,只有环式结构的,对比了F7和H7,H7里面手册里只是讲了环状结构(一 ...

好像一直都是环形的。
回复

使用道具 举报

12

主题

53

回帖

89

积分

初级会员

面霸

积分
89
发表于 2024-7-26 21:34:11 来自手机 | 显示全部楼层
H7中PCD外设和USB设备库,这两个有变化吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2024-7-27 07:58:20 | 显示全部楼层
1350280419 发表于 2024-7-26 21:34
H7中PCD外设和USB设备库,这两个有变化吗

这个变化不大。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-8-9 10:23:17 | 显示全部楼层
对比了下1.11和之前1.10以太网的hal库程序,还是之前的逻辑清晰些,每一步干什么都很明确,新的这个想在input地方直接一个read_data搞定,但还是要自己写RxAllocateCallback和RxLinkCallback回调,里面的处理逻辑感觉比之前复杂很多
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2024-8-9 16:15:35 | 显示全部楼层
William_Chen 发表于 2024-8-9 10:23
对比了下1.11和之前1.10以太网的hal库程序,还是之前的逻辑清晰些,每一步干什么都很明确,新的这个想在inp ...

貌似现在的 hal 库封装的更加保密了呀, 就像 当年 使用 st 的 i2c hal 库,刚开始 基本都是 按照 i2c 的标准协议做的封装,每个对应的函数都可以找到,自己也可以根据需要自己调用 hal 里面的 一些相关的函数进行封装 代码,

但是到了 h7 上,这个 i2c 封装就完全不按套路走了,自己想 重新封装适合自己的驱动函数都不行了,因为改起来太费劲了

貌似他这是要 把 hal 底层完全保密化而做的前期铺垫喔


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2024-8-10 09:52:21 | 显示全部楼层
hpdell 发表于 2024-8-9 16:15
貌似现在的 hal 库封装的更加保密了呀, 就像 当年 使用 st 的 i2c hal 库,刚开始 基本都是 按照 i2c 的 ...

主要还是硬件I2C被设计的太难用了。只能复杂的代码来弥补。可能是这样。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-11-14 15:37:25 | 显示全部楼层
大佬您好,我最近刚开始弄h7的以太网通信,hal库的结构体封装好多层,实在捋不清,我想问一下,接收到的原始数据是存放在哪个变量了呢?(现在1.11的版本,网上其他地方的资料好少,实在没弄懂这个HAL_ETH_ReadData的api要怎么用)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2024-11-15 09:07:02 | 显示全部楼层
JSDB 发表于 2024-11-14 15:37
大佬您好,我最近刚开始弄h7的以太网通信,hal库的结构体封装好多层,实在捋不清,我想问一下,接收到的原 ...

以太网DMA接收缓冲里面。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-11-18 09:59:36 | 显示全部楼层
感谢答疑,我还有个疑问,关于下面这个结构体

[C] 纯文本查看 复制代码
typedef struct
{
  uint32_t RxDesc[ETH_RX_DESC_CNT];     /*<! Rx DMA descriptors addresses. */

  uint32_t ItMode;                      /*<! If 1, DMA will generate the Rx complete interrupt.
                                             If 0, DMA will not generate the Rx complete interrupt. */

  uint32_t RxDescIdx;                 /*<! Current Rx descriptor. */

  uint32_t RxDescCnt;                 /*<! Number of descriptors . */

  uint32_t RxDataLength;              /*<! Received Data Length. */

  uint32_t RxBuildDescIdx;            /*<! Current Rx Descriptor for building descriptors. */

  uint32_t RxBuildDescCnt;            /*<! Number of Rx Descriptors awaiting building. */

  uint32_t pRxLastRxDesc;             /*<! Last received descriptor. */

  ETH_TimeStampTypeDef TimeStamp;     /*<! Time Stamp Low value for receive. */

  void *pRxStart;                     /*<! Pointer to the first buff. */

  void *pRxEnd;                       /*<! Pointer to the last buff. */

} ETH_RxDescListTypeDef;


如果我想自己读以太网的数据的话,我可否直接通过读这个结构体里面的pRxStart和RxDataLength来读数据?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
 楼主| 发表于 2024-11-19 09:23:47 | 显示全部楼层
JSDB 发表于 2024-11-18 09:59
感谢答疑,我还有个疑问,关于下面这个结构体

[mw_shl_code=c,true]typedef struct

对,可以的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 05:23 , Processed in 0.074371 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表