DMA STM32H7 Domains and space distrubution
DMA这个数据搬运工,对谁都好,任劳任怨,接受雇主设备的数据搬运业务。每天都忙碌着!哈哈哈。
1. DMA 不可能单独工作,必须接收其他雇主的业务,所以数据搬运业务的参与者是DMA本身和业务需求发起者。
2. 一般大体的工作流程是:只要代码配置负责:2.1.给DAM提供时钟源,2.2.配置DMA工作模式和中断,2.3. 需求方设备(比如UART)向DMA发送开始搬运数据的请求信号,就可以开始搬运数据了。2.4 期间UART与DMA的同步方式,通过中断ISR互相关联嵌套。
3. DMA有时候也会遇到问题:比如STM32H743IIT6的BDMA负责LPUART1的发送数据搬运工作。应该会出现 TC 传输错误中断,原因是这个数据搬运工DMA在搬运数据时发现收发地之间没有总线互联,因此无路可走,那就巧妇难为无米之炊了。
所以,当系统复杂起来了,比如从STM32F407到STM32H743的SoC复杂度跨越,需要考虑内部数据总线、指令总线、运行频率等交通主干道的核心配置,达到满足应用目的。
下面附带上图
下面是一个已经解决的案例:
AMR Keil-MDK 上重新适配了分散散加加载载文文件:
LR_IROM1 0x08000000 0x00200000 { ; 主Flash区域(根据实际芯片型号调整)ER_IROM1 0x08000000 0x00200000 { ; 加载地址 = 执行地址*.o (RESET, +First) ; 中断向量表*(InRoot$$Sections) ; 根段.ANY (+RO) ; 所有只读数据(代码、常量)};---------------------------------------------------------; RAM Regions (RM0433-STM32H743-page131/3353-2025年5月27日);---------------------------------------------------------; 128KB DTCM (0x20000000 - 0x2001FFFF)RW_IRAM1 0x20000000 0x00020000 { ; 最高速度RAM,用于中断/实时数据.ANY (+RW +ZI) ; 默认分配未指定区域变量}; 512KB AXI SRAM (0x24000000 - 0x2407FFFF)RW_IRAM2 0x24000000 0x00080000 { ; 带缓存的大容量RAM*(.RAM_D1) ; 手动指定分配到此区域的变量(DMA缓冲区等)}; SRAM1-3 (0x30000000 - 0x30047FFF); SRAM1: 128KB (0x30000000 - 0x3001FFFF); SRAM2: 128KB (0x30020000 - 0x3003FFFF); SRAM3: 32KB (0x30040000 - 0x30047FFF)RW_IRAM3 0x30000000 0x00048000 { ; 总288KB,D2域SRAM*(.RAM_D2) ; 外设相关数据}; 64KB SRAM4 (0x38000000 - 0x3800FFFF)RW_IRAM4 0x38000000 0x00010000 { ; D3域低功耗RAM*(.RAM_D3) ; 低功耗模式保留数据}; 4KB Backup SRAM (0x38800000 - 0x38800FFF)RW_IRAM5 0x38800000 0x00001000 { ; 备份域RAM(Vbat供电)*(.RAM_Backup) ; RTC/备份寄存器相关数据}
};added by maple. for BDMA and LPUART1 .2025年5月27日