ampleeeeee 发表于 2024-4-8 22:46:08

tcpip报错,bu's fault

本帖最后由 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 handlerbus 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

eric2013 发表于 2024-4-9 08:41:09

H7的对齐问题,主要是这个。

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

ampleeeeee 发表于 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 handlerbus fault:
SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:22908051
小白不太清楚什么原因,请问一下具体需要怎么改

eric2013 发表于 2024-4-10 08:20:19

ampleeeeee 发表于 2024-4-9 15:18
您好!参考了您的帖子,我将0x30020000的内存堆的mpu设置为以下模式,看来一下改为iNormal格式txe=1 其他 ...

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

ampleeeeee 发表于 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中。

eric2013 发表于 2024-4-15 09:45:30

ampleeeeee 发表于 2024-4-14 21:24
您好,我解决了上述报错问题,注释掉内存堆#define LWIP_RAM_HEAP_POINTER 0x30020000这个然后mem定义为 ...
这个是不是你们新作的板子,有可能是芯片8720没有正常复位。访问失败。

ampleeeeee 发表于 2024-4-15 11:53:22

eric2013 发表于 2024-4-15 09:45
这个是不是你们新作的板子,有可能是芯片8720没有正常复位。访问失败。

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

eric2013 发表于 2024-4-16 08:15:48

ampleeeeee 发表于 2024-4-15 11:53
不是,我用的是野火的板子,他的复位引脚接的是nrst。

这样的话,可以上电后等待1秒再访问,保证PHY芯片复位后再访问。
页: [1]
查看完整版本: tcpip报错,bu's fault