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

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

[复制链接]
STMCU小助手 发布时间:2021-11-24 14:42
直接存储器存取(DMA)用于在外围设备和内存以及内存到内存。数据可以通过DMA快速移动没有任何CPU操作。这使CPU资源对其他操作保持空闲。DMA控制器有5个通道,每个通道专门用于管理内存访问请求。来自一个或多个外围设备。它有一个仲裁器来处理DMA之间的优先级请求。; q4 w( ]( }8 v# Y$ M3 m

- N1 B8 a- w# C) e5 o配置过程详解:
2 C1 u" s! D# B7 J0 F8 H' |. ^
* ?. c& Z7 r2 b* d  H
20190731174743448.jpg

4 U  V4 Q3 K1 U+ A! y! N% b- D" B, f
. y% |' c: ^1 S  u9 K7 [
首先调用RCC_AHBPeriphClockCmd()函数,进行DMA时钟的初始化。 $ u, L8 g5 c9 b* I$ N$ Z) H) ^
: D4 W4 F6 K& A2 {/ u
20190731210758915.jpg
( d, [# w. ?  l
+ ~: c; g6 P0 ]0 v# [
可以看到DMA在AHB时钟上。所以我们使用以下语句打开DMA1的时钟。% v! x! b7 J# e$ j

! F3 u2 I) W2 ?4 N5 e) x/ o
  1. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA1时钟
复制代码
; J. V* r7 T1 E
接着在DMA.c中编写如下两个函数。来设置DMA从UART1到内存和内存到UART的传输通道。
. B# P+ {" [" C: B
  1. /**************************************************************************************
    % }2 ]$ D( U) ~7 A1 y
  2. * FunctionName   : DMA_MemoryToPeripheral() - u; K3 }$ S; @" X: l/ ?. A0 ]
  3. * Description    : DMA传输(内存-->外设)7 e7 N/ E+ g/ W7 M
  4. * EntryParameter :  ( p- X* \% q( R6 L% f  e
  5. * ReturnValue    : None
      U# g+ q- h1 k6 E8 w$ a3 {$ J
  6. * Function       :
    4 h" k) o' R' ]. ^# j
  7. **************************************************************************************// j/ r' M. G- s, @: w( \# M
  8. void DMA_MemoryToPeripheral(uint32_t MemoryAddr,uint32_t PeripheralAddr,uint16_t BufferSize)
    ) C( T7 Q- F: s6 ?
  9. {
    6 `6 t4 m0 Y" I1 U
  10.         DMA_InitTypeDef DMA_InitStructure;9 x8 {: \) I# R8 t
  11.         
    $ n) F2 {# \' R
  12.         DMA_DeInit(DMA1_Channel2);//复位DMA1_Channel2
    6 c- G, g, P" _* I4 j
  13.         5 Q1 C- k8 g0 p; a, @
  14.         DMA_InitStructure.DMA_PeripheralBaseAddr=PeripheralAddr;//外设地址
    6 m8 |, V* G% Y1 N" `& F
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=MemoryAddr;//内存地址
    " y0 b7 C) ^0 n, H9 x# C
  16.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//传输方向:内存到外设0 ~3 O8 e- Q" H7 v1 S
  17.         DMA_InitStructure.DMA_BufferSize=BufferSize;//传输长度
    1 ^6 B1 f# r% w
  18.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设累增:NO
    ' K' E) i* Y1 f0 H. t
  19.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//外设累增:YES* o7 H; u' u$ q( J
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
    1 m! I5 w& F' P+ `  I4 h6 M1 `
  21.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;+ ?; @/ w+ e& j; R2 _
  22.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//循环模式:NO9 W1 @/ p; }4 t; R" `- D
  23.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;' T5 g, n8 u  Z0 ?0 k
  24.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//内存-内存:NO" K9 X- \1 q5 @# `# d! L3 S+ P8 y+ R
  25.         DMA_Init(DMA1_Channel2,&DMA_InitStructure);
    4 I7 L, O2 b- X  _4 B# B$ F; c& B
  26.         
    " _) Y& R, d# |3 w
  27.         DMA_Cmd(DMA1_Channel2,ENABLE);//使能DMA传输
    8 H# J$ k# S  a3 x. @# [) V
  28.                
    . N" e0 A# q) |$ E, a
  29. }
