硬汉嵌入式论坛

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

[ThreadX全家桶] stm32H7xx 移植 Netx Dou 失败【10楼,可以ping了】

  [复制链接]

4

主题

25

回帖

42

积分

新手上路

积分
42
QQ
发表于 2020-9-9 18:50:34 | 显示全部楼层 |阅读模式
捣鼓了几天还是没成功。   官方的dhcp_client例子,刚刚收到路由器分配的IP地址,马上就进入HardFault_Handler。     问题应该出在static VOID         _nx_driver_hardware_packet_received(VOID); ,  这个函数是真的麻烦。  不想努力了, 有没有哪位大佬发下成功例子啊!
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-9-9 20:13:31 | 显示全部楼层
固定IP的楼主搞定了?先发出来看看啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-9-10 10:03:30 | 显示全部楼层
后面我来发。

当前V5和V6的NETX已经做好了,V7的我这里有也稍有点问题,后面腾出时间整好了,发给大家玩。
回复

使用道具 举报

4

主题

25

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2020-9-10 10:04:41 | 显示全部楼层
但是几下就死机了,不知道问题出在哪?
回复

使用道具 举报

4

主题

25

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2020-9-10 10:09:01 | 显示全部楼层
分享一下驱动文件         

h7 netx.zip

19.47 KB, 下载次数: 60

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-9-10 10:49:48 | 显示全部楼层
固定IP正常吗
回复

使用道具 举报

4

主题

25

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2020-9-10 10:53:18 | 显示全部楼层
不正常啊,  ping不通啊······   特别容易 进入HardFault_Handler, tx_pool和rx_pool也没爆啊。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-9-10 14:31:45 | 显示全部楼层
blmy1861 发表于 2020-9-10 10:53
不正常啊,  ping不通啊······   特别容易 进入HardFault_Handler, tx_pool和rx_pool也没爆啊。

估计看是不是底层驱动有问题呀 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-9-11 06:04:55 | 显示全部楼层
blmy1861 发表于 2020-9-10 10:53
不正常啊,  ping不通啊······   特别容易 进入HardFault_Handler, tx_pool和rx_pool也没爆啊。

大概率底层没有修改好,论坛一个坛友整好了,忘了让他分享下。
回复

使用道具 举报

4

主题

25

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2020-9-11 08:26:18 | 显示全部楼层

stm32H7xx 移植 Netx Dou ping通了

经过一番努力,找到了BUG点改了驱动,现在可以PING了,DHCP也正常,也没进入HardFault_Handler,还没完善好。
123.png

nx_driver_stm32h7xx.c

122.04 KB, 下载次数: 52

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-9-11 10:00:22 | 显示全部楼层
blmy1861 发表于 2020-9-11 08:26
经过一番努力,找到了BUG点改了驱动,现在可以PING了,DHCP也正常,也没进入HardFault_Handler,还没完善好 ...

整个cool,支持下楼主的工作
回复

使用道具 举报

4

主题

25

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2020-9-11 11:14:41 | 显示全部楼层
改了下程序 NX_DRIVER_ENABLE_DEFERRED 好像可以用了,对CACHE理解不够深。SCB_EnableDCache()不能开,我还是去看看硬汉的CACHE教程先。。。
22.png
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-9-11 14:23:10 | 显示全部楼层
blmy1861 发表于 2020-9-11 08:26
经过一番努力,找到了BUG点改了驱动,现在可以PING了,DHCP也正常,也没进入HardFault_Handler,还没完善好 ...

大 牛哇,这个严重支持哟
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-9-11 19:17:56 | 显示全部楼层
楼主能说说后面都改了啥嘛,方便大家一起入门啊
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-9-11 19:26:09 | 显示全部楼层
感谢楼主的分享
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-12-2 08:59:52 | 显示全部楼层
blmy1861 发表于 2020-9-11 08:26
经过一番努力,找到了BUG点改了驱动,现在可以PING了,DHCP也正常,也没进入HardFault_Handler,还没完善好 ...

我貌似捣鼓了一下,貌似 可以 开启 D-Cache  了
使用 mdk ac6

配置如下:

