MSP430+DMA

发布者:chunying最新更新时间:2018-05-04 来源: eefocus关键字:MSP430  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

  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;

            DMAxSA = (unsigned int *)&DMA1SA;

            DMAxDA = (unsigned int *)&DMA1DA;

            DMAxSZ = (unsigned int *)&DMA1SZ;

            break;                                      //指针 = 1通道控制

        case 2: 

            DMAxCTL = (unsigned int *)&DMA2CTL;

            DMAxSA = (unsigned int *)&DMA2SA;

            DMAxDA = (unsigned int *)&DMA2DA;

            DMAxSZ = (unsigned int *)&DMA2SZ;

            break;                                      //指针 = 2通道控制

    }

    

    switch (transMode)      //设置DMA通道的传输模式

    {

        case 'S': *DMAxCTL = DMADT_0;   break;          //单次传输

        case 's': *DMAxCTL = DMADT_4;   break;          //重复单次传输

        case 'B': *DMAxCTL = DMADT_1;   break;          //块传输

        case 'b': *DMAxCTL = DMADT_5;   break;          //重复块传输

        case 'I': *DMAxCTL = DMADT_2;   break;          //突发块传输 交错

        case 'i': *DMAxCTL = DMADT_6;   break;          //重复突发块传输 交错

    }

    

    *DMAxCTL |= (srcMode & 0x04) << 2;                  //源 字或字节

    *DMAxCTL |= (srcMode & 0x03) << 8;                  //源 地址改变方式

    

    *DMAxCTL |= (dstMode & 0x04) << 3;                  //目的 字或字节

    *DMAxCTL |= (dstMode & 0x03) << 10;                 //目的 地址改变方式

    

    *DMAxSA = src;

    *DMAxDA = dst;

    *DMAxSZ = size;

    

    *DMAxCTL |= DMAEN;                                  //DMA使能

}

函数比较麻烦,函数内容按参数设置每个寄存器。DMACTL0 = trigger << (channel << 2); 这个是设置对应channel通道的的参考源,不大明白的可以看下DMACTL0的寄存器内容;switch (channel)语句则根据通道设置对应指针指向的寄存器;然后对应设置参数即可。

当设置成非重复模式时,需要重新置位DMAEN,本程序就函数DMAReEnable实现:

void DMAReEnable(char channel)

{

    switch (channel)        //使能对应通道

    {

        case 0: DMA0CTL |= DMAEN;   break;      //0通道

        case 1: DMA1CTL |= DMAEN;   break;      //1通道

        case 2: DMA2CTL |= DMAEN;   break;      //2通道

    }

}

这个函数比较简单,只是根据传入参数设置对应通道的DMAEN位。

当设置为软件触发时,需要软件启动DMA程序如下:

void DMAStart(char channel)
{
    switch (channel)        //使能对应通道
    {
        case 0: DMA0CTL |= DMAREQ;  break;      //0通道
        case 1: DMA1CTL |= DMAREQ;  break;      //1通道
        case 2: DMA2CTL |= DMAREQ;  break;      //2通道
    }
}
  1. 这个和上个函数类似:仅仅设置一个控制位,函数很简单,不再解释啦。

    程序实现就这么多了,有关详细内容可以下载附件里的程序库,程序的注释很详细。

  2. 使用示例:

    使用这个程序时,步骤和原来的相同:工程中加入DMA.c文件,然后源文件中包含DMA.h头文件即可。

    示例程序主要如下:

#include

#include "DMA.h"


unsigned int a[5] = {8693,5689,2356,23565,5656};

unsigned int b[5];

void main( void )

{

    // Stop watchdog timer to prevent time out reset

    WDTCTL = WDTPW + WDTHOLD;

    ClkInit();

    //块传输,5个字(16位) a->b

    DMAInit(0,0x00,'B',3,3,(unsigned int)a,(unsigned int)b,5);

    DMAStart(0);

    //如果需要再次传输 而不改变设置,只需调用DMAReEnable再次启动传输即可 

    // 如果是重复块传输,则不需要重新使能DMAReEnable 直接启动即可

    //这里仅仅演示了使用方法,实际应用中,应根据需要选择适当的触发源。

    //

    LPM0;

}

示例程序完成功能很简单,仅仅把一个数组的值赋给另外一个数组。数组地址即是数组名强制转换为所需类型(无符号16位),传入函数初始化设置。这里为了简便,设置为软件启动。

运行效果如下:

image

单步运行完启动DMA传输后,结果即出来了;说明DMA传输数据的速度是很快的。


关键字:MSP430  DMA 引用地址:MSP430+DMA

上一篇:STM32+CC1101 低功耗
下一篇:嵌入式调试ARM程序跑飞现象的跟踪

推荐阅读最新更新时间:2024-03-16 16:01

