本帖最后由 snikeguo 于 2025-6-12 16:40 编辑
只要一调用HAL_ETH_Start_IT后,那么就会进入ETH中断,提示DMA ERROR,DMA相关状态寄存器:
寄存器相关位描述:
几个重要数据结构 MAP:
[C] 纯文本查看 复制代码 .lwip_sec 0x30000000 0x4a83 load address 0x08021634
*(.RxDecripSection)
.RxDecripSection
0x30000000 0x60 ./LWIP/Target/ethernetif.o
0x30000000 DMARxDscrTab
*(.TxDecripSection)
.TxDecripSection
0x30000060 0x60 ./LWIP/Target/ethernetif.o
0x30000060 DMATxDscrTab
0x30000100 . = ALIGN (0x100)
*fill* 0x300000c0 0x40
*(.Rx_PoolSection)
.Rx_PoolSection
0x30000100 0x4983 ./LWIP/Target/ethernetif.o
0x30000100 memp_memory_RX_POOL_base
对应MPU的配置:
[C] 纯文本查看 复制代码 MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER1;
MPU_InitStruct.BaseAddress = 0x30000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
MPU_InitStruct.SubRegionDisable = 0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/** Initializes and configures the Region and the memory to be protected
*/
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER2;
MPU_InitStruct.BaseAddress = 0x30000100;
MPU_InitStruct.Size = MPU_REGION_SIZE_32KB;
MPU_InitStruct.SubRegionDisable = 0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
对DMA描述符所在的区域设置为Device模式 或者Strongly order 模式,
对0x30000100这块区域用作LWIP 静态内存。
I/D cache 都开了
|