ETH_DMADescTypeDef  DMARxDscrTab[NX_DRIVER_RX_DESCRIPTORS] __attribute__((section(".ARM.__at_0x30040000")));                                                                                               
ETH_DMADescTypeDef  DMATxDscrTab[NX_DRIVER_TX_DESCRIPTORS] __attribute__((section(".ARM.__at_0x30040060")));                       



void MPU_Config( void )
{
        MPU_Region_InitTypeDef MPU_InitStruct = {0};

        /* 禁止 MPU */
        HAL_MPU_Disable();


  /* Configure the MPU attributes as Device not cacheable
     for ETH DMA descriptors */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x30040000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;  //MPU_ACCESS_BUFFERABLE
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER4;             //配置为 1 区类型 ,fmc 扩展 io 貌似不工作
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;             //配置为 1 区类型 ,fmc 扩展 io 貌似不工作,目前只能配置0
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);


  /* Configure the MPU attributes as Cacheable write through
     for LwIP RAM heap which contains the Tx buffers */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x30044000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;      //MPU_ACCESS_CACHEABLE
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER5;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;   //这个必须设置为 0
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);


        /*使能 MPU */
        HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

}

运行一会后的图片如下:
0002.jpg

这个运行一会后貌似就会出现 transmitted error ,不过此时还是可以继续 ping 通的

-----------------------------------------------------------------------------------------------------------------------
// 刚开始的图片如下:
0001.jpg







回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2020-12-22 10:49:25 | 显示全部楼层
首先感谢楼主提供的驱动和源文件
我自己在我司的H743平台上试着搭建了一下
现在还有些问题想看看有没有知道咋解决,我暂时没啥头绪了

1. 网卡初始化能够通过,协议栈和系统也都跑起来了没有死机
串口能够打印出以下信息
LAN8720 LINK UP.
MACCR=3800e000.
_nx_driver_hardware_initialize OK.


