一、如何理解DMA 什么是DMA —- Directional Memory Access, 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。打个比方: 角色预设: 淘宝店主 —- STM32 MCU ;快递员 —- 外设(如UART,SPI);发货室 —- DMA 1、首先你是一个淘宝店主,如果每次发货收货都要跟快递沟通交涉会很浪费时间和精力。 1 ~8 n1 @, B4 b) H; p 2、然后你就自己建了一个发货室,发货室里有好多个货柜箱子,每个箱子上都写着快递名字(如果申通快递,顺丰快递等)。 : e# L: `. p8 l& L' [, g& C 3、每次发什么快递,你就找到对应的货柜箱子,把货物放进去即可,然后跟快递通知一声。 $ W- O2 V2 L* D1 u 4、快递取走快件。 5、如果是收货,快递直接把快件放到对应的柜子,然后通知你一下。 6、你过来提取货物。 $ G3 `+ R+ J9 u 通过上面的方式,你可以不需要直接跟快递打交道,就可以轻松发货成功,DMA处理方式跟上面例子是一样的。 如下图: 7 [5 t0 \' v" J4 j5 t' t8 z# f/ E 二、STM32 DMA 配置 DMA配置参数包括:通道地址、优先级、数据传输方向、存储器/外设数据宽度、存储器/外设地址是否增量、循环模式、数据传输量。 # u/ P( H6 L/ ^% z$ m0 U 三、Cubemx配置3 l5 G- z k5 O1 @3 T7 L 基本配置就不说了,主要配置 1.System Core: RCC——HSE设置为Crystal+ F* ]) Y) X' ]7 u0 y. c [* X - D' E: q* B6 C5 _ }/ V/ @6 _/ ` SYS——Debug设置为Serial Wire b* T: x1 B1 y0 G$ { 2.Connectivity: ' R) E4 e8 A" [3 B* r$ m# f3 l8 @ USART3——PB10对应TX、PB11对应RX6 Y) U/ e! U3 ~ $ `9 O: f% Y( \% m2 A+ I4 Z ——NVIC Settings勾选串口中断5 B% a( c) A3 S" f8 p! H ; @7 t/ L5 q7 w+ K& Q8 p ——Parameter设置9600波特率、8bit数据位、2bit停止位% f4 c+ Q+ s9 W7 M# _+ ^ " z6 {: T; a1 ]: `0 V ——DMA Settings 设置USART3_RX----DMA1 Channel 1----Peripheral To Memory USART3_TX----DMA1 Channel 1----MemoryTo Peripheral 4.Clock Configuration:1 L* j! W3 M# a$ u, { - k/ w$ g/ Z- I# v Input frequency:10-----HSE----PLLM=2---68---2——PLLCLK——APB1 Prescaler/4-----APB2 Prescaler/2- ]2 |8 [1 T: w7 v 5.Porject Manager:! I; I/ G% E1 z5 I1 P5 h Toolchain/IDE 选择MDK-ARM V5。然后点击GENERATE CODE即可 四、编程 在进入主函数之前定义数组,并在主函数while循环语句插入循环发送代码 $ P* ~. U2 O1 |2 L' A
四、测试结果 % w9 f2 J1 s e2 q' B" z 请关注下一节,通过DMA的方式接收多字节指令,并发送批量数据!!!. a5 i Z: F0 \9 R# M0 L$ Z9 e* F& o " ^; l( g& u2 B+ K 6 z1 Y6 ]3 W; k! R( m: C" G |