直接存储器存取(DirectMemoryAccess,DMA)详细讲解⼀、理论理解部分。
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 收到请求信号之后,
notificationssober是什么意思控制器会给外设⼀个应答信号,当外设应答后且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 传输数据的⽅向有三个:从外设到存储器,从存储器到外设,从存储器到存储器。
长沙英语培训具体的⽅向DMA_CCR 位4 DIR 配置:0 表⽰从外设到存储器,1 表⽰从存储器到外设。
这⾥⾯涉及到的外设地址由DMA_CPAR 配置,存储器地址由DMA_CMAR 配置。
要传多少,单位是什么
当我们配置好数据要从哪⾥来到哪⾥去之后,我们还需要知道我们要传输的数据是多少,数据的
单位是什么。以串⼝向电脑发送数据为例,我们可以⼀次性给电脑发送很多数据,具体多少由
DMA_CNDTR 配置,这是⼀个32 位的寄存器,⼀次最多只能传输65535 个数据。要想数据传输正
确,源和⽬标地址存储的数据宽度还必须⼀致,串⼝数据寄存器是8 位的,所以我们定义的要发送的
数据也必须是8 位。外设的数据宽度由DMA_CCR 的PSIZE[1:0]配置,可以是8/16/32 位,存储器
经济学人中文网的数据宽度由DMA_CCR 的MSIZE[1:0]配置,可以是8/16/32 位。
在DMA 控制器的控制下,数据要想有条不紊的从⼀个地⽅搬到另外⼀个地⽅,还必须正确设置
两边数据指针的增量模式。外设的地址指针由DMA_CCRx 的PINC 配置,存储器的地址指针由
MINC 配置。以串⼝向电脑发送数据为例,要发送的数据很多,每发送完⼀个,那么存储器的地址指
针就应该加1,⽽串⼝数据寄存器只有⼀个,那么外设的地址指针就固定不变。具体的数据指针的增量
模式由实际情况决定。
什么时候传输完成
数据什么时候传输完成,我们可以通过查询标志位或者通过中断的⽅式来鉴别。每个DMA 通道
someway在DMA 传输过半、传输完成和传输错误时都会有相应的标志位,如果使能了该类型的中断后,则会
camus产⽣中断。有关各个标志位的详细描述请参考DMA 中断状态寄存器DMA_ISR 的详细描述。传输完
成还分两种模式,是⼀次传输还是循环传输,⼀次传输很好理解,即是传输⼀次之后就停⽌,要想再传
输的话,必须关断DMA 使能后再重新配置后才能继续传输。循环传输则是⼀次传输完成之后⼜恢复
第⼀次传输时的配置循环传输,不断的重复。具体的DMA_CCR 寄存器的CIRC 循环模式位控制。
⼆、编程要⽤的成员:
1、DMA_DIR:传输⽅向选择,可选外设到存储器、存储器到外设。它设定DMA_CCR 寄存器的DIR[1:0]位的值。这⾥并没有存储器到存储器的⽅向选择,当使⽤存储器到存储器时,只需要把其中⼀个存储器当作外设使⽤即可。
(DMA_DIR_PeripheralDST:外设作为数据传输的⽬的地
DMA_DIR_PeripheralSRC:外设作为数据传输的来源)safe hou>矍铄
2、DMA_PeripheralInc:
DMA_MemoryInc= //内存地址寄存器递增与否
last christmas taylor swift
DMA_PeripheralInc= //外设地址寄存器递增与否
如果配置DMA_PeripheralInc_Enable,使能外设地址⾃动递增功能,它设定DMA_CCR 寄存器的PINC 位的值;⼀般外设都是只有⼀个数据寄存器,所以⼀般不会使能该位。(⾃动递增的意思就是:相当路边的⾃动出售饮料机器⼀样,当你买了⼀瓶汽⽔,拿出来了,然后后⾯有⾃动补上去,这就是⾃动递增,这⾥的数据也是⼀样,始终拿第⼀个数据,其他的会⾃动递增上来,不好意思,由于理解错误,现在做⼀下修改:是拿⽔瓶的⼿是)
3、DMA_BufferSize= //设定待传输数⽬
4、DMA_M2M= //使能DMA通道的内存到内存传输
5、DMA_MemoryBaAddr= //存储器地址
6、DMA_MemoryDataSize= //内存数据宽度
7、DMA_PeripheralDataSize= //外设数据宽度
8、DMA_Mode= //⼯作模式,优先级
9、DMA_PeripheralBaAddr= //外设地址
10、DMA_Priority= //软件设置通道的优先级
>成长兔英语