2. 能够ping,但是成功率很低,而且ping的过程中和结束后一直打印rx_pool allocate error!
注释为
分配内存失败--POOL不够大
屏幕截图 2020-12-22 104352.jpg


  1. static VOID  _nx_driver_hardware_packet_received(VOID)
  2. {

  3.         ETH_BufferTypeDef RxBuff;
  4.   uint32_t framelength=0, cnt, status=0;
  5.         NX_PACKET     *received_packet_ptr;
  6.         NX_PACKET     *packet_ptr;
  7.        
  8.         /*for(idx=0; idx<ETH_RX_DESC_CNT-1; idx++)
  9.         {
  10.                 RxBuff[idx].next = &RxBuff[idx+1];
  11.         }
  12.        
  13.         RxBuff[ETH_RX_DESC_CNT-1].next = &RxBuff[0];*/
  14.        
  15.         // 对于HAL_ETH_GetRxDataBuffer函数 ST库有介绍
  16.         // 应该先调用HAL_ETH_GetRxDataLength,得到BUFF的数据
  17.         // 然后对RxBuff分配内存大小,对RxBuff初始化(链型结构)
  18.         // 在调用HAL_ETH_GetRxDataBuffer函数,ST在移植LWIP时没有这么做
  19.         // 因为ST移植的程序不会出现一次收到2个以上的BUFF。
  20.         // 如果收到多个BUFF,这个函数要改动
  21.        
  22.         memset(&RxBuff, 0 , sizeof(ETH_BufferTypeDef));
  23.        
  24.         if(HAL_ETH_GetRxDataBuffer(&EthHandle, &RxBuff) == HAL_OK)
  25.   {
  26.     HAL_ETH_GetRxDataLength(&EthHandle, &framelength);

  27.     /* Invalidate data cache for ETH Rx Buffers */
  28.     SCB_InvalidateDCache_by_Addr((uint32_t *)RxBuff.buffer, framelength);       

  29.                 cnt = EthHandle.RxDescList.FirstAppDesc;                // 用户第一个描述符
  30.                
  31.                 if(EthHandle.RxDescList.AppDescNbr != 1)
  32.                 {
  33.                         printf("RxDataBuffer !=1 error!\r\n");
  34.                 }
  35.                
  36.                 //printf("rx: buffer=0x%x, len=0x%x cn=%d", (uint32_t)RxBuff.buffer, RxBuff.len, cnt);
  37.                 //printf("rx_pool 0x%x, tx_pool 0x%x", rx_pool.nx_packet_pool_available_list->nx_packet_data_end, \
  38.                                                                         //tx_pool.nx_packet_pool_available_list->nx_packet_data_end);
  39.                
  40.                 // 保存用户描述符
  41.                 received_packet_ptr = nx_driver_information.nx_driver_information_receive_packets[cnt];

  42.                 // 重新分配一个新的BUFF给DMA描述符
  43.                 if (nx_packet_allocate(nx_driver_information.nx_driver_information_packet_pool_ptr, &packet_ptr,
  44.                                                                                                                                                                         NX_RECEIVE_PACKET, NX_NO_WAIT) == NX_SUCCESS)
  45.                 {
  46.                         // Adjust the packet.  
  47.                         packet_ptr -> nx_packet_prepend_ptr += 2;
  48.                
  49.                         // Remember the receive packet poitner.  
  50.                         nx_driver_information.nx_driver_information_receive_packets[cnt] =  packet_ptr;
  51.                        
  52.                         // 初始化RX描述符指针
  53.                         HAL_ETH_DescAssignMemory(&EthHandle, cnt, (uint8_t*)(packet_ptr -> nx_packet_prepend_ptr), NULL);       

  54.                         SCB_InvalidateDCache_by_Addr((uint32_t*)packet_ptr -> nx_packet_data_start,
  55.                                                                                                                                                 packet_ptr -> nx_packet_data_end - packet_ptr -> nx_packet_data_start);
  56.                 }
  57.                 else
  58.                 {
  59.                         // 分配内存失败--POOL不够大
  60.                         printf("rx_pool allocate error!\r\n");
  61.                        
  62.                         status = 1;
  63.                 }
  64.                
  65.                 // Build Rx descriptor to be ready for next data reception
  66.                 HAL_ETH_BuildRxDescriptors(&EthHandle);
  67.                
  68.                
  69.                 // 内存不足,扔掉数据 netx接收到数据,处理完最后会释放它,DMX描述符指向NULL的话-------HardFault_Handler见
  70.                 if(!status)
  71.                 {
  72.                         received_packet_ptr -> nx_packet_next = NX_NULL;
  73.                         received_packet_ptr -> nx_packet_length = RxBuff.len-4; //去掉4位CRC检验码
  74.                         received_packet_ptr -> nx_packet_append_ptr = received_packet_ptr->nx_packet_prepend_ptr
  75.                                                                                                                                                                                                                 + received_packet_ptr -> nx_packet_length;
  76.                         received_packet_ptr -> nx_packet_prepend_ptr = RxBuff.buffer;       
  77.                        
  78.                         _nx_driver_transfer_to_netx(nx_driver_information.nx_driver_information_ip_ptr, received_packet_ptr);
  79.                 }
  80.   }
  81. }
复制代码
虽然我按照楼主说的
sram3  0x30040000  32K内存分配  1K-描述符  15K-RX_POOL        16K-TX_POOL(还是netx的内存池)分配了sram3
屏幕截图 2020-12-22 104724.jpg
但是它还是串口打印报错说分配内存失败--POOL不够大不知道为啥


