十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SMT32H7系列DMA和DMAMUX的一点理解

SMT32H7系列DMA和DMAMUX的一点理解 DMA和DMAMUXDMA无CPU参与下直接进行数据搬运的控制器DMAMUX建立DMA请求和DMA通道之间的映射关系类似于路由的功能。无DMAMUX的MCUDMA请求和DMA通道的映射关系是固定的不能由软件修改。有了DMAMUX可以将DMA请求和DMA通道由软件联系起来实现自定义链接。以STM32H743为例DMAMUX1DMAMUX1_Channel0-15对应DMA1_Stream0-7和DMA2_Stream0-7。DMAMUX2DMAMUX2_Channel0-7对应BDMA_Channel0-7。具体见下图理解仅供参考。触发发生器的例子1.比如外部中断EXTI触发存储器到存储器/外设的DMA请求无DMAMUX的情况下因为EXTI本身没有DMA请求但EXTI要触发DMA只能在EXTI中断中启动DMA配置好存储器到存储器/外设的DMA后然后再EXTI中断中启动DMA。有DMAMUX的情况下触发信号HAL_DMAMUX1_REQ_GEN_EXTI0和信号发生器DMA_REQUEST_GENERATORx关联相当于EXTI0具有了DMA请求然后配置好DMA传输通道配置好EXTI0EXTI0就能触发DMA实现DMA传输了。这里边可能MCU已经做好EXTI边沿信号和DMA启动的关联了不然和在EXTI中断中启动DMA又有什么区别呢。猜测没用过2.比如GPIO触发DMA请求实现存储器到GPIO的数据传输无DMAMUX的情况下GPIO本身没有DMA请求要实现存储器到GPIO的DMA传输需要借用一个DMA请求我当初用的是TIM_UP的DMA请求当然也可以用其它信号只要能产生DMA请求就行然后在DMA配置中按照存储器到外设的DMA配置就行我用这个可以实现输出一段固定波形的信号信号的CLK和TIM周期一致如果这段波形要周期性出现可以用另一个定时器在定时器中断中使能DMA。本质上是外设1-存储器-外设2的传输外设1有DMA请求外设2没有DMA请求用外设1的请求干外设2的事情。有DMAMUX的情况下触发信号HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT和信号发生器DMA_REQUEST_GENERATORx关联产生的DMA请求用作GPIO的DMA请求然后配置DMA传输通道配置LPTIM定时器则启动DMA后LPTIM定时器每次产生1个DMA请求发送1个数据。如果DMA是循环模式则会根据NDTR循环传输如果是正常模式则NDTR传完后DMA自动关闭。同步发生器的例子同步信号主要用于周期启动DMA1.定时进行串口DMA发送数据无DMAMUX的情况串口都有DMA请求不需要触发发生器直接通过外设请求和DMA传输通道关联但是我要定时发送串口数据则需要在一个定时器中断中启动串口DMA发送。有DMAMUX的情况先进行串口外设和DMA传输通道的关联然后选择同步信号HAL_DMAMUX1_SYNC_LPTIM1_OUT关联DMAMUX配置LPTIM实现周期发出同步信号启动DMA。同步信号是用来启动DMA的不是DMA的请求DMA的请求来自串口。重点理解1.触发信号和同步信号都是固定的2.理解触发信号HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT和HAL_DMAMUX1_SYNC_LPTIM1_OUT在两个项目中应用的区别。触发信号相当于DMA请求信号同步信号相当于DMA启动信号。触发信号多用于外设1-存储器-外设2的类型同步信号多用于存储器-外设里的周期性启动DMA的情况。在触发信号HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT下每一次触发信号引起一次DMA请求而一次定时器的DMA请求只能传输一个DMA数据块。在同步信号HAL_DMAMUX1_SYNC_LPTIM1_OUT下一次同步信号启动一次DMADMA会传输完设定长度的数据而不是单个数据块。只是理解没有过多验证。
返回列表