STMCU小助手
发布时间:2022-12-25 13:11
|
DMA概述 Direct Memory Access : |/ ]# |! @7 Q- _6 a 直接存储器访问 + f; E# Y/ D8 N DMA传输将数据从一个地址空间复制到另一个地址空间 6 k" n+ J) l+ y$ e4 q0 h 由CPU初始化这个DMA传输动作,动作本身由DMA控制器完成 DMA传输通过硬件为RAM和IO设备之间开辟一条直接传输数据的通道,提高了CPU的运行效率 5 I# I# [3 i3 ^- ]' Q; U. M7 e, J & Y+ |1 |# |$ M6 S2 u7 @5 Y% o8 T STM32中的DMA$ W& f# D- r7 T4 p2 S2 j# } STM32最多有2个DMA控制器,其中大容量产品有2个DMA控制器,小容量产品只有1个: s; Q" j% h/ O6 x6 K ' \; m) P& o' ?6 Q DMA1有7个通道,DMA2有5个通道 每个通道专门用来管理来自于一个或多个外设对存储器访问的请求 ) @! s; k( M3 M; {6 `1 w; ~5 W0 r3 t 还有一个仲裁协调各个DMA请求的优先权
# b- i( L6 x: H1 u- ^" U. N STM32的DMA具有以下特征: C \" m3 y5 k( r7 \ 每个通道都直接连接专用的硬件DMA请求,支持软件触发,可以通过软件进行配置* v# v; U% l3 B+ x 优先级可以通过软件编程设置,共4级3 n+ t& l5 _6 [ 独立的源和目标数据区的传输宽度,模拟打包和拆包过程,源和目标地址必须按数据传输宽度对齐 支持循环的缓冲器管理 每个通道都有3个事件标志(DMA半传输,DMA传输完成,DMA传输出错),这3个事件都可以成为单独的中断 外设和存储器,存储器和外设,存储器和存储器之间! F" d! N' P x3 B; O' W 存储包括:FLASH,SRAM,外设的SRAM0 e6 a/ J9 O1 ^, e h 外设包括:APB1,APB2和AHB 可编程的数据传输数目:最大为65536& d9 s1 O4 @2 h 7 ?* n2 {7 @2 i, Q* M! R, N DMA的通道 J2 E6 l+ Q# \9 D' j9 O& ` DMA1有7个通道
2 z$ j" H* s6 q) S
3 y) E# ~6 g6 i6 N# }' y' [4 b DMA处理 在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求2 c1 R, w! f# z 当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给他一个应答信号 W0 J; U6 I& q0 Z$ M: B. H & L6 _. C: [+ |: f/ z0 } 当从DMA控制器得到应答信号时,外设立即释放它的请求,一旦释放了这个请求,DMA控制器同时撤销应答信号 ) G3 `; o. v& ^ 每次DMA传送由3个操作完成: DMA_CPARx存储的是外设的基地址,DMA_CMARx存储额是存储器的基地址,这两个要先赋值好 DMA_CNDTRx包含未完成操作的数目,在DMA_CNDTRx寄存器中,每完成一次发送,这个DMA_CNDTRx寄存器的值会减 : T0 l2 O& x4 c& o+ X/ S ( i/ l. n9 G3 H- k. m- F3 P1 e, j 数据传输方向9 W2 ~+ T/ x, @8 o6 M% P DMA_CCRx寄存器 DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)1 k3 E- C6 F: r1 b8 ` 5 }7 ]" f, M- W& M! M, @6 `& |
) P3 j5 \. |' }; M0 p 1 H8 b4 r( ~9 V4 I9 ? 仲裁器 DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)2 i) M: x5 |' z" D7 K Q0 n 同样是在这个寄存器,可以配置通道的优先级
可编程的数据量* R" W& S. c& ]% @" o8 ~+ T DMA通道x配置寄存器(DMA_CCRx)(x = 1...7) 源和目标的数据宽度一致时是最方便的9 X! _- J! ?/ }# f
指针增量9 x+ z, m u& R" n
; Q: G& I) Y& ` # Z) f# L6 B3 S* `( _. V7 u5 Z 存储器到存储器 g9 W% n; s$ Q& d 还需要设置DMA_CCRx的MEM2MEM位* p( h3 i# X$ C* I* i: x; d + |8 c/ T5 t; S- b. K ' |6 k3 f' c+ R 通道传输数据量' L: H) {2 {$ S6 r 在DMA_CNDTRx寄存器中配置,虽然这是一个32的寄存器,但是只用到了低16位,所以最大数据量为2的16次方-1. v. f( A- k" B- M3 o
# a4 |5 U% m4 f+ D* N7 `: F 中断
) A" X' @2 |) k8 S# j2 P+ w* m1 G& X* P 通道的配置过程5 `0 V& L4 B1 y6 P" h; l 1. 设置DMA_CPARx(外设地址)和DMA_CMARx(存储器地址)的值5 j& I( i E; k: y7 R/ B 2. 设置传输方向,通过DMA_CCRx寄存器0 O" \9 p) }; I2 S 3. 设置传输数据量,在DMA_CNDTRx寄存器" p7 K! a# q X* l5 j: C; { 4. 设置传输优先级,在DMA_CCRx寄存器中 , U1 N% q# |, d) O2 Q% u" b 5. 设置是否循环模式,外设和存储器的增量模式 , G. b2 ?' [6 M$ p4 | 6. 数据宽度,中断配置,5和6都是在DMA_CCRx寄存器中进行配置 7. 在DMA_CCRx寄存器中进行ENABLE位的配置: G: I- H. F! y8 ~# B 当传输一半的数据后,半传输标志HTIF为1,当设置了允许半传输中断位HTIE时,将产生中断请求。在传输数据结束后,传输完成标志TCIF为1,当设置了允许传输完成中断位TCIE后,将产生一个中断请求/ M3 R! K! L+ w ' f. E" n; E2 n4 C DMA相关函数配置 DMA_Init% x9 M3 T/ D; s* V; n8 D( V
1 ?6 I0 E) `5 i7 D DMA_Cmd : g7 `7 h. _9 X
DMA_ITConfig * `& i; T* o9 v5 U- a6 i" y% l
: e! i" {: n' a& P: b3 Q" R DMA_SetCurrDataCounter0 X# k. c: f8 P+ q \! Q* N
& E( L$ v9 p5 k( A% _ DMA_GetCurrDataCounter( w, o+ j- E: n1 g/ K
DMA_GetFlagStatus5 o7 P+ T& Y, ?0 B& W: I - @! F# z0 v& X( o! ~ ~
DMA_ClearFlag
- K" {* P7 K( | DMA_GetITStatus * e2 B+ K- L( V% B& G# U' V
DMA_ClearITPendingBit" o. G6 T" |9 p* T
8 m2 s+ [7 z; U, f 常用的外设DMA使能库函数" `' I4 u8 X/ q ADC / }1 s7 c7 G* o1 H
6 A( m6 H! N8 L3 \3 f* b8 ~: U DAC * D# ~" q h6 @3 S
7 q9 U; {$ y" N( ~4 R$ C; U6 t USART# j% e: A8 w6 {4 D# h9 e w9 [8 f$ z* L7 M- C( Y) O $ b; a: W/ z5 ^% k
, a3 F- R" @. F- d; Y, J( D B* H I2C8 {# F' N5 w) B' s, c
$ z5 j- t9 F6 I9 A- [; k. n' k& v. Z TIM $ e: P$ V: H! r5 c A- E6 E
. \! b* W% F `- W2 ~ 8 G) C% M+ G6 y6 }2 f& C4 Q DMA的初始化配置
; J! O, I- r* U+ q. p
1. 使能DMA时钟 2. 初始化DMA通道参数 3. 使能DMA发送,使能外设DMA使能函数4 s; a/ e' b5 g, c p! a3 U 4. 使能DMA通道,启动传输 5. 查询DMA传输状态: Y$ u( }4 P# k5 a/ }/ A! b 6. 获取或设置通道当前剩余数据量+ M! n2 p+ q1 w8 |# P9 q# l ———————————————— 版权声明:CodeForCoffee |
经验分享 | 通过STM32 TIMER的PWM功能模拟输出正弦波
SPI 32位宽DMA方式收发失败问题
多通道DMA传输为何有一路异常?
经验分享 | STM32N6 ADC DMA 传输失败案例分享
经验分享 | DMA发送函数只能第一次调用有效?
经验分享 | 使用EXIT0同步触发SPI的DMA发送话题
【开发经验】LAT1500 如何通过DMA配合CRC功能
我心中的ST中文论坛
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | 使用GPIO+DMA+TIM模拟SPI通信演示
微信公众号
手机版