历史上的今天
返回首页

历史上的今天

今天是:2025年01月19日(星期日)

正在发生

2021年01月19日 | MSP430 DMA程序库

2021-01-19 来源:eefocus

直接存储器存取(DMADirect Memory Access)方式是用硬件实现存储器与存储器之间或存储器与IO设备之间直接进行高速数据传送,不需要CPU的干预。这种方式通常用来传送数据块。MSP430f16x系列单片机内部含有DMA模块,而且几乎内部所有外设都可以触发DMA开始存取数据。这里实现了这个模块的程序通用的函数库,方便使用。


  1. 硬件介绍:

    MSP430F15X/16X 系列单片机具有DMA 控制器,从而能够为数据高速传输提供保证。例如,通过DMA控制器可以直接将ADC 转换存贮器的内容传到RAM 单元。


  2. MSP430系列单片机扩展的DMA具有来之所有外设的触发器,不需要CPU的干预即可提供先进的可配置的数据传输能力,从而加速了基于MCU的信号处理进程,DMA传输的触发来源对CPU 来说是完全透明的,DMA控制器可在内存与外部及外部硬件之间进行精确的传输控制。DMA 消除了数据传输延迟时间以及各种开销,从而可以解放16为RISC CPU,以便其将更多的时间用于处理数据,而非执行正在处理的任务。


  3. MSP430F16x系列单片机的DMA模块有以下特点:数据传送不需要CPU介入,完全由DMA控制器自行管理。在整个地址空间范围内传输数据,块方式传输可达65536字节;能够提高片内外设数据吞吐能力,实现高速传输,每个字或者字节的传输仅需要2个MCLK;减少系统功耗,即使在片内外设进行数据输入或输出时,CPU也可以处于超低功耗模式而不需唤醒;字节和字数据可以混合传送:DMA传输可以是字节到字节、字到字、字节到字或者字到字节。当字到字节传输时,只有字中较低字节能够传输,当从字节到字传输时,传输到字的低字节,高字节被自动清零;四种传输寻址模式:固定地址到固定地址、固定地址到块地址、块地址到固定地址以及块地址到块地址;触发方式灵活:边沿或者电平触发。单个、块或突发块传输模式:每次触发DMA操作,可以根据需要传输不同规模的数据


  4. DMA的四种寻址模式如下图所示:

    image

    DMA控制器模块:3个独立的传输通道:通道0、通道1和通道2。每个通道都有源地址寄存器、目的地址寄存器、传送数据长度寄存器和控制寄存器。每个通道的触发请求可以分别允许和禁止;可配置的通道优先权:优先权裁决模块,传输通道的优先级可以调整,对同时有触发请求的通道进行优先级裁决,确定哪个通道的优先级最高。MSP430的DMA控制器可以采用固定优先级,还可以采用循环优先级。程序命令控制模块,每个DMA通道开始传输之前,CPU要编程给定相关的命令和模式控制,以决定DMA通道传输的类型;可配置的传送触发器:触发源选择模块,DMAREQ(软件触发)、Timer_ACCR2输出、Timer_BCCR2输出、I2C 数据接收准备好、I2C 数据发送准备好、USART接收发送数据、DAC12模块DAC12IFG、ADC12模块的ADC12IFGx、DMAxIFG、DMAE0 外部触发源。并且还具有触发源扩充能力。


  5. DMA有六种传输模式:单字或者单字节传输;块传输;突发块传输;重复单字或者单字节传输;重复块传输;重复突发块传输。前三个,传输完成后DMAEN自动复位;再次传输时需要重新置位DMAEN位以使能DMA通道。后三个为重复模式,一次传输完成后,DMAEN不复位;再次出发时,可以再次启动数据传输。六种传输模式通过DMADTx寄存器设置:


DMADTx      Transfer Mode               Description

000         Single transfer             Each transfer requires a trigger. DMAEN is

                                        automatically cleared when DMAxSZ transfers have

                                        been made.

001         Block transfer              A complete block is transferred with one trigger.

                                        DMAEN is automatically cleared at the end of the

                                        block transfer.

010, 011    Burst-block transfer        CPU activity is interleaved with a block transfer.

                                        DMAEN is automatically cleared at the end of the

                                        burst-block transfer.

100         Repeated single transfer    Each transfer requires a trigger. DMAEN remains

                                        enabled.

