学习第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
+ 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- /**
$ T: l$ |1 `+ n( [ - * @brief USARTx TX DMA 配置,内存到外设(USART1->DR)
6 m6 S* I" ~% A' @2 }0 ~# F' k - * @param 无
$ [4 B# Q& o( o! m9 H - * @retval 无) ?2 r( h9 |: z- N! {
- */4 ~4 b' W3 ]( Z. \5 R6 [( \
- void USARTx_DMA_Config(void)
; T6 {6 p$ _- _6 U! |2 Y - {
, U4 \6 I8 T, h5 Q+ G" r- `9 i - DMA_InitTypeDef DMA_InitStructure;) e8 K8 I" f0 W! ^+ F; Q) g: g
-
3 C* ?) ?1 E2 |3 I2 U A+ ^ - // 开启DMA时钟
/ B- s2 u9 j+ L6 \( K; M - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
& }5 i* |4 F" I8 B - // 设置DMA源地址:串口数据寄存器地址*/0 \/ g; S& l6 {( r# p/ f
- DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
5 e1 x5 ?0 m d& J - // 内存地址(要传输的变量的指针)( a* d0 ?) p- X; Y
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;, E5 B! Z: |2 ], Q2 l( @
- // 方向:从内存到外设 & x6 b1 V m/ R$ w) ~# _6 Q
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;) q- ]' m5 s" }. x4 d8 b
- // 传输大小
2 f8 m6 D! e5 z. m - DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
z) E- ^4 |+ a) i - // 外设地址不增 6 W+ G* F; W* u. L+ Z, D; T- T, ?
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
7 W; \: v* t* `) Y+ }" X u - // 内存地址自增' ]/ |* c0 w0 i; ^! S$ ~$ i- f
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
4 C! D3 s5 z* P0 u" y5 Q - // 外设数据单位 5 E0 \( K; `1 e8 Z% |* Q2 a: s; \6 b
- DMA_InitStructure.DMA_PeripheralDataSize = 4 N# I' E( }7 A
- DMA_PeripheralDataSize_Byte;
0 i1 c9 P9 ?( P - // 内存数据单位3 R' \2 ], K4 u* {
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; / M! R& a3 x4 @: C3 @1 ^) e# W+ g* [
- // DMA模式,一次或者循环模式
9 m2 T, D6 g- H& d p - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
7 G; P$ D; }( S. ?* w! {3 J - //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; ) V( q7 p, W/ ]9 D3 _
- // 优先级:中
! G) u- w+ p- N8 m - DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; , e( T) X1 h o9 ~5 x/ K4 l) \
- // 禁止内存到内存的传输6 H* v2 j2 R9 G0 y
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;; U8 X! Q3 ~* u
- // 配置DMA通道
! y! M8 M; d) A' M - DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStructure); 6 g u' o3 {) _5 Z" h2 w
- // 使能DMA8 A) q: p. ]$ y/ V1 {
- DMA_Cmd (USART_TX_DMA_CHANNEL,ENABLE);2 n4 J! V' [4 [0 d
- }% L; O5 M9 Y- O; b
复制代码 7 _: u# `5 |5 r1 Y
2.1.2、主程序
; ]* k5 z2 @$ @4 S. q- int main(void)" A* x4 ?4 M9 d
- {; \! l& K# o: l& f' K+ m
- uint16_t i;5 S* B a M O' B! s; l
- 0 j9 W7 l9 E& T8 b' y
- USART_Config(); /* 初始化USART */ / H, C. g# G; W: z) _* {7 |
- USARTx_DMA_Config(); /* 配置使用DMA模式 */
( I+ r; ^' @3 L# B% o+ o# e - LED_GPIO_Config(); /* 配置RGB彩色灯 */
3 H$ S5 o( F8 l3 C. \
& @& y* c% D a2 o' b5 r6 o# U- printf("\r\n USART1 DMA TX 测试 \r\n");/ @3 i2 ?% q1 N5 G; c6 W" B
- $ ^3 h% |$ Q- P, P6 l9 a) n
- * {, m6 v' J) D
- for(i=0;i<SENDBUFF_SIZE;i++) /*填充将要发送的数据*/
- `6 F% q: B+ O5 j/ g! R- I - {
) `9 F& A* b, G - SendBuff[i] = 'P';
5 \1 Z ?0 w1 n N -
& _1 [0 A8 S z! l$ w$ f6 R - }! n6 Z S1 f a
- USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE); /* USART1 向 DMA发出TX请求 */. i9 ]. ]4 G; U: {3 J: S# U
" g& @( _, _ ?( J; h/ ]7 \: B- while(1)
Y! F- S0 G, Q; | Z8 s% ` - {8 ?6 {; E: B# h. j( |9 {
- LED1_TOGGLE2 j7 ^& j: [9 j/ h. r# m9 E: J
- Delay(0xFFFFF); $ K5 ?/ o7 G; V9 q( \ k$ k
- }
; W* T- O- Z3 W5 R - }
复制代码 + 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 }
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)
|