硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4214|回复: 7
收起左侧

[DMA] DMAMUX的同步功能可以控制字符传输速度,比较实用

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-11 00:40:28 | 显示全部楼层 |阅读模式
官网例子:DMAMUX_SYNC



比如下面字符的显示速度,就可以通过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支持的即可。
1.png

最重要的一点是用户可以通过参数RequestNumber来设置一个触发条件响应几次,简单的说就是触发一次,会有RequestNumber个字符显示出来,下次触发再显示RequestNumber个字符。
这个功能的关键就是函数HAL_DMAEx_ConfigMuxSync的设置。

  1.         /* 配置DMA发送 */
  2.         hdma_tx.Instance                 = USARTx_TX_DMA_STREAM;
  3.         hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
  4.         hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
  5.         hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;
  6.         hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  7.         hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
  8.         hdma_tx.Init.Mode                = DMA_NORMAL;
  9.         hdma_tx.Init.Priority            = DMA_PRIORITY_LOW;
  10.         hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
  11.         hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  12.         hdma_tx.Init.MemBurst            = DMA_MBURST_INC4;
  13.         hdma_tx.Init.PeriphBurst         = DMA_PBURST_INC4;
  14.         hdma_tx.Init.Request             = USARTx_TX_DMA_REQUEST;

  15.         HAL_DMA_Init(&hdma_tx);
  16.         
  17.         /* Configure the DMAMUX with the Synchronization parameters */
  18.         dmamux_syncParams.EventEnable    = ENABLE; /* Enable DMAMUX event generation each time  RequestNumber are passed from DMAMUX to the DMA */
  19.         dmamux_syncParams.SyncPolarity  = HAL_DMAMUX_SYNC_RISING;           /* Synchronization edge is Rising  */
  20.         dmamux_syncParams.RequestNumber = 1;                                /* 4 requests are autorized after each edge of the sync signal */
  21.         dmamux_syncParams.SyncSignalID  = HAL_DMAMUX1_SYNC_LPTIM1_OUT;      /* Sync signal is LPTIM1_OUT */
  22.         dmamux_syncParams.SyncEnable     = ENABLE;           /* Synchronization is enabled */   

  23.         HAL_DMAEx_ConfigMuxSync(&hdma_tx, &dmamux_syncParams);
复制代码


回复

使用道具 举报

2

主题

109

回帖

115

积分

初级会员

积分
115
发表于 2019-5-28 16:00:16 | 显示全部楼层
我用的STM32L4R5,测试发现,当RequestNumber配置[1,5]时,每次中断触发时,确实都发送[1,5]个字节,但是当RequestNumber配置[6,32]时,每次中断触发时,发送的数据个数就不对了,不知道H7有这现象没?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-5-29 10:30:41 | 显示全部楼层
浮云流水zjf 发表于 2019-5-28 16:00
我用的STM32L4R5,测试发现,当RequestNumber配置[1,5]时,每次中断触发时,确实都发送[1,5]个字节,但是当 ...

回头我帮你测测
回复

使用道具 举报

2

主题

109

回帖

115

积分

初级会员

积分
115
发表于 2019-5-29 16:32:33 | 显示全部楼层
    /*##-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个都传完?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-5-30 10:10:47 | 显示全部楼层
浮云流水zjf 发表于 2019-5-29 16:32
/*##-3- 配置DMAMUX #########################################################*/
    dmamux_ReqGe ...

dmamux_ReqGenParams.RequestNumber = 8是控制的每次触发后,连续传输的个数。完成后是下一次触发
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-3-17 00:54:10 | 显示全部楼层
验证SPI DMA定时触发要用到的重要资料。
回复

使用道具 举报

10

主题

247

回帖

282

积分

高级会员

积分
282
发表于 2024-3-5 18:10:35 | 显示全部楼层
eric2013 发表于 2019-5-30 10:10
dmamux_ReqGenParams.RequestNumber = 8是控制的每次触发后,连续传输的个数。完成后是下一次触发

下一次触发,DMA的目标地址能自动偏移么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2024-3-6 09:27:35 | 显示全部楼层
fengxin32 发表于 2024-3-5 18:10
下一次触发,DMA的目标地址能自动偏移么?

能,使能这个 hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;就行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 21:55 , Processed in 0.179713 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表