101         Repeated block transfer     A complete block is transferred with one trigger.

                                        DMAEN remains enabled.

110, 111    Repeated burst-block        CPU activity is interleaved with a block transfer.

            transfer                    DMAEN remains enabled.


  1. 单字或者单字节传输:DMA 通道被定义为单字或者单字节传输模式,每个字或者字节的传输都要触发信号触发。设置DMADTx=0 就定义了单字或者单字节传输模式,规定的传输完毕后DMAEN 位自动清除,如果需要再次传输,必须重新置位DMAEN。如果设置DMADTx=4 为重复单字或者单字节传输模式,DMAEN 位一直保持置位,每次触发伴随一次传输。DMAxSZ 寄存器保存传输的单元个数,如果该寄存器为0,则没有传输。传输之前DMAxSZ 寄存器的值写入到一个临时的寄存器中,每次操作之后DMAxSZ 做减操作。当DMAxSZ减为零的时候,它所对应的临时寄存器将原来的值重新置入DMAxSZ,同时相应的DMAIFG标志置位。


  2. 块传输模式:在块传输模式,每次触发可以传输一个数据块。设置DMADTx=1 为块传输模式,每个数据块传输完毕,DMAEN 位自动清除,在触发传输下一个数据块之前,该位要被重新置位。在传输某个数据块期间,其他的传输请求将被忽略。设置DMADTx=5 为重复块传输模式,某个数据块传输完毕,DMAEN 位仍然保持置位,之后,新的触发可以引起又一次数据块传送。DMAxSZ 寄存器保存数据块所包含的单元个数。DMASRCINCR 和DMADSTINCR 反映在数据块传输过程中的目的地址和源地址的变化情况。在块传输或者重复块传输过程中,DMAxSA,DMAxDA,DMAxSZ 寄存器的值写入到对应的临时寄存器中,DMAxSA,DMAxDA寄存器所对应的临时值在块传输过程中增加或者减少,而DMAxSZ 在块传输过程中减计数,始终反映当前数据块还有多少单元没有传输完毕,当DMAxSZ 减为0,它所对应的临时寄存器将原来的值重新置入DMAxSZ,同时相应的DMAIFG被置位。在块传输过程中,CPU 暂停工作,不参与数据的传输。数据块需要2×MCLK×DMAxSZ 个时钟周期。当每个数据块传输完毕,CPU 按照暂停前的状态重新开始执行。


  3. 突发块传输模式:这个和块传输模式类似,只不过每传输4个字或字节,DMA释放内部总线,CPU运行2个MCLK周期;在传输过程中CPU有20%的执行时间,而块传输需要等DMA完全传送完之后,CPU方能运行。


  4. DMA触发源:每个通道的触发源有DMAxTSELx位进行控制的,这些位必须在DMAEN位为0是进行设置,否则可能出现不可预料的DMA触发。


DMAxTSELx   Operation

0000        DMAREQ bit (software trigger)

0001        TACCR2 CCIFG bit

0010        TBCCR2 CCIFG bit

0011        URXIFG0 (UART/SPI mode), USART0 data received (I2C mode)

0100        UTXIFG0 (UART/SPI mode), USART0 transmit ready (I2C mode)

0101        DAC12_0CTL DAC12IFG bit

0110        ADC12 ADC12IFGx bit

0111        TACCR0 CCIFG bit

1000        TBCCR0 CCIFG bit

1001        URXIFG1 bit

1010        UTXIFG1 bit

1011        Multiplier ready

1100        No action

1101        No action

1110        DMA0IFG bit triggers DMA channel 1

            DMA1IFG bit triggers DMA channel 2

            DMA2IFG bit triggers DMA channel 0

1111        External trigger DMAE0


  1. 另外,单片机的中断程序不影响DMA的传输,当DMA传输过程中,单片机不响应中外部NMI中断(必须DMA的控制位ENNMI位为1时响应NMI中断,否则不予处理)外的所有中断;必须等待DMA数据传送结束之后才运行系统的中断处理程序。

    DMA的中断:数据传送过程中,DMAxSZ寄存器值减为0时,DMA置位DMAIFG,DMA的中断和DAC12模块共享中断向量,使用中断时需要软件判断具体是那个中断。中断响应后DMAIFG不会自动复位,使用时必须软件清零DMAIFG位。

    DMA的寄存器如下:


