eric2013 发表于 2018-8-11 00:40:28

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

官网例子:DMAMUX_SYNC

static/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);

浮云流水zjf 发表于 2019-5-28 16:00:16

我用的STM32L4R5,测试发现,当RequestNumber配置时,每次中断触发时,确实都发送个字节,但是当RequestNumber配置时,每次中断触发时,发送的数据个数就不对了,不知道H7有这现象没?

eric2013 发表于 2019-5-29 10:30:41

浮云流水zjf 发表于 2019-5-28 16:00
我用的STM32L4R5,测试发现,当RequestNumber配置时,每次中断触发时,确实都发送个字节,但是当 ...

回头我帮你测测

浮云流水zjf 发表于 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个都传完?

eric2013 发表于 2019-5-30 10:10:47

浮云流水zjf 发表于 2019-5-29 16:32
/*##-3- 配置DMAMUX #########################################################*/
    dmamux_ReqGe ...

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

eric2013 发表于 2020-3-17 00:54:10

验证SPI DMA定时触发要用到的重要资料。

fengxin32 发表于 2024-3-5 18:10:35

eric2013 发表于 2019-5-30 10:10
dmamux_ReqGenParams.RequestNumber = 8是控制的每次触发后,连续传输的个数。完成后是下一次触发

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

eric2013 发表于 2024-3-6 09:27:35

fengxin32 发表于 2024-3-5 18:10
下一次触发,DMA的目标地址能自动偏移么?

能,使能这个 hdma_tx.Init.MemInc            = DMA_MINC_ENABLE;就行
页: [1]
查看完整版本: DMAMUX的同步功能可以控制字符传输速度,比较实用