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

STM32库开发实战指南F103 -- 4、DMA 直接存储区访问

[复制链接]
TLLED 发布时间:2018-12-11 21:51
    学习第22章 -- DMA 直接存储区访问/ }/ U/ o0 K& R) P3 ?

9 b4 V( o  T* g, N3 H    一、手册资料
  V4 v* V0 G: [' _7 k, k1 S1 J
* N- q+ t) H* S& s& K8 g
& l4 S) |/ R) k- J- }) B
    直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU任何干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
4 }& v* p% Y0 E& S& N. K9 L    # k2 c* c" s9 `: Z" C0 a
    DMA框图
' i6 ?* i, u3 \1 W6 F2 o         1.png   + W+ F- b  V! h0 \6 R
4 J$ G% U# W3 m1 j/ ?% e# q' C

. A3 e4 Y8 B; g3 i    二、程序实验3 Y9 U! a4 x  o9 S+ ^" K
- A1 r  v* w: F# C7 s8 Y. M$ n* ?
% V8 q& _5 M2 h# k& d' {+ u" _
    2.1、DMA存储器到外设模式实验
9 u2 U( B4 D% d0 o
9 {) M2 u' z8 G2 w3 F% n

3 O, N0 W0 f6 N, z8 G+ c( K        存于SRAM中的变量,通过DMA的方式将数据传输到串口的数据寄存器,通过串口将这些数据发送到电脑显示。
% a# [8 }, l# t) A8 w- r    ! [; m0 s6 U4 O
    2.1.1、DMA配置程序* V6 [- |1 G9 `
   
1 A3 j# \. `+ M3 \% I, j
  1. /**
    $ T: l$ |1 `+ n( [
  2.   * @brief  USARTx TX DMA 配置,内存到外设(USART1->DR)
    6 m6 S* I" ~% A' @2 }0 ~# F' k
  3.   * @param  无
    $ [4 B# Q& o( o! m9 H
  4.   * @retval 无) ?2 r( h9 |: z- N! {
  5.   */4 ~4 b' W3 ]( Z. \5 R6 [( \
  6. void USARTx_DMA_Config(void)
    ; T6 {6 p$ _- _6 U! |2 Y
  7. {
    , U4 \6 I8 T, h5 Q+ G" r- `9 i
  8.                 DMA_InitTypeDef DMA_InitStructure;) e8 K8 I" f0 W! ^+ F; Q) g: g
  9.        
    3 C* ?) ?1 E2 |3 I2 U  A+ ^
  10.                 // 开启DMA时钟
    / B- s2 u9 j+ L6 \( K; M
  11.                 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    & }5 i* |4 F" I8 B
  12.                 // 设置DMA源地址:串口数据寄存器地址*/0 \/ g; S& l6 {( r# p/ f
  13.     DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
    5 e1 x5 ?0 m  d& J
  14.                 // 内存地址(要传输的变量的指针)( a* d0 ?) p- X; Y
  15.                 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;, E5 B! Z: |2 ], Q2 l( @
  16.                 // 方向:从内存到外设        & x6 b1 V  m/ R$ w) ~# _6 Q
  17.                 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;) q- ]' m5 s" }. x4 d8 b
  18.                 // 传输大小       
    2 f8 m6 D! e5 z. m
  19.                 DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
      z) E- ^4 |+ a) i
  20.                 // 外设地址不增            6 W+ G* F; W* u. L+ Z, D; T- T, ?
  21.                 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    7 W; \: v* t* `) Y+ }" X  u
  22.                 // 内存地址自增' ]/ |* c0 w0 i; ^! S$ ~$ i- f
  23.                 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    4 C! D3 s5 z* P0 u" y5 Q
  24.                 // 外设数据单位        5 E0 \( K; `1 e8 Z% |* Q2 a: s; \6 b
  25.                 DMA_InitStructure.DMA_PeripheralDataSize = 4 N# I' E( }7 A
  26.           DMA_PeripheralDataSize_Byte;
    0 i1 c9 P9 ?( P
  27.                 // 内存数据单位3 R' \2 ], K4 u* {
  28.                 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         / M! R& a3 x4 @: C3 @1 ^) e# W+ g* [
  29.                 // DMA模式,一次或者循环模式
    9 m2 T, D6 g- H& d  p
  30.                 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
    7 G; P$ D; }( S. ?* w! {3 J
  31.                 //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        ) V( q7 p, W/ ]9 D3 _
  32.                 // 优先级:中       
    ! G) u- w+ p- N8 m
  33.                 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; , e( T) X1 h  o9 ~5 x/ K4 l) \
  34.                 // 禁止内存到内存的传输6 H* v2 j2 R9 G0 y
  35.                 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;; U8 X! Q3 ~* u
  36.                 // 配置DMA通道                  
    ! y! M8 M; d) A' M
  37.                 DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStructure);                6 g  u' o3 {) _5 Z" h2 w
  38.                 // 使能DMA8 A) q: p. ]$ y/ V1 {
  39.                 DMA_Cmd (USART_TX_DMA_CHANNEL,ENABLE);2 n4 J! V' [4 [0 d
  40. }% L; O5 M9 Y- O; b