暂时不知道怎么继续调下去了。。。。。
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2020-12-22 14:56:52 | 显示全部楼层
继续折腾了一下,可以ping成功了,但是效果不够稳定,还是容易掉
屏幕截图 2020-12-22 144923.jpg
修改点:
1. MPU
保护区域覆盖描述符和后面的收发缓冲区
  1. static void MPU_Config( void )
  2. {
  3.         MPU_Region_InitTypeDef MPU_InitStruct;

  4.         /* 禁止 MPU */
  5.         HAL_MPU_Disable();

  6.     /* 最高性能,读Cache和写Cache都开启 */
  7.            /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
  8.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
  9.         MPU_InitStruct.BaseAddress      = 0x24000000;
  10.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
  11.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  12.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
  13.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
  14.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
  15.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
  16.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
  17.         MPU_InitStruct.SubRegionDisable = 0x00;
  18.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

  19.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
  20. //NetX MPU保护描述符
  21.   MPU_InitStruct.Enable                                         = MPU_REGION_ENABLE;
  22.   MPU_InitStruct.BaseAddress                         = 0x30040000;
  23.   MPU_InitStruct.Size                                                 = MPU_REGION_SIZE_1KB;
  24.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  25.   MPU_InitStruct.IsBufferable                 = MPU_ACCESS_BUFFERABLE;
  26.   MPU_InitStruct.IsCacheable                         = MPU_ACCESS_NOT_CACHEABLE;
  27.   MPU_InitStruct.IsShareable                         = MPU_ACCESS_NOT_SHAREABLE;
  28.   MPU_InitStruct.Number                                         = MPU_REGION_NUMBER1;
  29.   MPU_InitStruct.TypeExtField                 = MPU_TEX_LEVEL0;
  30.   MPU_InitStruct.SubRegionDisable = 0x00;
  31.   MPU_InitStruct.DisableExec                         = MPU_INSTRUCTION_ACCESS_ENABLE;
  32.   HAL_MPU_ConfigRegion(&MPU_InitStruct);


  33.   //保护收发缓冲区
  34.   MPU_InitStruct.Enable                                         = MPU_REGION_ENABLE;
  35.   MPU_InitStruct.BaseAddress                         = 0x30040400;
  36.   MPU_InitStruct.Size                                                 = MPU_REGION_SIZE_32KB;
  37.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  38.   MPU_InitStruct.IsBufferable                 = MPU_ACCESS_NOT_BUFFERABLE;
  39.   MPU_InitStruct.IsCacheable                         = MPU_ACCESS_CACHEABLE;
  40.   MPU_InitStruct.IsShareable                         = MPU_ACCESS_NOT_SHAREABLE;
  41.   MPU_InitStruct.Number                                         = MPU_REGION_NUMBER3;
  42.   MPU_InitStruct.TypeExtField                 = MPU_TEX_LEVEL1;
  43.   MPU_InitStruct.SubRegionDisable = 0x00;
  44.   MPU_InitStruct.DisableExec                         = MPU_INSTRUCTION_ACCESS_ENABLE;
  45.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  46.         /*使能 MPU */
  47.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  48. }
