历史上的今天
返回首页

历史上的今天

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

正在发生

2020年01月22日 | MSP430+DMA

2020-01-22 来源:eefocus

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


硬件介绍:

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


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


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


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 外部触发源。并且还具有触发源扩充能力。


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.


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


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


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


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


另外,单片机的中断程序不影响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

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


程序实现:

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收到触发请求时,等待当前指令执行完成后

推荐阅读

史海拾趣

H&D Wireless公司的发展小趣事

2017年,高创被美的集团全资收购,成为美的工业技术事业群的重要业务板块之一。这一转变标志着高创进入了一个全新的发展阶段。借助美的集团的平台力量,高创在技术研发、生产制造、供应链管理等方面得到了显著提升。同时,与美的集团旗下其他业务板块如库卡机器人等的协同合作,进一步拓宽了高创的市场应用领域。

FCI [First Components International]公司的发展小趣事

随着全球化进程的加速,高创也开始了其全球化布局的步伐。除了在以色列和中国设立研发中心外,高创还积极拓展国际市场,与全球多个国家和地区的客户建立了长期合作关系。通过参加国际知名展会如汉诺威工业博览会等,高创不仅展示了其最新技术和产品,还加强了与国际同行的交流与合作,进一步提升了其国际知名度和影响力。

Fenghua (HK) Electronics Ltd公司的发展小趣事

为了降低成本、提高生产效率,Fenghua (HK) Electronics Ltd不断优化供应链管理。公司与供应商建立了长期稳定的合作关系,实现了原材料的及时供应和成本控制。同时,公司引入了先进的生产管理系统,对生产过程中的各个环节进行精细化管理,确保了产品质量的稳定性和一致性。

B+B SmartWorx公司的发展小趣事

2016年,B+B SmartWorx与研华达成合并协议,成为研华全球大家庭的一员。这次合并是双方战略发展的重要一步,研华看中了B+B SmartWorx在物联网和工业网通领域的深厚积累,而B+B SmartWorx则借助研华在亚洲的资源与经验,进一步拓展其全球市场。合并后,双方在产品开发、业务布局等方面进行了深度融合,共同推动工业物联网领域的发展。

磁联达(CND-tek)公司的发展小趣事

随着5G技术的快速发展,磁联达(CND-tek)公司意识到无线充电技术将成为未来的重要趋势。公司投入大量资源进行无线充电发射线圈的研发,经过多次试验和改进,终于成功推出了一款性能稳定、效率高的无线充电产品。这一创新不仅为公司带来了丰厚的利润,也进一步巩固了公司在行业内的领先地位。

Elpac公司的发展小趣事

在电子行业的激烈竞争中,Elpac公司凭借其在电源管理领域的技术革新,逐渐崭露头角。公司创始人李明在创办之初就坚信,只有不断创新才能在市场中立足。他带领团队深入研究市场需求,不断推出具有创新性的电源管理产品。其中,一款高效节能的电源转换器在市场上引起了广泛关注,其出色的性能和稳定性赢得了客户的青睐。随着产品的热销,Elpac公司逐渐在电子行业中建立了自己的品牌地位。

问答坊 | AI 解惑

uCOS-ii for S3c44b0x

我这有很多关于uCOS-II藏品陆续上传,谁有Nucleus,请传一下.…

查看全部问答>

ARM指令SMULBB是什么意思啊,,

ARM指令SMULBB和SMULWB是什么意思啊? 哪位打给给你详细点说明啊,,上网没找到,,,…

查看全部问答>

VC EVC 的区别

VC和EVC的区别是什么…

查看全部问答>

学习微型计算机系统原理机应用遇到困难

书中提到的8237A 8259A 8253-PIT 8255A 8250 8251A这些片子总觉得不是很熟,不会编程,大家有什么好的建议,能让我掌握他们。有什么好的资料吗?…

查看全部问答>

应用程序如何查询中断

驱动使用DDK写的,不是DS+DDK,以前用DS+DDK的时候是应用把一个Event的HANDLE传进去,然后驱动里面用传进来的HANDLE生成一个KEVENT,应用那里启动一个线程,线程里面等待那个Event就行了,这样当发生中断时驱动的DPC就把KEVENT设置,应用的那个线程就 ...…

查看全部问答>

STM32处理器如何实现关所有中断功能

                                 我一直没发现STM32有关所有中断的功能,想问一下大家是不是它不能实现。或者有什么办法来实现这个功能。一个个的关 ...…

查看全部问答>

ALTERA亚洲创新大赛

本帖最后由 paulhyde 于 2014-9-15 03:31 编辑 请教各位,关于ALTERA亚洲创新大赛的选题应该从哪方面入手思考?  …

查看全部问答>

跪求SDHC卡初始化时ACMD41的argument

在做430向SD卡写数据时候,SD卡可以,但是用SDHC卡初始化过程中CMD0的响应正确,ACMD41响应总是0x01,是不是argument有问题呢?…

查看全部问答>

山东省电子设计大赛来了

2012TI杯山东省大学生电子设计竞赛                基本仪器和主要元器件清单 1、基本仪器清单 数字电桥 直流稳压电源 量角器 米尺  四位半数字万用表  0~200℃温度 ...…

查看全部问答>

请问在main中进入LPM4,在外部中断唤醒后在中断进入LPM3,这时程序是回到main中了...

首先在main吧,我运行了“_BIS_SR(LPM4_bits + GIE);         // Enter LPM4” 先外部IO口中断函数中我又运行了“_BIS_SR(LPM3_bits + GIE);”,请问在此之后,程序是继续执行完中断函数后面的内容再进入LPM3,还是 ...…

查看全部问答>