MSP430FR5969学习心得
1.MSP430开发环境建立 1.安装IAR dor msp430 软件,软件带USB仿真器的驱动。 2.插入USB仿真器,驱动选择安装目录的/drivers/TIUSBFET 3.建立一个工程,选择 option 选项,设置 a、选择器件,在 General 项的 Target 标签选择目标器件 b、选择输出仿真,在 Linker 项里的 Output 标签,选择输出 Debug information for C-SPY ,以输出调试 信息用于仿真。 c、若选择 Other ,Output下拉框选择 zax-m 即可以输出hex文件用以烧录,注意,此时仿真不了。 d、选择 Debugger 项的 S
[单片机]
stm32专题十三:DMA(一)结构框图
DMA(data memory access)直接存储器访问,和串口USART、GPIO一样,也是一个外设。 把数据从一个地方搬到另一个地方,而不占用CPU。像串口发送数据,数据是一个一个的发。CPU首先把数据从内存(数组)拿到CPU内部的寄存器(CPU内部有一组暂存数据寄存器R1、R2、R3等),然后再发到串口的数据寄存器USART_DR,这些过程一直需要占用CPU。而当我们使用DMA时,如果CPU给DMA一个命令(把数据从内存发到串口),这时DMA就会实现这个功能,整个过程CPU是空闲的,可以去做其他事。比如,点亮一个LED,显示液晶屏LCD等。 DMA支持3种模式: Memory to Memory (这里的Me
[单片机]
stm32专题十三:<font color='red'>DMA</font>(一)结构框图
NRF24L01实现msp430单片机通信(SPI)
24l01.h #ifndef _24L01_H_ #define _24L01_H_ /***************************************************/ typedef unsigned char BYTE; #define uchar unsigned char //24L01发送接收数据宽度定义 #define TX_ADR_WIDTH 5 //5字节的地址宽度 #define RX_ADR_WIDTH 5 //5字节的地址宽度 #define TX_PLOAD_WIDTH 7 //20字节的用户数据宽度 #define RX_PLOAD_WIDTH 7 //20字
[单片机]
MSP430F1611上实现周期图谱分析及校正
引 言 基于FFT的频谱分析方法可以从含有噪声的信号中提取有用的信息,在仪器仪表的数据处理中具有重要的应用价值。为了保证频谱分析的精度,往往进行多点的FFT运算,例如,1024点、2048点等,这样运算量大、所占内存也大,只有采用DSP(数字信号处理器)才能实现实时的处理。目前,在工业现场普遍使用的两线制、低功耗自动化仪表,由于仪表本身消耗电流必须控制在4 mA之内,所以无法采用DSP等运算能力强的芯片,只能采用低功耗单片机;而低功耗单片机的运算速度和内存容量都很有限,所以,至今未见用其进行多点数FFT运算的报道。为了能够用低功耗单片机实时做FFT运算,以提高自动化仪表信息处理的能力,我们用汇编语言编制FFT程序,在程序中用定点
[单片机]
在<font color='red'>MSP430</font>F1611上实现周期图谱分析及校正
MSP430常见问题之AD转换类
Q1:MSP430F149 AD 的输入阻抗有多大? A1:RC 2000欧*30PF Q2:MSP430 ADC12 模块的速度? A2: ADC12 的转换速率是转换所需的ADC12CLK 以及时钟的一项功能。ADC12CLK 的近似最小值与最大值分别为500kHz 及6.5MHZ。速度最快的整个转换过程可以在17 个周期内完成(13 个周期进行转换,4 个周期进行采样及保持)。6.5MHz/17 = 382ksps。ADC12 的运行速率不能低于最小值的ADC12CLK,但在软件的控制下,采样门可以无限制保持打开状态。如欲了解有关采样与转换时间规范的更多详情,敬请参阅数据表。 Q3:用VREFON开通SD16的Vre
[单片机]
基于MSP430F149单片机和总线技术实现智能变送器的设计
引言 在现实生活中,对一个大型的被测对象进行各种状态的监控,往往需要使用许多传感器来构建一个庞大的测控系统。例如,用户在飞机的不同位置安装不同的传感器用于实时监视飞机的各种运行状态,从而确保飞机能够安全运行。若构建这样的测控系统,从设计者的角度来讲,由于使用的传感器种类多、数量大,而不同种类的传感器需要提供相应的总线进行数据传输,这就不可能使用单一的数据总线来构成整个系统,必然花费大量的设计时间和费用。另外,从保障维护的角度来讲,由于采用多种总线技术,使得传感器针对不同总线在兼容性和互换性等方面也存在着很多问题。 IEEE 1451.1实现模型如图1所示。 IEEEl451标准的主要思想是,使传感器能够独立于各种不同的总线
[单片机]
基于<font color='red'>MSP430</font>F149单片机和总线技术实现智能变送器的设计
MSP430F149单片机的内部定时器A定时1秒钟实现LED闪烁
#include msp430x14x.h //********************函数声明****************** void InitClock(); //********************主函数******************** void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关看门狗 InitClock(); // 初始化时钟 P1DIR |= BIT0; // 设P1.0为输出 CCTL0 = CCIE;
[单片机]
基于MSP430的石油井下压力测试系统的设计
   1引言   压力数据在油田开采过程中是一项极重要的资料。而这其中的射孔工艺是关键环节,其对高质量打开油气层,提高油气井产能都有重要影响。射孔是打开油气层让地层流体流入井内的主要完井工序。测取射孔瞬间动态压力参数具有重要意义;确定每次射孔的施工效果;结合其他测试参数评价地质效果:研究射孔工艺机理,为我国射孔理论水平的发展创造有利条件。该参数的测取也是研究油气层特征,掌握油气层动态。检查地面采油工艺流程的重要手段。为此,必须借助于各种精密的压力测量仪表。以获得精确的压力数据。    2测试系统设计   2.1存储测试原理简介   存储测试系统是用以完成存储测试的物理系统,可工作在高温、高压、强冲击振动、高过载等恶劣环境下
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved