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;就行
页:
[1]