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

基于STM32定时器触发DMA数据传输失败的典型案例

[复制链接]
yumeii 发布时间:2020-1-7 14:05
有人使用STM32的定时器事件触发DMA,让其将内存数据传输到通信外设的数据寄存器进行发送,发现DMA根本就不动作。
8 J$ e2 S. d0 }% `3 R& ]$ D) r0 U" |# x- `7 g

% s7 z1 X* t& D. y3 E& V1 D比方以基于STM32F411的芯片为例,通过TIM3更新事件触发DMA请求,DMA从内存将数据送到SPI1的数据寄存器,从而完成数据发送。/ t  u* ^& w  y3 @

4 ?4 ~1 y- c; K7 J( D$ A
! ]* D% y2 c& l. c- C
他采用CubeMx进行配置。基本配置如下:[文中图片可以放大观看]
9 n9 \9 R9 ~) n- U. h$ g7 m+ B& o* O) Q5 U; F  j
  o) k+ v0 l) R2 k) X& ^( U
1.png 0 ?: C+ N' w9 X2 E3 K& O: R& a

+ e* h2 N, L; ?+ N! j3 x7 b
7 g. M7 E, _( I0 k* N) ?3 k( P! e
2.png
5 q( A' I2 k, H8 M2 {
2 l" L. g" x: o: q4 C% {* |

" B  X  ]  M4 P/ J: n相关用户实现代码如下:' c4 g: h& z- |

; O$ X( p6 T1 U6 C& d
5 j+ Z" g# o9 d/ x- X3 ~) U
3.png
5 n  g' j2 _7 o4 R- c/ ^5 M+ @+ ~7 h) F  A( Y9 H

" w, w# |9 K" A' b5 U从配置过程和代码实现来看,似乎都没有问题。那DMA怎么就是不动作呢?5 K! g. M, [/ K& L+ N
. X. _- Z8 \) |

( t1 }8 ]& R# A问题出在我们使用上面的函数做DMA传输所关联源端和目标端时,出现了想当然的情况。" }! `- a. I1 ^- C0 {( C
8 j5 T5 D4 y. |% `/ e

: `! X3 Q1 T* Y0 z9 B我们利用TIMER事件来作为DMA请求源时,而作为数据传输的源端或目的端,都是我们用户指定的。这时就一定要注意源端和目标端是当前DMA流所支持的。否则就会出现乱点鸳鸯谱,DMA根本可能就跑不起来。就像你叫了某快递公司,它的服务范围是相对固定的,并非你想去哪里她就能服务到哪里。
5 k. E6 u: a! y% O( ?! ^$ T7 [! X; m

/ |3 f9 O6 O: G8 \0 |) [ 比方上面的例子,如果改成SPI2就没问题。为什么刚才SPI1不行呢,因为DMA1根本访问不到SPI1,我们不妨看看基于STM32F411芯片的内部功能及总线框图就很清晰了。
! P5 S4 D) ~, B! l: U
- H3 y0 S( \, H6 m9 p2 M+ c1 Y

7 N' p: ?0 r& Z' ^/ _( E  \ 4.png , J7 l! x% g7 T8 `$ @. g- C

' z2 r3 C$ v* y

! ~1 x# O7 E, [) d$ T从上图不难看出DMA1是访问不到SPI1或SPI4这些外设的,或者说DMA1就没法访问挂在APB2总线上的外设,只能访问APB1总线上的外设。
( w+ C, k& p$ ^3 k. ^1 b) T2 U
1 W2 z! c7 W& l$ `: g

9 C# ~+ o3 K6 i' ^6 s小结:一般来讲,基于某触发事件,对应的DMA数据流就可以确定下来了,那该DMA数据流的传输范围往往也随之确定。我们在为该DMA数据流指定源端和目标端时一定要符合其传输范围,否则会出现传输无法完成的情形。换言之,我们在做DMA传输时,为了实现DMA的有效传输,往往需要结合源端和目的端来调整或选择合适的DMA数据流。( @# b& k5 v* S: Y. O" i

, C" e) K4 j/ V) c3 T6 \
收藏 评论0 发布时间:2020-1-7 14:05

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版