一、理论理解部分。 1、直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 2、无须CPU干预,数据可以通过DMA快速移动,这就节省了CPU的资源来做其他操作。 3、两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自一个或者多个外设对存储器访问的请求。 4、还有一个冲裁器协调各个DMA请求的优先权。在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中和低),优先权设置相等时由硬件决定(请求0优先请求1,) 5、每个通道都有三个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这三个事件标志逻辑或成为一个单独的中断请求。 6、闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。 7、可编程的数据传输数目:最大为65535 8、如果外设要想通过DMA 来传输数据,必须先给DMA 控制器发送DMA 请求,DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且DMA 控制器收到应答信号之后,就会启动DMA 的传输,直到传输完毕。DMA 有DMA1 和DMA2 两个控制器,DMA1 有7 个通道,DMA2有5 个通道,不同的DMA 控制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置,具体见DMA 请求映像表。
9、 仲裁器当发生多个DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器也管理。仲裁器管理DMA 通道请求分为两个阶段。第一阶段属于软件阶段,可以在DMA_CCRx 寄存器中设置,有4 个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段,如果两个或以上的DMA通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道0 高于通道1。 (为了解决多个DMA请求时,就有先后顺序,有一个仲裁器管理,分为两部分:1、软件处理,可以设置非常高、高、中、和低四个优先级,2、优先级一样,则看他们的编号,编号越低优先权越高)
DMA数据配置的详细解说: 使用DMA,最核心就是配置要传输的数据,包括数据从哪里来,要到哪里去,传输的数据的单位 这里面涉及到的外设地址由DMA_CPAR 配置,存储器地址由DMA_CMAR 配置。
要传多少,单位是什么
二、编程要用的成员:
1、DMA_DIR : 传输方向选择, 可选外设到存储器、存储器到外设。它设定DMA_CCR 寄存器的DIR[1:0]位的值。这里并没有存储器到存储器的方向选择, 当使用存储器到存储器时,只需要把其中一个存储器当作外设使用即可。 (DMA_DIR_PeripheralDST:外设作为数据传输的目的地 DMA_DIR_PeripheralSRC:外设作为数据传输的来源) 2、DMA_PeripheralInc: DMA_MemoryInc= //内存地址寄存器递增与否 如果配置DMA_PeripheralInc_Enable,使能外设地址自动递增功能,它设定DMA_CCR 寄存器的PINC 位的值;一般外设都是只有一个数据寄存器,所以一般不会使能该位。(自动递增的意思就是:相当路边的自动出售饮料机器一样,当你买了一瓶汽水,拿出来了,然后后面有自动补上去,这就是自动递增,这里的数据也是一样,始终拿第一个数据,其他的会自动递增上来,不好意思,由于理解错误,现在做一下修改:是拿水瓶的手是) 3、DMA_BufferSize= //设定待传输数目 4、DMA_M2M= //使能DMA通道的内存到内存传输
|
|
来自: 曹金龙n8fcuihm > 《待分类》