硬汉嵌入式论坛

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

[以太网] tcpip报错,bu's fault

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2024-4-8 22:46:08 | 显示全部楼层 |阅读模式
本帖最后由 ampleeeeee 于 2024-4-8 22:49 编辑

psr: 0x01000044
r00: 0x2280824d
r01: 0x400204a0
r02: 0x006000c0
r03: 0x00000020
r04: 0x24000c48
r05: 0x240000a8
r06: 0x40020010
r07: 0x40020028
r08: 0x40020040
r09: 0x40020058
r10: 0x40020070
r11: 0x40020088
r12: 0x00000000
lr: 0xffffffed
pc: 0x08018134
hard fault on handler  bus fault:
SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:22808251


debug报错位置mem_init(void)
{
  struct mem *mem;

  LWIP_ASSERT("Sanity check alignment",
              (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT - 1)) == 0);

  ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
我搜索找问题像是内存不齐的原因
MPU配置,求各位大佬看看原因
void MPU_Config(void)
{
   MPU_Region_InitTypeDef MPU_InitStruct;
  
  /* Disable the 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_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  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_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
        
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x30020000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_128KB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  
  /* Enable the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

}

内存堆位置#define LWIP_RAM_HEAP_POINTER 0x30020000
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2024-4-9 08:41:09 | 显示全部楼层
H7的对齐问题,主要是这个。

石锤内存访问不支持非对齐是否STM32H7的硬件bug
https://www.armbbs.cn/forum.php?mod=viewthread&tid=94562
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-4-9 15:18:36 | 显示全部楼层
eric2013 发表于 2024-4-9 08:41
H7的对齐问题,主要是这个。

石锤内存访问不支持非对齐是否STM32H7的硬件bug

您好!参考了您的帖子,我将0x30020000的内存堆的mpu设置为以下模式,看来一下改为iNormal格式txe=1 其他的为零
  MPU_InitStruct.BaseAddress = 0x30020000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_128KB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
现在报错位置改了
hard fault on handler  bus fault:
SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:22908051
小白不太清楚什么原因,请问一下具体需要怎么改
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2024-4-10 08:20:19 | 显示全部楼层
ampleeeeee 发表于 2024-4-9 15:18
您好!参考了您的帖子,我将0x30020000的内存堆的mpu设置为以下模式,看来一下改为iNormal格式txe=1 其他 ...

现在是精度错误,你看下你的地址空间22908051做什么了
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-4-14 21:24:01 | 显示全部楼层
eric2013 发表于 2024-4-10 08:20
现在是精度错误,你看下你的地址空间22908051做什么了

您好,我解决了上述报错问题,注释掉内存堆#define LWIP_RAM_HEAP_POINTER 0x30020000这个然后mem定义为动态,但是我现在又遇到了问题,我会卡死在LAN8742INIT中,我用的是CUBEMX生成的ethernetif与lan8742.c文件,现在我debug也找不出问题。请问一下该怎么解决,我的芯片8720a,我看8720a与8742驱动一致,并且我也尝试了野火的8720a.c文件,同样是卡在init中。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2024-4-15 09:45:30 | 显示全部楼层
ampleeeeee 发表于 2024-4-14 21:24
您好,我解决了上述报错问题,注释掉内存堆#define LWIP_RAM_HEAP_POINTER 0x30020000这个然后mem定义为 ...

这个是不是你们新作的板子,有可能是芯片8720没有正常复位。访问失败。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-4-15 11:53:22 | 显示全部楼层
eric2013 发表于 2024-4-15 09:45
这个是不是你们新作的板子,有可能是芯片8720没有正常复位。访问失败。

不是,我用的是野火的板子,他的复位引脚接的是nrst。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2024-4-16 08:15:48 | 显示全部楼层
ampleeeeee 发表于 2024-4-15 11:53
不是,我用的是野火的板子,他的复位引脚接的是nrst。

这样的话,可以上电后等待1秒再访问,保证PHY芯片复位后再访问。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 06:41 , Processed in 0.249006 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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