STM32家族中的很多系列,比如STM32G0/STM32G4/STM32L4+/STM32H7等都内置了DMAMUX模块。有了它一方面使得DMA请求与DMA控制器之间的映射关系更为灵活方便,同时也大大拓展了DMA请求事件,不再局限于外设事件,比方可以基于GPIO的外部中断事件、或者DMA事件本身来触发DMA传输。另外,DMA传输的实现还可以基于其它触发事件来同步其操作,即DMA传输的实现需要借助其它同步事件来真正启动。
本文就基于STM32G4芯片简单介绍下该话题,这里要实现的功能大致是这样的:片内低功耗定时器LPTIM1的定时输出作为DMAMUX的DMA同步输入事件,该同步事件触发UART的DMA传输,通过UART输出一段字符。
本演示例程基于STM32G4系列的Nucleo板进行。低功耗定时器LPTIM工作在PWM输出模式,DMAMUX基于LPTIM每次的定时输出事件为UART2申请一定数目的DMA请求,然后DMA将数据从内存送到UART的数据寄存器并最终将内容显示在PC串口终端。
下面就直接使用STM32CubeMx进入配置过程。
通过CubeMx神器做基本的初始化配置【RCC配置此处就省略了】。
LPTIM1的参考配置如下,具体应用时请结合实际情况来定,这里只需能产生周期性定时输出即可。
UART2外设没有什么特别要提醒的,这里就不贴截图了。我们重点看看有关UART TX的DMA传输的相关配置。
上图中蓝色圈里的勾选框对于本应用演示不是必须勾选的,勾选了也没关系,不会对本演示产生影响。DMA请求数设置为21,表示每检测到1个同步事件后DMAMUX为UART传输申请21个DMA请求,以批量传输21个字符“STM32 DMA SYNCDEMO ”。
完成图形化配置后,生成初始化代码并添加必要的用户代码。
#definePeriodValue (1000)
#define PulseValue (500)
#define Size (21)
uint8_tpData[Size]={‘S’,‘T’,‘M’,‘3’,‘2’,‘ ’,‘D’,‘M’,‘A’,‘ ’,
‘S’,‘Y’,‘N’,‘C’,‘’,‘D’,‘E’,‘M’,‘O’,‘ ’,‘ ’};
HAL_LPTIM_PWM_Start(&hlptim1, PeriodValue, PulseValue) ;
HAL_UART_Transmit_DMA(&huart2, pData, Size);
编译运行,验证结果。
代码运行后,可以通过示波器看到LPTIM的周期性PWM输出,同时PC端也可以看到如上面截图所示的周期性呈现的字符串。
OK,本次基于DMAMUX同步事件的应用演示就介绍到这里,供君参考,更多细节还请阅读STM32相关技术手册。