复制代码
  1. /**************************************************************************************
    * I! V3 J" L/ T1 V1 A" D
  2. * FunctionName   : DMA_PeripheralToMemory() ' G% I0 s: J3 `: S7 J8 `4 F3 t* k
  3. * Description    : DMA传输(内设-->内存)
    : f) ?# [9 C! o" `0 j! z  x0 P
  4. * EntryParameter :  
    1 a- k' l5 J3 I
  5. * ReturnValue    : None
    3 ]# ]3 _! f* `3 k% [* n8 K
  6. * Function       :
    0 y! I3 L0 R! f4 D
  7. **************************************************************************************/" K' Y: C! R' B  I  I. K7 ]
  8. void DMA_PeripheralToMemory(uint32_t PeripheralAddr,uint32_t MemoryAddr,uint16_t BufferSize)
    8 m: f& e5 X. E0 {7 _3 `
  9. {
    - U3 a1 ?% z& X! Z" s
  10.         DMA_InitTypeDef DMA_InitStructure;//声明结构体) ]8 K& x( n& X- F6 S* w  x3 l+ U
  11.         
    7 P) T6 g, q: Q' F: D: a5 o7 s
  12.         DMA_DeInit(DMA1_Channel3);//复位DMA1_Channel3
    7 ^6 Y. U9 I4 W2 G: S$ Y
  13.         
    ; _9 k' P. Y  n) E
  14.         DMA_InitStructure.DMA_PeripheralBaseAddr=PeripheralAddr;//外设地址+ {  K* V- k! {# ~7 C- x
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=MemoryAddr;//内存地址0 H" o* P. ~, e8 g4 D
  16.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//传输方向:内存到外设
    ; b" _# w& Q- c7 V% k; O/ H
  17.         DMA_InitStructure.DMA_BufferSize=BufferSize;//传输长度
    & S8 g" E: a% Q' C, E
  18.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设累增:NO7 }% q& z# C- r8 s- y& j& F0 C& T  I
  19.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//外设累增:YES
    ' i$ j& i8 e# A; f% M$ P1 B
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;; w3 ~7 _9 q5 c1 t
  21.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
    3 \: a7 m# X; z/ x' d; K: v6 x& [
  22.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//循环模式:NO( s/ ]. C9 J3 A) C# |
  23.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;( c# L  \( Q  l
  24.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//内存-内存:NO
    1 F. L  d- A# a9 q. D, P7 e: X
  25.         DMA_Init(DMA1_Channel2,&DMA_InitStructure);$ x& M" h9 n) @5 n' l& j* v
  26.         
    & }  ?8 y9 k; C! B  P7 l5 t% F/ E
  27.         DMA_Cmd(DMA1_Channel3,ENABLE);//使能DMA传输
    2 \  p5 P( m; i7 y
  28.         
      I) P$ T$ R, T; Y0 q: g
  29. }
复制代码
/ }8 m" B- o" R1 e/ q
通过以上两个函数可以初始化两个通道,一个从内存到外设,一个从外设到内存。1 C% a- E2 J; O# d2 H

/ H* X, u; B- Q  p当然在我们调用这两个通道的时候需要知道一些东西。
, F: T7 y- e' g' `* c9 k- ]+ z6 ^" q& k6 R8 k% o7 ]! g
1.有关通道的信息:
7 f. N# \1 ]- _, G
8 r: K9 y9 i+ y  z; c9 |
2019073121253971.jpg
' O9 w* L* N+ E

2 x8 Y( F1 I% e, N5 ]; X  k
收藏 评论0 发布时间:2021-11-24 14:42

举报

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