DMAMUX的同步功能可以控制字符传输速度,比较实用
官网例子:DMAMUX_SYNCstatic/image/hrline/4.gif
比如下面字符的显示速度,就可以通过DMAMUX的同步功能进行控制。
uint8_t TxSyncMessage[] = "ee10\n\r09\n\r08\n\r07\n\r06\n\r05\n\r04\n\r03\n\r02\n\r01\n\r00";
速度由定时器触发速度决定,或者其他的触发源,只要是DMAMUX支持的即可。
最重要的一点是用户可以通过参数RequestNumber来设置一个触发条件响应几次,简单的说就是触发一次,会有RequestNumber个字符显示出来,下次触发再显示RequestNumber个字符。
这个功能的关键就是函数HAL_DMAEx_ConfigMuxSync的设置。
/* 配置DMA发送 */
hdma_tx.Instance = USARTx_TX_DMA_STREAM;
hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_tx.Init.Mode = DMA_NORMAL;
hdma_tx.Init.Priority = DMA_PRIORITY_LOW;
hdma_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
hdma_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_tx.Init.MemBurst = DMA_MBURST_INC4;
hdma_tx.Init.PeriphBurst = DMA_PBURST_INC4;
hdma_tx.Init.Request = USARTx_TX_DMA_REQUEST;
HAL_DMA_Init(&hdma_tx);
/* Configure the DMAMUX with the Synchronization parameters */
dmamux_syncParams.EventEnable = ENABLE; /* Enable DMAMUX event generation each timeRequestNumber are passed from DMAMUX to the DMA */
dmamux_syncParams.SyncPolarity= HAL_DMAMUX_SYNC_RISING; /* Synchronization edge is Rising*/
dmamux_syncParams.RequestNumber = 1; /* 4 requests are autorized after each edge of the sync signal */
dmamux_syncParams.SyncSignalID= HAL_DMAMUX1_SYNC_LPTIM1_OUT; /* Sync signal is LPTIM1_OUT */
dmamux_syncParams.SyncEnable = ENABLE; /* Synchronization is enabled */
HAL_DMAEx_ConfigMuxSync(&hdma_tx, &dmamux_syncParams);
我用的STM32L4R5,测试发现,当RequestNumber配置时,每次中断触发时,确实都发送个字节,但是当RequestNumber配置时,每次中断触发时,发送的数据个数就不对了,不知道H7有这现象没? 浮云流水zjf 发表于 2019-5-28 16:00
我用的STM32L4R5,测试发现,当RequestNumber配置时,每次中断触发时,确实都发送个字节,但是当 ...
回头我帮你测测 /*##-3- 配置DMAMUX #########################################################*/
dmamux_ReqGenParams.SignalID= HAL_DMAMUX2_REQ_GEN_LPTIM2_OUT; /* 请求触发器选择LPTIM2_OUT */
dmamux_ReqGenParams.Polarity= HAL_DMAMUX_REQ_GEN_RISING_FALLING; /* LPTIM2输出的上升沿和下降沿均可触发*/
dmamux_ReqGenParams.RequestNumber = 1; /* 触发后,传输进行1次DMA传输 */
HAL_DMAEx_ConfigMuxRequestGenerator(&DMA_Handle, &dmamux_ReqGenParams); /* 配置DMAMUX */
HAL_DMAEx_EnableMuxRequestGenerator (&DMA_Handle); /* 使能DMAMUX请求发生器 */
/*##-4- 启动DMA传输 ################################################*/
HAL_DMA_Start_IT(&DMA_Handle, (uint32_t)IO_Toggle, (uint32_t)&GPIOB->BSRRL, 8);
1>硬汉大哥,我想问下,触发一次传8个,还是触发8次才会把8个传完?
2>是不是触发一次,只能传输一个数组成员?
3>dmamux_ReqGenParams.RequestNumber = 8;是否能做到,触发一次,把8个都传完? 浮云流水zjf 发表于 2019-5-29 16:32
/*##-3- 配置DMAMUX #########################################################*/
dmamux_ReqGe ...
dmamux_ReqGenParams.RequestNumber = 8是控制的每次触发后,连续传输的个数。完成后是下一次触发 验证SPI DMA定时触发要用到的重要资料。 eric2013 发表于 2019-5-30 10:10
dmamux_ReqGenParams.RequestNumber = 8是控制的每次触发后,连续传输的个数。完成后是下一次触发
下一次触发,DMA的目标地址能自动偏移么? fengxin32 发表于 2024-3-5 18:10
下一次触发,DMA的目标地址能自动偏移么?
能,使能这个 hdma_tx.Init.MemInc = DMA_MINC_ENABLE;就行 eric2013 发表于 2019-5-30 10:10
dmamux_ReqGenParams.RequestNumber = 8是控制的每次触发后,连续传输的个数。完成后是下一次触发
所以,针对上述问题
1> 触发一次,DMA搬运1个32bit的个数据,触发8次才会把整个数组轮询完
2>触发一次,只传输一个数组成员
3>dmamux_ReqGenParams.RequestNumber = 8;触发一次,8个都能传完
硬汉哥,我的理解正确吗 Yhlr 发表于 2024-8-2 18:07
所以,针对上述问题
1> 触发一次,DMA搬运1个32bit的个数据,触发8次才会把整个数组轮询完
2>触发一次 ...
对,是这样的。 eric2013 发表于 2024-8-3 07:59
对,是这样的。
感谢硬汉!对这个的理解一直迷迷糊糊的 汉子哥,这个同步溢出中断不太明白,是属于正常的中断还是异常的中断,该怎么使用,有例子吗? 大花狸 发表于 2024-10-30 00:18
汉子哥,这个同步溢出中断不太明白,是属于正常的中断还是异常的中断,该怎么使用,有例子吗?
如果你说的同步溢出中断是指的楼主位的DMAMUX同步,可以看下这个帖子。
区分STM32H7的DMAMUX中同步触发源和外部触发源以及配套的几个实战案例
https://www.armbbs.cn/forum.php?mod=viewthread&tid=98811&fromuid=58
(出处: 硬汉嵌入式论坛)
你好想问一下这个通过GPIO的外部事件直接触发DMA是怎么样设置,为什么配置完成没有反应
zxx123 发表于 2024-11-26 10:07
你好想问一下这个通过GPIO的外部事件直接触发DMA是怎么样设置,为什么配置完成没有反应
方便的话,发配置代码看下
页:
[1]