请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
yumeii 发布时间:2020-1-7 14:05
有人使用STM32的定时器事件触发DMA,让其将内存数据传输到通信外设的数据寄存器进行发送,发现DMA根本就不动作。
2 p$ Y, Z% @5 y; u! e0 D* Y$ {6 R
# v* K5 B9 l4 [1 C9 ~; Q$ U

: \2 @. L6 Q  i) T5 r- w/ P比方以基于STM32F411的芯片为例,通过TIM3更新事件触发DMA请求,DMA从内存将数据送到SPI1的数据寄存器,从而完成数据发送。/ `* Z' h, O# B1 G" h. N" b

5 X' z3 b! b8 b
  U% c3 u( {3 N$ s4 u
他采用CubeMx进行配置。基本配置如下:[文中图片可以放大观看]0 N5 f% ?* J8 t, o

6 B2 I( F+ l/ Z! P. m

& g! \- j1 O1 y; [/ @  F 1.png
6 B/ `9 M6 ]% X6 r! M
. n! i' s8 Q7 d& L5 m

( u* Y& F. E  \ 2.png
7 r' m& s* h: t  x$ s
, T/ h8 i/ E& G! T5 u$ i
8 g7 d- n9 Y3 O' d9 K! |; ?
相关用户实现代码如下:
1 Z; c! p; E3 C0 Y3 x3 h. g9 A+ _) e& A& C6 A5 [/ q# \

) A8 ]2 k0 @: |6 M* H# m 3.png
! ?$ M  F7 L" U, n6 w
8 q- c6 G+ U, F. C6 i8 @. x+ E

  K9 X& C  g( ^( J4 J从配置过程和代码实现来看,似乎都没有问题。那DMA怎么就是不动作呢?: L2 p  C! [) v$ a
8 B# a; i3 v8 N' r; Z
4 N$ k: W. N$ D, _
问题出在我们使用上面的函数做DMA传输所关联源端和目标端时,出现了想当然的情况。
! Q4 y3 R2 Z; x; P8 `
' K6 P- C2 ^* }  d) ^% M" u
3 _% j  @1 q: E1 c5 P7 y
我们利用TIMER事件来作为DMA请求源时,而作为数据传输的源端或目的端,都是我们用户指定的。这时就一定要注意源端和目标端是当前DMA流所支持的。否则就会出现乱点鸳鸯谱,DMA根本可能就跑不起来。就像你叫了某快递公司,它的服务范围是相对固定的,并非你想去哪里她就能服务到哪里。
" C& p  N8 ~" s# U' V1 ^2 B4 a% g% b6 G: ]
5 c8 u2 q* ^/ B
比方上面的例子,如果改成SPI2就没问题。为什么刚才SPI1不行呢,因为DMA1根本访问不到SPI1,我们不妨看看基于STM32F411芯片的内部功能及总线框图就很清晰了。
% B5 E" N' o$ t2 v! R; ?- q8 H3 n5 s. W1 A5 p
6 P0 Z# u9 k' V0 _2 u
4.png
+ W" g# C/ m# l) o: H8 `, \& J7 E8 E! a' `7 W" t2 ?6 K+ B2 ^

4 A# ^9 |% k2 X7 @) e从上图不难看出DMA1是访问不到SPI1或SPI4这些外设的,或者说DMA1就没法访问挂在APB2总线上的外设,只能访问APB1总线上的外设。
+ m1 V: |7 b. x
& A9 p0 @2 x7 q- e

7 h8 S4 m2 x9 ~小结:一般来讲,基于某触发事件,对应的DMA数据流就可以确定下来了,那该DMA数据流的传输范围往往也随之确定。我们在为该DMA数据流指定源端和目标端时一定要符合其传输范围,否则会出现传输无法完成的情形。换言之,我们在做DMA传输时,为了实现DMA的有效传输,往往需要结合源端和目的端来调整或选择合适的DMA数据流。( R2 y4 K' J1 w8 J  B% d
& G" ]1 K$ O8 v" _
收藏 评论0 发布时间:2020-1-7 14:05

举报

0个回答

所属标签

相似分享

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