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

【经验分享】STM32F0 DMA收发UART数据

[复制链接]
STMCU小助手 发布时间:2021-11-24 14:42
直接存储器存取(DMA)用于在外围设备和内存以及内存到内存。数据可以通过DMA快速移动没有任何CPU操作。这使CPU资源对其他操作保持空闲。DMA控制器有5个通道,每个通道专门用于管理内存访问请求。来自一个或多个外围设备。它有一个仲裁器来处理DMA之间的优先级请求。
# u# k4 i4 ]2 F6 z
0 U3 @+ f9 [2 a/ ?" ?  }5 A; ^% a配置过程详解:
8 K& b9 j0 d7 a4 w/ L) B( X: s- A) |7 E4 l* ]
20190731174743448.jpg

' U5 z5 n$ u) f% |" \) e8 l6 `4 m
- _' h- t- F, W6 w' d& g! m1 f
  S9 K1 m1 x, U1 j4 P; b- f1 N首先调用RCC_AHBPeriphClockCmd()函数,进行DMA时钟的初始化。 % w: g4 S/ Q  v* \2 W. x3 z3 v7 K

1 X: K, N+ S4 {5 [' _& y2 Y
20190731210758915.jpg

4 v9 m" c% Y1 l' o/ g$ w" P
0 ~* B# }* K7 R7 g1 T6 g+ [. V( k可以看到DMA在AHB时钟上。所以我们使用以下语句打开DMA1的时钟。, r6 @  w& o  A  U

5 S5 p% @- h- d+ d
  1. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA1时钟
复制代码
  S$ v5 Y  V4 b7 {" t+ B0 L
接着在DMA.c中编写如下两个函数。来设置DMA从UART1到内存和内存到UART的传输通道。
' D/ r1 l  I7 I* g1 l# X
  1. /**************************************************************************************
    9 s; a6 z6 ^+ I; ~& ~" x# T' K
  2. * FunctionName   : DMA_MemoryToPeripheral() $ V5 j6 |6 o/ }
  3. * Description    : DMA传输(内存-->外设)3 e8 Z/ T1 R/ R! U- ^2 s" y
  4. * EntryParameter :  ) C; p. m$ B: c. u& j6 e$ Z
  5. * ReturnValue    : None
    * P5 o5 P9 S+ ~
  6. * Function       :
    ) U/ O- C# n- e. b$ R9 b2 }/ w
  7. **************************************************************************************/- A3 H6 S. ~3 _' b$ K' S5 v
  8. void DMA_MemoryToPeripheral(uint32_t MemoryAddr,uint32_t PeripheralAddr,uint16_t BufferSize). i  \' Z4 k) U% L4 p
  9. {
    7 ?8 w' E5 d- S3 b
  10.         DMA_InitTypeDef DMA_InitStructure;
    6 m5 z, B# Q. {) E0 S7 i* b: Y
  11.         
    % ^; j0 f. e4 [: v- i
  12.         DMA_DeInit(DMA1_Channel2);//复位DMA1_Channel2: l7 [% r9 l2 n- m2 X
  13.         
    ( ^9 R' b6 R3 R- ~0 I0 o
  14.         DMA_InitStructure.DMA_PeripheralBaseAddr=PeripheralAddr;//外设地址2 L% H- O& v) X$ |* x; c& ]" ?
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=MemoryAddr;//内存地址6 e2 Z7 @  F5 _) Q
  16.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//传输方向:内存到外设3 T, R4 \+ ~* M- E2 b' z5 g
  17.         DMA_InitStructure.DMA_BufferSize=BufferSize;//传输长度
    0 m& x. _( {7 I& I( q* @8 T
  18.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设累增:NO4 [4 f/ d( k! G* u# I% [! `
  19.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//外设累增:YES5 J# x  s% J6 D: O9 q3 _
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;8 F0 s$ ^0 `; d% Q, K) m
  21.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
    ) c: y- B5 W( y' M9 W/ \- i1 y
  22.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//循环模式:NO$ n! f  J5 D+ a0 G: R
  23.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;+ R8 t7 q7 S4 I1 j
  24.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//内存-内存:NO8 V) X3 N, O% B7 V
  25.         DMA_Init(DMA1_Channel2,&DMA_InitStructure);0 ~$ L" Y1 T$ i
  26.         ; E& }1 n' r5 B$ |* v
  27.         DMA_Cmd(DMA1_Channel2,ENABLE);//使能DMA传输
    & T* p* d) S# |. K# q$ V- L- ?" w
  28.                 ' b- O! C9 d1 @5 W0 v" i
  29. }
复制代码
  1. /**************************************************************************************
    : U, [7 B) P8 `. t1 A
  2. * FunctionName   : DMA_PeripheralToMemory()
    . U7 }5 Z6 b  s
  3. * Description    : DMA传输(内设-->内存)/ r% f  p' Q% ]' J1 ?! i
  4. * EntryParameter :  / i+ G6 M4 _" w
  5. * ReturnValue    : None
    ! y5 f7 c8 l4 h$ Q
  6. * Function       : 3 d3 a  ~$ X& O. H: G
  7. **************************************************************************************/
    ) X1 K! i' P  T0 L+ B7 V2 G
  8. void DMA_PeripheralToMemory(uint32_t PeripheralAddr,uint32_t MemoryAddr,uint16_t BufferSize)
    ! V. ~; Q) G" O3 U3 h" g
  9. {) |/ A1 G7 n% e8 X& Q3 d3 E% T; O: p
  10.         DMA_InitTypeDef DMA_InitStructure;//声明结构体
    - J$ o, q8 o  t6 G( X2 h
  11.         
    4 _- v1 W" i! M' b- I6 n
  12.         DMA_DeInit(DMA1_Channel3);//复位DMA1_Channel3
    " S. _4 p# M! U) X: ]
  13.         
    1 v- b7 k0 G, p+ n) e, ]) c8 D2 X
  14.         DMA_InitStructure.DMA_PeripheralBaseAddr=PeripheralAddr;//外设地址
    + a* T5 X+ R' A3 l0 h7 y
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=MemoryAddr;//内存地址* q' F* m* z  A7 y9 p
  16.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//传输方向:内存到外设
    : |; M( r1 B! H. a. @7 f* j* Q
  17.         DMA_InitStructure.DMA_BufferSize=BufferSize;//传输长度8 [2 C9 U5 ^/ r$ J2 |6 j
  18.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设累增:NO5 c) B/ q8 ?3 X/ v
  19.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//外设累增:YES: e6 S+ }5 }1 Z6 E* |
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;  Q2 l4 i: F% M, V# r1 R! q1 ]- L
  21.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
      c& V3 Q) h1 T6 f+ I
  22.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//循环模式:NO" `8 D6 R9 v  R7 K9 ], \, h
  23.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;& {  ?) {+ H# |7 x6 j% O
  24.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//内存-内存:NO  O/ i& J6 M. Y0 ^
  25.         DMA_Init(DMA1_Channel2,&DMA_InitStructure);
    : B, d2 l0 B3 V$ A: ?. Q& L( u
  26.         5 a% E' d( f  h
  27.         DMA_Cmd(DMA1_Channel3,ENABLE);//使能DMA传输
    & O0 p, \# W  K0 z+ P8 r) T
  28.         7 X: E2 A3 |- s2 a, i9 {) [3 Q! T% B
  29. }
复制代码

$ d# z1 S8 v1 K" P8 V8 ? 通过以上两个函数可以初始化两个通道,一个从内存到外设,一个从外设到内存。1 u2 o! m8 L) K

/ O* W0 N: o; ~% k4 W当然在我们调用这两个通道的时候需要知道一些东西。3 c, C2 m" w" v' [1 J9 ^% w
4 G" D- _# Q' f  h
1.有关通道的信息:
* Y. k3 D4 S) A) _; L6 U# R2 h( S' M  A) H
2019073121253971.jpg

9 b) d0 X5 K  E9 L! Z. a: J( V. p" j
) e0 y( y( }( N7 ]' A; ~
收藏 评论0 发布时间:2021-11-24 14:42

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版