你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32 DMA传输的两个问题释疑

[复制链接]
攻城狮Melo 发布时间:2023-12-3 17:15
微信图片_20231203171524.png 7 x9 |$ \8 n& ]" u+ E$ [6 ~& V
问题1
$ Q/ Q5 p/ H, t! K! }; d0 v, @* l用户使用STM32G473RET6芯片,开发环境STM32CubeMX+Keil(LL库)。使用DMA1通道1,在半传输中断和完全传输中断里,拷贝ADC采集的数据。在应用过程中发现DMA半传输中断和完全传输中断不能独立使用。
2 R5 c. |- f" P
, P) E8 w: H4 g$ e具体体现:& B5 q- B  a6 \3 j/ B
**1、在DMA1初始化时,打开了半传输中断,关闭完全传输中断,照样能触发完全传输中断**
' W9 ~2 a) Z! C( OLL_DMA_EnableIT_HT(DMA1,LL_DMA_CHANNEL_1);//打开DMA1半传输中断
  k" H+ W' L+ x5 r3 qLL_DMA_DisableIT_TC(DMA1,LL_DMA_CHANNEL_1);//关闭DMA1完全传输中断$ s) k6 }# ]3 G2 Y; D" O
**2、在DMA1初始化时,关闭了半传输中断,打开完全传输中断,照样能触发半传输中断**
; n3 U3 y8 @0 x# t$ ALL_DMA_EnableIT_TC(DMA1,LL_DMA_CHANNEL_1);//打开DMA1完全传输中断5 U. b3 L  p- J3 w2 N- b6 e
LL_DMA_DisableIT_HC(DMA1,LL_DMA_CHANNEL_1);//关闭DMA1半传输中断
3 t0 U* l, e! {. r
, y: F3 a4 q" S" P这个问题很让他很困惑,想知道怎么回事。
% Y% d3 d3 I- l- ]7 {关于这个问题,我们在操作DMA相关的使能位或做相关传输长度配置时,一定要注意他们往往要求在DMA通道未被使能的前提下进行【具体阅读芯片手册】。现在的问题是,他想对DMA传输中断使能位进行改写,依然也有这个前提。见下图黄色高亮内容,即当相应DMA通道被使能时,是不接受对相应DMA通道的传输完成和半完成中断使能的改写。
3 P) A7 ~; {( ~* o' p0 q
5 K$ w' Y/ n3 O2 ^& p 微信图片_20231203171520.png
* p# `6 {6 M  o4 g3 }; R  B
% n& d0 o& W& e% M
换言之,这里若要对相应中断使能位进行改写,得先将DMA通道使能位【EN位】进行清零。使用LL库的话就调用LL_DMA_DisableChannel()函数实现, 修改相应中断使能位之后再将DMA通道打开,即调用LL_DMA_EnableChannel()函数。- l7 r5 a/ {% h+ Z8 \
% x9 l3 R' Y3 _2 t
微信图片_20231203171516.png ! R$ h+ P9 l- @& [9 @* g/ C
& r+ ?- Z6 y6 R9 e3 C: i5 P
问题2、用户使用STM32G431芯片,用到TIMER1的PWM功能,并启用基于TIMER事件的DMA Burst传输实现4个比较通道寄存器的批量修改。使用CubeMx进行配置。配置时发现一点疑惑,为什么外设端不需地址自增的勾选。
; W; A. `1 G8 w' }. Q0 y( O/ w/ q
微信图片_20231203171512.png ! V7 s* [, ?3 A, {3 \3 q

/ N2 R& |5 {* H: \* `+ D现在用户的具体情况就是利用TIMER更新事件触发DMA请求,每次更新事件触发DMA将4个内存数据转发给定时器的4个CCR寄存器。6 F' A% k4 L& N3 x' _! j/ k
: O9 d( p( @) S/ _6 W* Q5 v
微信图片_20231203171509.png 7 h% u. a. n- L+ G& b

6 @4 m7 h5 V/ ?按照客户的理解,在做DMA配置时这里的外设地址也应该勾选自增才对,可事实发现不勾选才结果正常,若选择外设地址自增了反而异常。
- x0 Q* g* E' |2 W2 g3 `! R9 I
" n+ {+ m. T" |6 I/ k) }
微信图片_20231203171506.png * L! t! K7 e$ p' t+ f3 M

4 V% s  U) Q1 q7 Q 微信图片_20231203171500.png
6 n8 @. X) n* a3 J: I. k0 H  n; @" }4 W* T) ~4 L, a3 Z
ST公司设计人员为了满足DMA对TIMER寄存器批量访问,还特别设计了2个寄存器,分别是TIMx_DCR和TIMx_DMAR。其中,DCR寄存器由DBL和DBA字段组成。
. Q$ {* k6 \1 ?
4 h1 f* d0 I) L5 }% t
DBA:被访问的第一个定时器寄存器相对于定时器地址映射表中的TIMx_CR1的地址偏移量【偏移量从0开始计算】。
9 N' R" x! m/ B; ^- H* E. ~
/ p3 E. x/ ~; ^9 Z0 c; M
DBL:每组批量访问的寄存器个数【从0开始计算】。DMA访问DMAR寄存器时,按照如下算式得到绝对地址实现对寄存器的逐个访问。(TIM2_CR1address) + (DBA + DMA index)x 4 。
# V" G- d) G" T$ V
1 \  z' I3 X, m3 t! G
对于定时器DMA BURST传输,外设地址就是TIM2_DMAR寄存器的地址。DMA根据上面地址算式实现对多个TIMER寄存器的访问。TIM2_DMAR寄存器地址本身是固定的,无须增减,所以基于定时器事件DMA Burst模式配置外设时不要做地址自增勾选。. W7 e, X7 T2 m7 T3 C  I4 E

6 |+ |+ @, b$ j1 N3 a$ b% {! C当然,上面需求也可以基于非Burst模式来完成。假设还是基于4个内存数据修改4个CCR寄存器,此时则需要4次定时器事件触发DMA请求,做DMA配置时需要将内存端和外设端都选择地址自增模式。基于CubeMx的参考配置如下:
( f( O/ N7 c$ W3 t
4 I2 R$ k% b8 ^# n$ l
微信图片_20231203171446.png ( ]( T$ ]) w% E1 Z" k; A8 v* Z

' I1 k! v9 s+ A% x8 ^4 q+ C% x

6 `5 J* J. s: i6 d1 n. g当然,相应API函数也跟Burst模式下的也不一样【这里依然使用更新事件申请DMA】。
: j- ^4 l- D2 ~6 cHAL_DMA_Start_IT(&hdma_tim1_up,(uint32_t)T1_CCRData, (uint32_t)&htim1.Instance->CCR1,4);) m( k. T7 @( y0 T
下面是两种不同访问模式下的示意图,图示可能更直观些。
  T! ^+ ?7 W' a* H8 Z  m/ |1 o1 y. E: j7 g) V3 z
微信图片_20231203171441.png 7 f8 K! S8 S6 K" M; S9 x
- a( _7 b+ ?# Q

, U+ w& e; F  w' w! k转载自: 茶话MCU1 M0 [( P+ N* T' U/ g1 }
如有侵权请联系删除; y2 y0 q# Y7 ^3 a

, H" V8 u: C! {  Z6 E4 i# P1 W7 o: W; T' b3 l

. [5 x: K  H0 J4 K! n0 Q0 ~* }' D
赞 收藏 评论0 发布时间:2023-12-3 17:15

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版