Register                            Short Form      Register Type   Address     Initial State

DMA control 0                       DMACTL0         Read/write      0122h       Reset with POR

DMA control 1                       DMACTL1         Read/write      0124h       Reset with POR

DMA channel 0 control               DMA0CTL         Read/write      01E0h       Reset with POR

DMA channel 0 source address        DMA0SA          Read/write      01E2h       Unchanged

DMA channel 0 destination address   DMA0DA          Read/write      01E4h       Unchanged

DMA channel 0 transfer size         DMA0SZ          Read/write      01E6h       Unchanged

DMA channel 1 control               DMA1CTL         Read/write      01E8h       Reset with POR

DMA channel 1 source address        DMA1SA          Read/write      01EAh       Unchanged

DMA channel 1 destination address   DMA1DA          Read/write      01ECh       Unchanged

DMA channel 1 transfer size         DMA1SZ          Read/write      01EEh       Unchanged

DMA channel 2 control               DMA2CTL         Read/write      01F0h       Reset with POR

DMA channel 2 source address        DMA2SA          Read/write      01F2h       Unchanged

DMA channel 2 destination address   DMA2DA          Read/write      01F4h       Unchanged

DMA channel 2 transfer size         DMA2SZ          Read/write      01F6h       Unchanged


  1. 有关每个寄存器的详细内容参考ti提供的用户指南。

  2. 程序实现:

    DMA的使用主要是DMA寄存器的初始设置,设置完成后,DMA接到触发信号即可自动传输数据。

    设置函数如下:


void DMAInit(char channel,char trigger,char transMode,char srcMode,char dstMode,             unsigned int src,unsigned int dst,unsigned int size)