复制代码
2. NetX的接收函数
我自己觉得原来楼主那个接收处理写的不够完善,我把它稍微完善了下,可能还是有问题,但是起码ping成功的机率高了
  1. static VOID _nx_driver_hardware_packet_received(VOID)
  2. {

  3.     ETH_BufferTypeDef RxBuff;
  4.     uint32_t framelength = 0, cnt, status = 0;
  5.     NX_PACKET *received_packet_ptr;
  6.     NX_PACKET *packet_ptr;

  7. //        for(idx=0; idx<ETH_RX_DESC_CNT-1; idx++)
  8. //        {
  9. //                RxBuff[idx].next = &RxBuff[idx+1];
  10. //        }
  11. //
  12. //        RxBuff[ETH_RX_DESC_CNT-1].next = &RxBuff[0];

  13.     // 对于HAL_ETH_GetRxDataBuffer函数 ST库有介绍
  14.     // 应该先调用HAL_ETH_GetRxDataLength,得到BUFF的数据
  15.     // 然后对RxBuff分配内存大小,对RxBuff初始化(链型结构)
  16.     // 在调用HAL_ETH_GetRxDataBuffer函数,ST在移植LWIP时没有这么做
  17.     // 因为ST移植的程序不会出现一次收到2个以上的BUFF。
  18.     // 如果收到多个BUFF,这个函数要改动

  19.     memset(&RxBuff, 0, sizeof(ETH_BufferTypeDef));
  20.     SCB_CleanInvalidateDCache ();
  21.     if (HAL_ETH_IsRxDataAvailable(&EthHandle))
  22.     {
  23.         if (HAL_ETH_GetRxDataBuffer(&EthHandle, &RxBuff) == HAL_OK)
  24.         {
  25.             HAL_ETH_GetRxDataLength(&EthHandle, &framelength);

  26.             /* Invalidate data cache for ETH Rx Buffers */
  27.             SCB_InvalidateDCache_by_Addr((uint32_t*) RxBuff.buffer, framelength);

  28.             cnt = EthHandle.RxDescList.FirstAppDesc;        // 用户第一个描述符

  29.             if (EthHandle.RxDescList.AppDescNbr != 1)
  30.             {
  31.                 printf("RxDataBuffer !=1 error!\r\n");
  32.             }

  33.             //        printf("rx: buffer=0x%x, len=0x%x cn=%d\r\n", (uint32_t) RxBuff.buffer, RxBuff.len, cnt);
  34.             //        printf("rx_pool 0x%x, tx_pool 0x%x\r\n", rx_pool.nx_packet_pool_available_list->nx_packet_data_end,
  35.             //                tx_pool.nx_packet_pool_available_list->nx_packet_data_end);

  36.             // 保存用户描述符
  37.             received_packet_ptr = nx_driver_information.nx_driver_information_receive_packets[cnt];

  38.             // 重新分配一个新的BUFF给DMA描述符
  39.             UINT ret = nx_packet_allocate(nx_driver_information.nx_driver_information_packet_pool_ptr, &packet_ptr,
  40.             NX_RECEIVE_PACKET, NX_NO_WAIT);
  41.             if (ret == NX_SUCCESS)
  42.             {
  43.                 // Adjust the packet.
  44.                 packet_ptr->nx_packet_prepend_ptr += 2;

  45.                 // Remember the receive packet poitner.
  46.                 nx_driver_information.nx_driver_information_receive_packets[cnt] = packet_ptr;

  47.                 // 初始化RX描述符指针
  48.                 HAL_ETH_DescAssignMemory(&EthHandle, cnt, (uint8_t*) (packet_ptr->nx_packet_prepend_ptr), NULL);
  49.                 // Build Rx descriptor to be ready for next data reception
  50.                 HAL_ETH_BuildRxDescriptors(&EthHandle);
  51.                 SCB_InvalidateDCache_by_Addr((uint32_t*) packet_ptr->nx_packet_data_start, packet_ptr->nx_packet_data_end - packet_ptr->nx_packet_data_start);
  52.             }
  53.             else if (ret != NX_NO_PACKET)
  54.             {
  55.                 // 分配内存失败--POOL不够大
  56.                 printf("rx_pool allocate error!\r\n");

  57.                 status = 1;
  58.             }

  59.             // 内存不足,扔掉数据 netx接收到数据,处理完最后会释放它,DMX描述符指向NULL的话-------HardFault_Handler见
  60.             if (!status)
  61.             {
  62.                 received_packet_ptr->nx_packet_next = NX_NULL;
  63.                 received_packet_ptr->nx_packet_length = RxBuff.len - 4; //去掉4位CRC检验码
  64.                 received_packet_ptr->nx_packet_append_ptr = received_packet_ptr->nx_packet_prepend_ptr + received_packet_ptr->nx_packet_length;
  65.                 received_packet_ptr->nx_packet_prepend_ptr = RxBuff.buffer;

  66.                 _nx_driver_transfer_to_netx(nx_driver_information.nx_driver_information_ip_ptr, received_packet_ptr);
  67.             }
  68.         }
  69.     }

  70. }
复制代码
主要是加了个前置判断和对应的故障码判断
看看还有谁有更好的优化方法没~~~


回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-12-22 17:29:58 | 显示全部楼层
shitang250 发表于 2020-12-22 14:56
继续折腾了一下,可以ping成功了,但是效果不够稳定,还是容易掉

修改点:

你把描述符改成这样试试看看

#pragma pack(4)   /*4字节对齐 兼容性非常好 */
ETH_DMADescTypeDef  DMARxDscrTab[NX_DRIVER_RX_DESCRIPTORS] __attribute__((section(".ARM.__at_0x30040000")));
#pragma pack()   /*取消字节对齐 兼容性非常好 */

