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

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

[复制链接]
STMCU小助手 发布时间:2021-11-24 14:42
直接存储器存取(DMA)用于在外围设备和内存以及内存到内存。数据可以通过DMA快速移动没有任何CPU操作。这使CPU资源对其他操作保持空闲。DMA控制器有5个通道,每个通道专门用于管理内存访问请求。来自一个或多个外围设备。它有一个仲裁器来处理DMA之间的优先级请求。/ J& K# n0 v0 q! B0 c
' T% Y! A) J- j/ R7 D; c7 A
配置过程详解:
( e/ d* N- \. m2 j/ [* Q% A) j, d1 ~8 C4 e
20190731174743448.jpg

  x: N, @: N5 D1 r  J( F, I( @! R
8 N' |# ^0 s* B: [" @- g& y1 _- j8 r6 B6 S" T; C5 W2 R
首先调用RCC_AHBPeriphClockCmd()函数,进行DMA时钟的初始化。
" P7 f9 w) u, n2 i4 L* o6 e& f* Q! p( k8 r0 Q  r1 ?* @: @
20190731210758915.jpg

9 `* `" Q- I( p) y7 W. e; t& S: |( O9 h% U+ N1 l: s3 h
可以看到DMA在AHB时钟上。所以我们使用以下语句打开DMA1的时钟。, A: l" }: ^4 [' @; o) m- c2 ?

6 n7 D3 Y  E' m$ f% \8 v
  1. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA1时钟
复制代码
8 N- O. N/ Q/ Q; l1 f, r/ r
接着在DMA.c中编写如下两个函数。来设置DMA从UART1到内存和内存到UART的传输通道。
' X  ]9 Z0 T* s. ]# s  h2 V
  1. /************************************************************************************** 6 B5 }- S8 S" o, X
  2. * FunctionName   : DMA_MemoryToPeripheral() 0 h; N0 D; l0 o# r9 i0 T5 j7 W
  3. * Description    : DMA传输(内存-->外设)
    : m, j8 \% ]1 V1 H- {; \7 @( G
  4. * EntryParameter :  
    - Z% a% ]/ ~" A/ v6 R" [1 [7 [
  5. * ReturnValue    : None + ?# U; u& f# R" e
  6. * Function       :
    6 r0 j$ t+ d/ _) W# b6 u6 S  |
  7. **************************************************************************************/
    ' v  N. `  K" @9 C  r0 R
  8. void DMA_MemoryToPeripheral(uint32_t MemoryAddr,uint32_t PeripheralAddr,uint16_t BufferSize)
    * {$ M6 C5 T9 U/ {: m
  9. {- I: n3 g( `  a! b3 V
  10.         DMA_InitTypeDef DMA_InitStructure;
    , U& g, V# X4 s$ S8 {! c+ w
  11.         ! V* {2 Y1 X3 I
  12.         DMA_DeInit(DMA1_Channel2);//复位DMA1_Channel2
    7 k: J6 C& M' z' R+ J
  13.         . X! f! ^  k7 v
  14.         DMA_InitStructure.DMA_PeripheralBaseAddr=PeripheralAddr;//外设地址; |7 K: A2 Q# v# L. p4 n
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=MemoryAddr;//内存地址3 L$ {7 K! I1 `
  16.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//传输方向:内存到外设
    8 Q. X" R1 q2 ]8 Z6 ?
  17.         DMA_InitStructure.DMA_BufferSize=BufferSize;//传输长度6 a; G5 L0 N3 x" J; y+ \: V0 \6 \$ N
  18.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设累增:NO8 x/ L/ R3 P( o& w  d( e& n6 W
  19.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//外设累增:YES
    ) \) M, b3 V% l. j9 x" J' a
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;, D9 v) n2 r% f% M
  21.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;! q) f8 G* F; D0 V0 |4 m& m! k
  22.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//循环模式:NO7 \  h  V/ h- d) y6 j7 B. y
  23.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;. _/ p' L  r; o& X1 w$ i) i) I
  24.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//内存-内存:NO% \: H" j0 i. j$ q4 i; q
  25.         DMA_Init(DMA1_Channel2,&DMA_InitStructure);
    0 b8 @' C3 Q& W
  26.         2 |; ^) f9 k  Z# N
  27.         DMA_Cmd(DMA1_Channel2,ENABLE);//使能DMA传输
    / ]! Q- n2 G+ ]# g4 Q
  28.                
    1 l/ {& l7 }0 q- _- Q& k, @
  29. }
复制代码
  1. /**************************************************************************************
    ' [, \6 E9 D1 {5 w
  2. * FunctionName   : DMA_PeripheralToMemory() 8 P1 ^, m+ Y( l3 o
  3. * Description    : DMA传输(内设-->内存)
    ! W+ h+ r" o4 ~3 T" d7 c1 n2 V, |% U
  4. * EntryParameter :  
    4 J; n3 |( a) W- s3 F8 M+ M7 u
  5. * ReturnValue    : None 1 s5 j! v1 X. X; \  P
  6. * Function       :
    ! R/ c  Z% A# Y" n$ _
  7. **************************************************************************************/
    . \+ s- ~( d5 Q; f5 e
  8. void DMA_PeripheralToMemory(uint32_t PeripheralAddr,uint32_t MemoryAddr,uint16_t BufferSize)
    5 D7 w1 n9 @- S0 g) ^
  9. {
    4 n8 D5 g2 g* K' _- B% `7 b- Y
  10.         DMA_InitTypeDef DMA_InitStructure;//声明结构体
    4 A6 u+ k& {: [$ P/ {9 }* L5 S
  11.         
    0 X+ p  D- n: ]! A+ ?# L
  12.         DMA_DeInit(DMA1_Channel3);//复位DMA1_Channel3' O8 `! H" Q' v
  13.         / g% I8 L) @4 }9 `6 R5 C1 m
  14.         DMA_InitStructure.DMA_PeripheralBaseAddr=PeripheralAddr;//外设地址4 r  ~) ?. N7 t9 d, [6 i6 R
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=MemoryAddr;//内存地址, d: G9 j2 Y7 M" X9 u& L
  16.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//传输方向:内存到外设8 w; h5 l$ t. w3 g1 z$ o+ ~" s& Q
  17.         DMA_InitStructure.DMA_BufferSize=BufferSize;//传输长度: j, U- {" a. p0 p5 O1 g* V8 n
  18.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设累增:NO& T8 M% C- R# R* {
  19.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//外设累增:YES
    ! w) P+ g$ G6 o
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
    1 }# |0 N% Q7 w5 R$ [
  21.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
    8 L& B- H( }& k# R- [4 Y
  22.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//循环模式:NO
    6 O. g8 m$ v. J
  23.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;
    3 v4 Z, [  A1 \, J" e+ i* u5 t
  24.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//内存-内存:NO' t8 H0 U8 |' x8 n9 K4 K6 w0 @
  25.         DMA_Init(DMA1_Channel2,&DMA_InitStructure);
    # J& n, m7 ^& C  p) P: L$ `
  26.         . {; ?$ W) F. J+ @( N4 F
  27.         DMA_Cmd(DMA1_Channel3,ENABLE);//使能DMA传输6 R) c, e, M, ]" m; m
  28.         
    0 L6 c6 [' w7 [7 X# j0 [4 L! m1 W/ i
  29. }
复制代码

2 \7 d$ c8 g) `8 j9 o 通过以上两个函数可以初始化两个通道,一个从内存到外设,一个从外设到内存。
8 s$ M) o5 ~. C4 Q4 D) a; Z& M4 v0 v) Y. \1 c& z
当然在我们调用这两个通道的时候需要知道一些东西。5 s$ B0 y" K6 e
; Y0 L( k0 d( v$ _) s! b4 [
1.有关通道的信息:  I; R' Q. d! U) z/ ~. V
7 @, ?) y3 |; n: H
2019073121253971.jpg

* \# o- q1 r6 H7 v9 X. L. ^: K$ `' V6 d) p( ^( R
赞 收藏 评论0 发布时间:2021-11-24 14:42

举报

0个回答

所属标签

相似技术帖

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