{    unsigned int *DMAxCTL,*DMAxSA,*DMAxDA,*DMAxSZ;

    

    DMACTL0 = trigger << (channel << 2);

    DMACTL1 = 0x04;         //DMA收到触发请求时,等待当前指令执行完成后    

    switch (channel)        //选择当前设置哪个DMA通道    {        case 0: 

            DMAxCTL = (unsigned int *)&DMA0CTL;

            DMAxSA = (unsigned int *)&DMA0SA;

            DMAxDA = (unsigned int *)&DMA0DA;

            DMAxSZ = (unsigned int *)&DMA0SZ;            break;                                      //指针 = 0通道控制        case 1: 

            DMAxCTL = (unsigned int *)&DMA1CTL;

推荐阅读

史海拾趣

Collins Electronics Corp公司的发展小趣事

Collins Electronics Corp的创始人在电子领域拥有深厚的背景和丰富的经验。在公司创立初期,他们发现市场上的电子设备在性能和稳定性上存在巨大的提升空间。于是,他们决定创立一家公司,专注于研发和生产高品质的电子设备。经过多次试验和改进,Collins Electronics Corp推出了他们的首款产品,一款高性能的信号放大器。这款产品凭借其卓越的性能和稳定性,在市场上获得了极大的成功,也为公司的后续发展奠定了坚实的基础。

爱普特微(aptchip)公司的发展小趣事

创立不久,爱普特微电子便迎来了一次重大的技术突破。公司成功研发出了全国产、全自主可控、高可靠性的32位微处理器芯片。这一产品的推出,不仅填补了国内市场的空白,更以其卓越的性能和稳定性,赢得了市场的广泛认可。随后,公司又基于自研IP库及RISC架构内核,量产了一系列全国产高可靠性32位MCU产品,广泛应用于工业控制、物联网、智能家电等领域。

Cliff Electronic Components公司的发展小趣事

爱普特微电子(APTCHIP)的创立,可追溯到XXXX年。由一群半导体行业集成电路设计领域的资深人士联合发起,他们看到了中国微处理器市场的巨大潜力和发展空间。这些专家怀揣着技术创新和自主可控的梦想,在深圳这片创新热土上,共同创立了爱普特微电子。从创立之初,公司就明确了自己的目标——成为中国最好的MCU(微控制器)公司。

GC Electronics公司的发展小趣事
定期清洁传感器和冷却系统,防止污垢或杂质影响传感器的正常工作。
Datatronic公司的发展小趣事

Datatronic公司深知人才是企业发展的核心。因此,公司一直注重人才的培养和引进。公司建立了完善的人才培训体系,为员工提供广阔的发展空间和机会。同时,公司还积极引进国内外优秀人才,为公司的技术创新和市场拓展提供了有力支持。这些举措使得Datatronic公司在人才方面形成了竞争优势。

CQR SECURITY公司的发展小趣事

随着电子行业的快速发展,网络安全问题日益突出。CQR SECURITY公司敏锐地捕捉到了这一市场机遇,迅速调整战略方向,专注于提供针对电子设备的安全保护服务。公司研发了一系列高效的安全产品,有效应对了各类网络攻击和数据泄露事件。在不断应对行业挑战的过程中,CQR逐渐积累了丰富的安全实践经验,并赢得了客户的信赖和认可。

问答坊 | AI 解惑

开发板-哪里的好?

开发板-哪里的好? 初学者的第一步就是要有块开发板 自己动手、丰衣足食是一条路 买块现成的,也是一条路 这里说后一条路 网上开发板,琳琅满目, 价格上,几十元到几百元, 商家,有个体户,有规范的公司..... 行业中,叫的响的,在哪里? ...…

查看全部问答>

【EEWORLD】救火车和你一起学ARM系列活动全部地址链接

恭喜救火车已经注册公司,全称是秦皇岛千目电子有限公司。 【EEWORLD】救火车和你一起学ARM系列活动之一(发起活动和组建工作环境) 【EEWORLD】救火车和你一起学ARM系列活动之二(最小系统电路和建立第一个软件工程)  【EEWORLD】救火车和 ...…

查看全部问答>

[转帖]探讨正确安装防盗报警探测器的方法

防盗报警探测器的安装过程是一个需费心又费时的过程,并不是按着说明书将其安装固定到建筑物体上,稍稍目测下探测方位以及适度调试下角度就算可以了。 管线的敷设         在过往的工程实践中,大家会发现部分防盗 ...…

查看全部问答>

Help!PPC项目如何访问WebService

    我目前在开发一个基于windows mobile6的PPC项目,为其添加了一个Web Service引用,当然引用走的是公网的IP地址220开头的。     当我测试的时候我发现当手机和PC通过USB连接的时候,PPC项目是可以访问到这个webservice的, ...…

查看全部问答>

2440ce5的bsp移植到ce6的SMFLASH问题

ce5下bsp是好的,移植到ce6下,eboot已经搞好,烧录nk后,打印如下消息: Error Reporting Memory Reserved, dump size = 00020000 Setting up softlog at 0x83edc000 for 0x800 entries Booting Windows CE version 6.00 for (ARM) &pTOC = 81 ...…

查看全部问答>

如何使用 remote call profiler 测试 wince 应用程序

最近需要测试Wince上的 应用程序性能,找到影响速度的瓶颈所在。想使用remote call profiler可以吗? MSDN 上说是要插入 FastCAP probe 和 CallCAP probe,可是怎么插入啊,找不到这方面的资料,想知道具体步骤。 我使用的是VS2005 ,device 上 ...…

查看全部问答>

PLC与PC 串口通讯

最近写了一个PC与PLC 串口通信的小程序,我对PLC一点都不了解,主要是读取寄存器的值. 我想问问 1 PLC的地址怎么表示,只有一台PLC通过USB转串口连接PC 2 RTU模式读取数,我是不是也应该在PLC上设置成RTU? (施耐德的PLC 怎么设置?) …

查看全部问答>

关于触摸屏的问题

我正在搞qt,现在点击触摸屏时出现一个问题:就是我点一个地方,触摸屏的鼠标响应的地方不是我点的那一点,而是与触摸屏对角线平行的另一点,而我点在触摸屏的对角线上的任何一点,就基本准确,请问是不是触摸屏的X,Y轴搞错了??我在驱动里要改哪 ...…

查看全部问答>

请大家推荐几本Wince 6.0开发的好书

如题,就是那种讲的比较深入的书。我这里有《Windows CE实用开发技术》是针对Wince5.0的书籍。谢谢各位高手了…

查看全部问答>

DSP开发板上的I/O口是coms电平,还是ttl电平,怎么去判断的?

DSP开发板上的I/O口是coms电平,还是ttl电平,怎么去判断?请教。。。…

查看全部问答>