STMCU小助手
发布时间:2021-8-17 10:25
; g7 g( v" O+ ]; W STM32家族中的很多系列,比如STM32G0/STM32G4/STM32L4+/STM32H7等都内置了DMAMUX模块。有了它一方面使得DMA请求与DMA控制器之间的映射关系更为灵活方便,同时也大大拓展了DMA请求事件,不再局限于外设事件,比方可以基于GPIO的外部中断事件、或者DMA事件本身来触发DMA传输。另外,DMA传输的实现还可以基于其它触发事件来同步其操作,即DMA传输的实现需要借助其它同步事件来真正启动。# y7 A1 \7 }9 Y8 [+ u
6 @( k' \0 @* v( r; t& f 本文就基于STM32G4芯片简单介绍下该话题,这里要实现的功能大致是这样的:片内低功耗定时器LPTIM1的定时输出作为DMAMUX的DMA同步输入事件,该同步事件触发UART的DMA传输,通过UART输出一段字符。# o/ k/ I9 p, M q7 e7 N v
- _) c+ i% {5 l5 h T* N 1 t# r9 G% r+ X* t* l! H& ~/ o 本演示例程基于STM32G4系列的Nucleo板进行。低功耗定时器LPTIM工作在PWM输出模式,DMAMUX基于LPTIM每次的定时输出事件为UART2申请一定数目的DMA请求,然后DMA将数据从内存送到UART的数据寄存器并最终将内容显示在PC串口终端。
" R! B6 }# H) l$ ^ . e0 w N5 M) G! N- K! G 下面就直接使用STM32CubeMx进入配置过程。 , t) G( X3 H3 i* @8 A% b2 I7 l 通过CubeMx神器做基本的初始化配置【RCC配置此处就省略了】。 ; \5 h: O# Y }" Z7 q LPTIM1的参考配置如下,具体应用时请结合实际情况来定,这里只需能产生周期性定时输出即可。4 J1 q6 [- V- r' U
UART2外设没有什么特别要提醒的,这里就不贴截图了。我们重点看看有关UART TX的DMA传输的相关配置。! H9 N( n6 ]: y
' Y" W+ |3 n7 c" G2 q ( P2 ^3 ~% q0 @* C, k1 c: Q 上图中蓝色圈里的勾选框对于本应用演示不是必须勾选的,勾选了也没关系,不会对本演示产生影响。DMA请求数设置为21,表示每检测到1个同步事件后DMAMUX为UART传输申请21个DMA请求,以批量传输21个字符“STM32 DMA SYNCDEMO\r\n”。 ' E# J; f3 m- [/ g# W" f0 e" B . n' s/ r$ Q& B; w; w 完成图形化配置后,生成初始化代码并添加必要的用户代码。 " [, r5 p" }3 u* m+ Q- @ # R6 V Z7 b& R* R #definePeriodValue (1000), e' q+ Q9 u% k6 z) K- R4 Q 4 u& Y* n3 ~ R, L$ \; V5 ^ #define PulseValue (500)0 @( F4 ]! m* S; m5 l* J 3 l1 _. H0 e- b; E6 K q6 f2 \( U, B8 }1 e #define Size (21) / j$ t0 `, m8 c; v! @" J1 m+ A uint8_tpData[Size]={'S','T','M','3','2',' ','D','M','A',' ',\ 'S','Y','N','C','','D','E','M','O','\r','\n'}; - c L1 s7 M4 y: Q' e+ a( q: K, I HAL_LPTIM_PWM_Start(&hlptim1, PeriodValue, PulseValue) ;. a1 G: V2 J6 _, e8 j 5 S% G0 t* H, S$ E5 S# ~ M HAL_UART_Transmit_DMA(&huart2, pData, Size); 编译运行,验证结果。
代码运行后,可以通过示波器看到LPTIM的周期性PWM输出,同时PC端也可以看到如上面截图所示的周期性呈现的字符串。8 t5 s9 ^& v+ [* v; k8 X 6 r ^# K) V( q1 C7 ]) _. R OK,本次基于DMAMUX同步事件的应用演示就介绍到这里,供君参考,更多细节还请阅读STM32相关技术手册。 2 C/ ~3 u( J) i0 d; T/ s; c/ J p |
经验分享 | 通过STM32 TIMER的PWM功能模拟输出正弦波
SPI 32位宽DMA方式收发失败问题
多通道DMA传输为何有一路异常?
经验分享 | STM32N6 ADC DMA 传输失败案例分享
经验分享 | DMA发送函数只能第一次调用有效?
经验分享 | 使用EXIT0同步触发SPI的DMA发送话题
【开发经验】LAT1500 如何通过DMA配合CRC功能
我心中的ST中文论坛
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | 使用GPIO+DMA+TIM模拟SPI通信演示
微信公众号
手机版