#pragma pack(4)   /*4字节对齐 兼容性非常好 */
ETH_DMADescTypeDef  DMATxDscrTab[NX_DRIVER_TX_DESCRIPTORS] __attribute__((section(".ARM.__at_0x30040060")));       
#pragma pack()   /*取消字节对齐 兼容性非常好 */



mpu 改成如下:

        MPU_InitStruct.Enable = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress = 0x30040000;
        MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable  = MPU_ACCESS_NOT_CACHEABLE;
        MPU_InitStruct.IsShareable  = MPU_ACCESS_SHAREABLE;
        MPU_InitStruct.Number = MPU_REGION_NUMBER4;
        MPU_InitStruct.SubRegionDisable = 0x0;
        MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
        MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
        HAL_MPU_ConfigRegion(&MPU_InitStruct);

回复

使用道具 举报

4

主题

25

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2020-12-22 19:01:56 | 显示全部楼层
当时改了点东西,后来有人说测试会丢包,你们看看还有什么问题

nx_driver_stm32h7xx v1.1.c

125.59 KB, 下载次数: 4

回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-12-22 22:02:36 | 显示全部楼层
回复

使用道具 举报

1

主题

75

回帖

78

积分

初级会员

积分
78
发表于 2020-12-23 09:04:03 | 显示全部楼层
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2020-12-23 09:18:13 | 显示全部楼层
blmy1861 发表于 2020-12-22 19:01
当时改了点东西,后来有人说测试会丢包,你们看看还有什么问题

好的,我再用你的驱动试试看
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2020-12-23 10:35:06 | 显示全部楼层
blmy1861 发表于 2020-12-22 19:01
当时改了点东西,后来有人说测试会丢包,你们看看还有什么问题

老哥,你的代码可以的,目前ping小半个钟,数据量随机,间隔1s的情况下稳定的,但是间隔快了【譬如500ms以下】ping久了以后就容易掉,甚至连不上了
回复

使用道具 举报

4

主题

25

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2020-12-23 11:22:13 | 显示全部楼层
shitang250 发表于 2020-12-23 10:35
老哥,你的代码可以的,目前ping小半个钟,数据量随机,间隔1s的情况下稳定的,但是间隔快了【譬如500ms ...

上ST官方的驱动吧
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2020-12-23 14:07:30 | 显示全部楼层
blmy1861 发表于 2020-12-23 11:22
上ST官方的驱动吧

好的,准备下下来看一看
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2020-12-23 17:57:54 | 显示全部楼层
blmy1861 发表于 2020-12-23 11:22
上ST官方的驱动吧

官方的例子的驱动效果目前感觉很好,无间隔,数据量随机ping,我测了半个钟这样,没有问题,原来完全不行。。。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-12-23 21:21:14 | 显示全部楼层
shitang250 发表于 2020-12-23 17:57
官方的例子的驱动效果目前感觉很好,无间隔,数据量随机ping,我测了半个钟这样,没有问题,原来完全不行 ...

我刚刚也捣鼓了一下 st 官方的历程驱动,貌似不行,

你们移植 st 官方的驱动有没有修改哪里 ??

比如 描述符的 地址定义等 ?
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2020-12-23 23:03:52 | 显示全部楼层
hpdell 发表于 2020-12-23 21:21
我刚刚也捣鼓了一下 st 官方的历程驱动,貌似不行,

你们移植 st 官方的驱动有没有修改哪里 ??

我描述符,链接是按照这个帖子楼主的做法做的,我没有完全按官方的做法做,驱动和系统接口是按照ST官方例子做的
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-12-24 09:00:20 | 显示全部楼层
shitang250 发表于 2020-12-23 23:03
我描述符,链接是按照这个帖子楼主的做法做的,我没有完全按官方的做法做,驱动和系统接口是按照ST官方例 ...

终于捣鼓成功了 啊,原来是自己 马虎了,忘记了增加 io 口初始化及中断入口函数

现在可以正常 使用 udp , tcp 接口的 服务器端/客户端都可以正常连接工作,目前就唯独不能够 ping 了

ping 完全不通,有点搞不懂了是怎么回事
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 02:59 , Processed in 0.266201 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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