|
|

楼主 |
发表于 2026-6-26 16:11:09
|
显示全部楼层
static void _mpu_region_cfg(uint8_t region,
uint32_t base_addr,
uint8_t size,
uint8_t tex,
uint8_t shareable,
uint8_t cacheable,
uint8_t bufferable,
uint8_t ap,
uint8_t xn,
uint8_t srd)
{
MPU_Region_InitTypeDef r = {0};
r.Enable = MPU_REGION_ENABLE;
r.Number = region;
r.BaseAddress = base_addr;
r.Size = size;
r.SubRegionDisable = srd;
r.TypeExtField = tex;
r.AccessPermission = ap;
r.DisableExec = xn;
r.IsShareable = shareable;
r.IsCacheable = cacheable;
r.IsBufferable = bufferable;
HAL_MPU_ConfigRegion(&r);
}
/* =========================================================================
* MPU_Config — 完整 11 区域配置
* ========================================================================= */
/**
* @brief 配置并使能 MPU(共 11 个区域)
* @note 必须在 SCB_EnableICache() / SCB_EnableDCache() 之前调用。
* 启动模式:PRIVDEFENA=1(特权背景访问强序,非特权未覆盖区域 Fault)。
*/
static void MPU_ConfigAI(void)
{
HAL_MPU_Disable();
/* ------------------------------------------------------------------
* Region 0 — 背景保护区
* 地址/大小 : 0x00000000 / 4GB(覆盖整个地址空间)
* 属性 : Strongly-Ordered,仅特权 R/W,XN=1
* 目的 : 未被后续区域覆盖的访问触发 MemManage Fault,
* 防止野指针静默访问保留/外设空间。
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_BG,
0x00000000U,
MPU_REGION_SIZE_4GB,
MPU_TEX_LEVEL0, /* TEX=0,S=0,C=0,B=0 → Strongly-Ordered */
MPU_ACCESS_SHAREABLE,
MPU_ACCESS_NOT_CACHEABLE,
MPU_ACCESS_NOT_BUFFERABLE,
MPU_REGION_PRIV_RW, /* AP=001:仅特权 R/W */
MPU_INSTRUCTION_ACCESS_DISABLE, /* XN=1 */
0x87U
);
/* ------------------------------------------------------------------
* Region 1 — DTCM(D1 域 Tightly Coupled Memory)
* 地址/大小 : 0x20000000 / 128KB
* 属性 : Normal WB-WA,S=0(TCM 不经 AHB 总线,无 DMA 路径)
* 目的 : 零等待时延 RAM,存放中断处理函数/实时任务栈。
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_DTCM,
0x20000000U,
MPU_REGION_SIZE_128KB,
MPU_TEX_LEVEL1, /* TEX=1,C=1,B=1 → Normal WB-WA */
MPU_ACCESS_NOT_SHAREABLE, /* S=0:DTCM 不可 DMA */
MPU_ACCESS_CACHEABLE,
MPU_ACCESS_BUFFERABLE,
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_ENABLE,
0x00U
);
/* ------------------------------------------------------------------
* Region 2 — AXI SRAM(D1 域)
* 地址/大小 : 0x24000000 / 512KB
* 属性 : Normal WB-WA,S=1(DMA1/DMA2/MDMA 可访问)
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_AXI_SRAM,
0x24000000U,
MPU_REGION_SIZE_512KB,
MPU_TEX_LEVEL1, /* TEX=1,C=1,B=1 → Normal WB-WA */
MPU_ACCESS_SHAREABLE, /* S=1 */
MPU_ACCESS_CACHEABLE,
MPU_ACCESS_BUFFERABLE,
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_ENABLE,
0x00U
);
/* ------------------------------------------------------------------
* Region 3 — D2 SRAM1 + SRAM2
* 地址/大小 : 0x30000000 / 256KB(SRAM1 128KB + SRAM2 128KB 连续)
* 属性 : Normal WB-WA,S=1(DMA1/DMA2 可访问)
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_D2_SRAM12,
0x30000000U,
MPU_REGION_SIZE_256KB,
MPU_TEX_LEVEL1,
MPU_ACCESS_SHAREABLE,
MPU_ACCESS_CACHEABLE,
MPU_ACCESS_BUFFERABLE,
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_ENABLE,
0x00U
);
/* ------------------------------------------------------------------
* Region 4 — ETH DMA 区(SRAM3,D2 域)
* 地址/大小 : 0x30040000 / 32KB
* 属性 : Normal Non-Cacheable,S=1
* 目的 : ETH DMA 数据缓冲区,Non-Cacheable 保证 CPU/ETH-DMA 数据一致,
* 无需 Cache Flush 操作。
* 注意 : 用户要求的 0x30040100 偏移起始地址不满足 MPU 32KB 对齐约束
* (需 0x8000=32KB 倍数对齐),统一从 0x30040000 起始配置。
* Region 5(更高编号)将以 Device 属性覆盖首 256B 描述符区域。
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_ETH_DMA,
0x30040000U,
MPU_REGION_SIZE_32KB,
MPU_TEX_LEVEL1, /* TEX=1,C=0,B=0 → Normal Non-Cacheable */
MPU_ACCESS_SHAREABLE, /* S=1:ETH-DMA 访问 */
MPU_ACCESS_NOT_CACHEABLE,
MPU_ACCESS_NOT_BUFFERABLE,
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_DISABLE, /* XN=1:数据区不执行 */
0x00U
);
/* ------------------------------------------------------------------
* Region 5 — ETH DMA 描述符(覆盖 Region 4 首 256B)
* 地址/大小 : 0x30040000 / 256B
* 属性 : Device Shareable(TEX=0,S=1,C=0,B=0),XN=1
* 目的 : ETH MAC 硬件直接读写 DMA 描述符环,需要严格的强序语义;
* Device Shareable 保证访问顺序与 ETH MAC 硬件可见性。
* 编号 5 > 编号 4,Cortex-M7 以高编号区域属性为准。
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_ETH_DESC,
0x30040000U,
MPU_REGION_SIZE_256B,
MPU_TEX_LEVEL0, /* TEX=0,S=1,C=0,B=0 → Device Shareable */
MPU_ACCESS_SHAREABLE, /* S=1 */
MPU_ACCESS_NOT_CACHEABLE, /* C=0 */
MPU_ACCESS_NOT_BUFFERABLE, /* B=0 */
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_DISABLE, /* XN=1 */
0x00U
);
/* ------------------------------------------------------------------
* Region 6 — SRAM4(D3 域)
* 地址/大小 : 0x38000000 / 64KB
* 属性 : Normal WB-WA,S=1(BDMA 可访问)
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_SRAM4,
0x38000000U,
MPU_REGION_SIZE_64KB,
MPU_TEX_LEVEL1,
MPU_ACCESS_SHAREABLE,
MPU_ACCESS_CACHEABLE,
MPU_ACCESS_BUFFERABLE,
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_ENABLE,
0x00U
);
/* ------------------------------------------------------------------
* Region 7 — FMC SRAM / 外设设备区(RA8889 / AD7606 等)
* 地址/大小 : 0x6C000000 / 128MB
* 属性 : Device Non-Shareable(TEX=2,S=0,C=0,B=0),XN=1
* 目的 : FMC Bank1 Sub-bank4 外挂设备寄存器空间:
* - RA8889 LCD 控制器(内存映射寄存器)
* - AD7606 ADC(内存映射 CS/RD/WR 控制)
* Device 属性保证写操作不被缓冲/重排序,寄存器访问时序正确。
* S=0(Non-Shareable):这些设备仅由 CPU 访问,无 DMA 共享。
* ? 非对齐访问:Device 类型不支持非对齐,驱动请确保寄存器访问地址对齐。
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_FMC_DEV,
0x6C000000U,
MPU_REGION_SIZE_128MB,
MPU_TEX_LEVEL2, /* TEX=2,S=0,C=0,B=0 → Device Non-Shareable */
MPU_ACCESS_NOT_SHAREABLE, /* S=0 */
MPU_ACCESS_NOT_CACHEABLE, /* C=0 */
MPU_ACCESS_NOT_BUFFERABLE, /* B=0 */
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_DISABLE, /* XN=1 */
0x00U
);
/* ------------------------------------------------------------------
* Region 8 — FMC NAND Flash
* 地址/大小 : 0x80000000 / 512MB(FMC Bank3)
* 属性 : Device Non-Shareable(TEX=2,S=0,C=0,B=0),XN=1
* 目的 : FMC NAND 命令/地址/数据寄存器区,访问时序严格有序。
* CPU 通过 FMC 状态机控制 NAND,无 DMA 直接访问此区域。
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_NAND,
0x80000000U,
MPU_REGION_SIZE_512MB,
MPU_TEX_LEVEL2, /* TEX=2,S=0,C=0,B=0 → Device Non-Shareable */
MPU_ACCESS_NOT_SHAREABLE,
MPU_ACCESS_NOT_CACHEABLE,
MPU_ACCESS_NOT_BUFFERABLE,
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_DISABLE, /* XN=1 */
0x00U
);
/* ------------------------------------------------------------------
* Region 9 — QSPI Flash XIP(OCTOSPI/QUADSPI 内存映射模式)
* 地址/大小 : 0x90000000 / 128MB
* 属性 : Normal Write-Through,S=0,XN=0
* 目的 : QSPI XIP 执行区域,CPU I-Cache 直接缓存指令/常量数据;
* Write-Through 保证读命中一致,S=0(单 Master CPU 访问);
* XN=0 允许从此区域取指(正常读写 + XIP 执行)。
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_QSPI,
0x90000000U,
MPU_REGION_SIZE_128MB,
MPU_TEX_LEVEL0, /* TEX=0,S=0,C=1,B=0 → Normal WT */
MPU_ACCESS_NOT_SHAREABLE, /* S=0:仅 CPU 访问 */
MPU_ACCESS_CACHEABLE, /* C=1 */
MPU_ACCESS_NOT_BUFFERABLE, /* B=0 → Write-Through */
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_ENABLE, /* XN=0:允许 XIP 执行 */
0x00U
);
/* ------------------------------------------------------------------
* Region 10 — 外部 SDRAM(FMC Bank5,0xC0000000)
* 地址/大小 : 0xC0000000 / 128MB
* 属性 : Normal Write-Through,S=1,XN=0
*
* ★ 非对齐读写支持(用户需求):
* 必须使用 Normal 内存类型(本例 TEX=0,C=1,B=0)。
* Cortex-M7 CCR.UNALIGN_TRP 默认为 0,Normal 类型非对齐访问由硬件
* 自动拆分为多次对齐传输,应用层代码无需特殊处理。
* Device / Strongly-Ordered 类型非对齐访问将触发 UsageFault(硬件强制)。
*
* Write-Through 选择理由:
* SDRAM 常被 DMA(MDMA/DMA2D)并发访问;WT 模式写操作同步回写
* SDRAM,CPU 读已缓存行不会返回 DMA 写入前的脏数据,无需 Cache Flush。
* 若应用全部由 CPU 独占访问且追求极致写性能,可改 B=1(WB No-WA)
* 并在 DMA 传输前后手动执行 SCB_CleanInvalidateDCache_by_Addr()。
* ------------------------------------------------------------------ */
_mpu_region_cfg(
MPU_REGION_SDRAM,
0xC0000000U,
MPU_REGION_SIZE_128MB,
MPU_TEX_LEVEL0, /* TEX=0,S=1,C=1,B=0 → Normal WT Shareable */
// MPU_ACCESS_SHAREABLE, /* S=1:DMA/CPU 均可访问 读取速度太慢了, 32bit 测试读只有 70MB/S 左右 FMC==80MHz */
MPU_ACCESS_NOT_SHAREABLE, /* S=0: 读取速度还阔以, 32bit 测试读只有 170MB/S 左右 FMC==80MHz */
MPU_ACCESS_CACHEABLE, /* C=1 */
MPU_ACCESS_NOT_BUFFERABLE, /* B=0 → Write-Through */
MPU_REGION_FULL_ACCESS,
MPU_INSTRUCTION_ACCESS_ENABLE, /* XN=0(按需改 DISABLE)*/
0x00U
);
/* PRIVDEFENA=1:特权模式访问未覆盖区域使用强序背景属性;
* 非特权模式访问未覆盖区域触发 MemManage Fault。 */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
我吧 fmc io 口速度降低一档试试看
我是使用时 h743 axi 区域最大只有 512KB
|
|