复制代码
7 _: u# `5 |5 r1 Y
    2.1.2、主程序
; ]* k5 z2 @$ @4 S. q
  1. int main(void)" A* x4 ?4 M9 d
  2. {; \! l& K# o: l& f' K+ m
  3.   uint16_t i;5 S* B  a  M  O' B! s; l
  4.   0 j9 W7 l9 E& T8 b' y
  5.   USART_Config();                                        /* 初始化USART */ / H, C. g# G; W: z) _* {7 |
  6.   USARTx_DMA_Config();                /* 配置使用DMA模式 */
    ( I+ r; ^' @3 L# B% o+ o# e
  7.   LED_GPIO_Config();                        /* 配置RGB彩色灯 */
    3 H$ S5 o( F8 l3 C. \

  8. & @& y* c% D  a2 o' b5 r6 o# U
  9.   printf("\r\n USART1 DMA TX 测试 \r\n");/ @3 i2 ?% q1 N5 G; c6 W" B
  10.   $ ^3 h% |$ Q- P, P6 l9 a) n
  11.   * {, m6 v' J) D
  12.   for(i=0;i<SENDBUFF_SIZE;i++)        /*填充将要发送的数据*/
    - `6 F% q: B+ O5 j/ g! R- I
  13.   {
    ) `9 F& A* b, G
  14.     SendBuff[i]         = 'P';
    5 \1 Z  ?0 w1 n  N
  15.    
    & _1 [0 A8 S  z! l$ w$ f6 R
  16.   }! n6 Z  S1 f  a
  17.   USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE);  /* USART1 向 DMA发出TX请求 */. i9 ]. ]4 G; U: {3 J: S# U

  18. " g& @( _, _  ?( J; h/ ]7 \: B
  19.   while(1)
      Y! F- S0 G, Q; |  Z8 s% `
  20.   {8 ?6 {; E: B# h. j( |9 {
  21.     LED1_TOGGLE2 j7 ^& j: [9 j/ h. r# m9 E: J
  22.     Delay(0xFFFFF);        $ K5 ?/ o7 G; V9 q( \  k$ k
  23.         }
    ; W* T- O- Z3 W5 R
  24. }
复制代码
+ V- i/ k7 B6 ]$ {, Z2 Z

1 {, T' O4 [. {$ z' M* N! W    2.1.3、程序执行结果:# M4 L2 x3 b  }( y3 f
      Q4 z" l3 E/ B; p$ x+ |+ U
        串口输出数据:% @9 s) l* S+ V) [: w
        一次输出5000个字节数据。同时板子上LED1指示灯闪烁。. E9 A9 V4 C  @2 q0 }
          2.png 0 y9 S3 ]  C- z# W# |! R' u( |
    2.1.4、程序源码7 V. V+ b. ^( O
    1 e, s% w6 ?# W
         DMA-USART1(存储器到外设).rar (299.24 KB, 下载次数: 0)
赞 收藏 评论0 发布时间:2018-12-11 21:51

举报

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