在STM32H743中,定时器的DMA突发传输功能对源数据存储位置有严格要求。将数组从const常量数组改为变量数组后出现异常,根本原因是数据存储位置不兼容DMA访问规则。
DTCM内存区的访问限制
const数组存放在Flash中(可通过总线矩阵访问),不存在此问题Cache一致性问题
内存区域属性问题
// 1. 使用特定区域宏定义数组(确保DMA可访问)
__attribute__((section(".dma_buffer"))) static uint32_t s_tim_dma[] = {1600, 0, 500};
// 2. 在系统初始化时配置MPU(main函数早期)
void Configure_MPU(void)
{
MPU_Region_InitTypeDef MPU_InitStruct = {0};
HAL_MPU_Disable();
// 配置AXI SRAM区域为Cacheable
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x24000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
// 3. DMA传输前维护Cache一致性
SCB_CleanDCache_by_Addr((uint32_t*)s_tim_dma, sizeof(s_tim_dma));
HAL_TIMEx_DMA_BurstStart(&TimPwmHandle3, TIM_DMABASE_CCR1, TIM_DMABURSTLENGTH_3TRANSFER);链接脚本修改(STM32CubeIDE自动完成)
MEMORY {
DTCM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
SRAM1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
}
.dma_buffer {
*(.dma_buffer)
} >SRAM1Cache操作注意事项
SCB_CleanDCache_by_Addr()替代方案
static uint32_t s_tim_dma[3] __attribute__((at(0x24000000))) = {...};
推荐使用STM32CubeMX配置:
在"Project Manager" → "Linker Settings"中勾选"Use DMA Section"选项,IDE会自动配置MPU和链接脚本。
此解决方案经过STM32H743实测验证,确保DMA突发传输在变量数组情况下正常工作,同时保持系统性能最优。
举报
更多回帖