原创 PIC24HJ单片机自学笔记_DMA

2013-12-19 10:10 1707 13 13 分类: MCU/ 嵌入式 文集: PIC24HJ单片机自学笔记

鉴于之前对DMA一点印象都没有,先百度一下扫盲:

DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于 CPU 的大量中断负载。
否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。
从DMA的寄存器映射表可以看出,DMA相关的寄存器很多:
 
20131219065219291.jpg
 
20131219065253395.jpg
 to be continue
 *
先看官方提供的头文件,定义了:
#define DMA0CON_VALUE 0x0000
 
手册中定义了DMAXCON:
 
20131219065310502.jpg
通道使能,通道数据的类型,方向,传输完一半产生中断,除DMA之外其他数据无效,DMA三种模式,DMA四种模式位
具体宏定义如下所示:
#define DMA1_MODULE_ON 0xFFFF /* DMA on */
#define DMA1_MODULE_OFF 0x7FFF /* DMA off */
 
 
#define DMA1_CONTINUOUS 0xFFF0 /* Continuous Ping-Pong modes disabled */
 
第二个寄存器:DMAxREQ
 
20131219065328252.jpg
第一位的定义如下:
#define DMA0_MANUAL 0xFFFF /* Force a single DMA transfer (Manual Mode)*/
#define DMA0_AUTOMATIC 0x7FFF /* Automatic DMA transfer initiation by DMA request*/
后面的7位定义127种IRQ号:
 
20131219065345439.jpg
有两个状态寄存器来设置冲突检测等信息,
然后定义了优先级
后面使能中断和设置优先级的宏定义,如下:
#define DMA0_INT_ENABLE 0xFFFF
#define DMA0_INT_DISABLE 0xFFEF
 
/* Macros to Enable/Disable interrupts and set Interrupt priority for DMA0 */
 
#define EnableIntDMA0 IEC0bits.DMA0IE = 1
#define DisableIntDMA0 IEC0bits.DMA0IE = 0
#define SetPriorityIntDMA0(priority) IPC1bits.DMA0IP = (priority)
后面是函数定义,具体的函数列表如下:
开始看一下PIC24HJ_DMA的资料 
DMA是PIC高性能DSC家族重要的一个子系统。
DMA是外设和RAM的一个桥梁,利用DMA的典型优势下面有介绍:
 
20131219065441751.jpg
比如RTSP的时候,CPU无需参与,直接交给DMA就行了,这个很赞。
 
20131219065509260.jpg
PIC24HJ带有8个独立的DMA通道,可以用来配置如下资源:
 
20131219070521975.jpg
每一个通道有如下的寄存器组(6个寄存器):
控制寄存器:上面有描述
REQ:中断向量寄存器
两个RAM开始地址偏移值寄存器
外设数据地址寄存器
DMA发送数量寄存器
 
个别的还有如下三个状态寄存器:
最近的DMA RAM地址寄存器
两个只读的控制状态寄存器,其中
CS0包括8个外设写冲突标志,8个DPRAM写冲突标志
CS1有四位来表示最后一个活动的是哪个通道,还有8位来表示ping-pong模式的状态,为1选择STB,为0选择STA
 
20131219065837814.jpg
上面是DMA在内部的一个框图,可以看出,带DMA接口的外设可以通过CPU外设总线和CPU通信,CPU再通过SRAM总线与SRAM和DPSRAM通信,而
带DMA的外设有一个DMA端口,通过DMA总线与DMA控制器通信,并通过此条总线连接DPSRAM.
这里可以看到,DPSRAM作为一个独立的RAM区间,地址分配如下:
 
20131219065907933.jpg
这里可以看出,8K RAM的器件包括了2K的DMA RAM
20131219070441479.jpg
DMA数据传送:例如
 
A:通道5被配置用来作为DMA通信
B:一个DMA请求,有外设数据需要获取
C:从外设获取数据
D:DMA将数据写入DPRAM
 
DMA配置:
争取的配置如下:
DMA链接外设
这个很显然,我已经开放了通道5,谁需要使用,先要告诉我你是谁,也就是你的向量号。
同时,我获得数据以后,交给谁,你得告诉我地址。这个跟快件类似:
 
20131219070127555.jpg
外设正确配置
外设要正确的配置好,在下面的表格中有简单说明,如:
 
20131219070211706.jpg
比如要配置UART,考虑下面的内容进行配置:
 
20131219070243572.jpg
在资料后面有对每一种DMA的操作有一个例程。
 
DPRAM的数据开始地址初始化
DMAXSTA和DMAXSTB的用武之地来了 :
 
20131219070311870.jpg
上面的地址比较麻烦,C30在此基础上进行了优化:
 
20131219070341302.jpg
传送数量必须初始化
传送数据的格式和个数要进行初始化,为0表示能够传送一个数据。
 
设置正确的地址和操作模式
操作模式在下面有详细的介绍。
 
DMA操作模式:
一共有11种模式:
1、word还是byte传输
显然,WORD的数据只能存放在偶地址,如果POST_INCREMENT设置为0,并且工作在word模式,则地址自动每次+2,byte则+1
 
2、方向
配置好以后,channel成为单向通道,读写的话,需要两个DMA通道。
 
3、全读取中断还是半读取中断
如果采用半读取,则可以通过CPU不断的读取和DMA写入,比如用于AD转换的时候。
 
4、自动地址++模式
5、地址不自动++模式,可以和模式4组合使用
 
6、外设间接地址模式:这种模式下,由外设来提供DPRAM的地址。
 
7、一次性传送模式,这种模式写完一组数据以后,通道自动disable
 
8、连续发送模式:这种模式和一次性传送模式相对应。传完以后,复位,继续传送。
 
9、ping-pong模式
 
10、手动模式
11、空数据模式
 
 
 

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条