MSP430系列单片机的DMA使用全面认识

发布者:温馨家园最新更新时间:2020-06-21 来源: eefocus关键字:MSP430系列  单片机  DMA 手机看文章 扫描二维码
随时随地手机看文章

DMA的解释

DMA(Direct Memory Access,直接存储器访问)。 DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。


MSP430系列单片机中的DMA

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


MSP430 DMA控制器的特性

MSP430系列单片机的DMA模块大多有以下特点:


 无需CPU介入,完全由DMA控制器自行管理。

 在整个地址空间范围内有效,块方式传输可达65536字节;

 每次传输仅需要2个MCLK;

 可在CPU进入超低功耗模式时运行;

 字节和字混合传输;

 四种传输寻址模式:固定地址到固定地址、固定地址到块地址、块地址到固定地址以及块地址到块地址;

 触发方式灵活:边沿或者电平触发。

 多种触发源可配置。

 多通道优先级可配置。


DMA的应用

最常见的场景,当你想吃饭时,你需要中止你的工作,走出去,到某家店,点餐,等餐,用餐,再回到你的工作地点继续你的工作。如果工作比较多的时候呢?你就没有时间外出,那你一般就是点个外卖,然后继续你的工作,等外卖员把餐送到了,再用餐,用餐后再继续你的工作。现在把这个场景全部类比到单片机的工作中来,吃饭是一个支线任务,但无法直接开始,需要等待,点餐是一个机器周期可以完成的简单操作,你的工作是CPU的主线任务。对于CPU而言,如果主线任务比较繁重,而支线任务又不得不做,那做了支线任务就必然要占用做主线的时间,这个结果就可能导致主线任务完成得不好,所以在这个时候我们就需要一个外卖员,他就是DMA!


明确你得需求

好多人是按章节学习,到了DMA这一章就到处询问怎么使用DMA,要程序要代码,但是我在上面也举过例子了,你只有在CPU主线特别忙得时候才需要用到DMA,又或者是某种低功耗需求而IO处理有特别多得时候。没有这种需求你完全没必要去搞清楚DMA是怎么用的,你只要知道有这么个东西就行了,将来有需求了再回来研究。因为这里面还是有很多坑的,如果你急这在项目里上马DMA,那不可预料的BUG真的是会耽误你很多时间。所以根据你的需求,谨慎选择是否继续读下去。


一个能用起来的官方例程

注释已翻译成中文了


#include

#include


int main(void)

{

  WDTCTL = WDTPW+WDTHOLD;                   // 关闭看门狗

  P1DIR |= 0x01;                            // P1.0 设为输出

  __data20_write_long((uintptr_t) &DMA0SA,(uintptr_t) 0x1C00);

                                            // 设置源地址

  __data20_write_long((uintptr_t) &DMA0DA,(uintptr_t) 0x1C20);

                                            // 设置目标地址

  DMA0SZ = 16;                              // 设置传输快尺寸

  DMA0CTL = DMADT_5+DMASRCINCR_3+DMADSTINCR_3; 

  // 通道0:重复块传输、源地址和目标地址自动增计数,默认为软件触发

  DMA0CTL |= DMAEN;                         // 使能DMA通道0


  while(1)

  {

    P1OUT |= 0x01;                          // 置位P1.0

    DMA0CTL |= DMAREQ;                      // 触发块传输

    P1OUT &= ~0x01;                         // 复位P1.0

  }

}


一些说明


 官方历程由来:点我下载msp430ware,具体请自行搜索。

 关于程序执行过程,手册说DMA块传输需要2×MCLK×DMAxSZ(记tD)的时间,所以在执行了触发语句DMA0CTL |= DMAREQ; 后CPU将处于挂起状态,即在本例中,在执行*P1OUT &= ~ 0x01;*之前,系统会待机tD ,一定要引起注意。

 在老版的CCS中用MSP430wave导入的例程中,代码长这样:

#include


int main(void)

{

  WDTCTL = WDTPW+WDTHOLD;                   // 关闭看门狗

  P1DIR |= 0x01;                            // P1.0 设为输出

  __data16_write_long((unsigned short) &DMA0SA,(unsigned long) 0x1C00);

                                            // 设置源地址

  __data20_write_long((unsigned short) &DMA0DA,(unsigned long) 0x1C20);

                                            // 设置目标地址

  DMA0SZ = 16;                              // 设置传输快尺寸

  DMA0CTL = DMADT_5+DMASRCINCR_3+DMADSTINCR_3; 

  // 通道0:重复块传输、源地址和目标地址自动增计数,默认为软件触发

  DMA0CTL |= DMAEN;                         // 使能DMA通道0


  while(1)

  {

    P1OUT |= 0x01;                          // 置位P1.0

    DMA0CTL |= DMAREQ;                      // 触发块传输

    P1OUT &= ~0x01;                         // 复位P1.0

  }

}


你在编译的时候会发现在设置地址的地方有警告 #770-D conversion from pointer to smaller integer 你可以自行比较一下新旧连个例程就应该知道问题在哪了1。


待续

之所以提到这个,是因为在我写总结的时候才下载了最新的CCS9.10,而之前我的工程都是用的CCS6.10,而我的工程电脑也不联网,就不知道有新版本。这个警告起初困惑了我很久,因为我确实习惯消除掉程序里的所有警告,而为了解决这个问题我还真是测试了很久才get到20位地址空间这个点,算是个不大不小的坑。通过这个例子,我建议大家还是时不时关注下工具软件的更新,兴许一些老问题就迎刃而解了

关键字:MSP430系列  单片机  DMA 引用地址:MSP430系列单片机的DMA使用全面认识

上一篇:BQ24195的使用:与MSP430G2553的I2C通信
下一篇:MSP430 SPI接口DMA模式通信

推荐阅读最新更新时间:2024-11-12 13:04

单片机系统键盘的设计小结
一、概述 键盘在单片机应用系统中,实现输入数据、传送命令的功能,是人工干预的主要手段。键盘分两大类:编码键盘和非编码键盘。 编码键盘:由硬件逻辑电路完成必要的键识别工作与可靠性措施。每按一次键,键盘自动提供被按键的读数,同时产生一选通脉冲通知微处理器,一般还具有反弹跳和同时按键保护功能。这种键盘易于使用,但硬件比较复杂,对于主机任务繁重之情况,采用8279可编程键盘管理接口芯片构成编码式键盘系统是很实用的方案。 非编码键盘:只简单地提供键盘的行列与矩阵,其他操作如键的识别,决定按键的读数等仅靠软件完成,故硬件较为简单,但占用CPU较多时间。有:独立式按键结构、矩阵式按键结构。 二、键盘
[单片机]
基于51单片机的DAC0832波形发生器设计
波形发生器是一种常用的信号源,广泛的应用于电子电路、自动控制系统和教学实验等领域,是现代测试领域内应用最为广泛的通用仪器之一。在研制、生产、测试和维修各种电子元件、部件以及整机设备时,都需要有信号源。由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察。 测量被测仪器的输出响应,以分析确定它们的性能参数。信号发生器是电子测量领域中最基本、应用最为广泛的一类电子仪器。它可以产生多种波形信号,如方波、锯齿波、三角波等,因而广泛应用于通信、雷达、导航、宇航等领域 以多种波形发生器为对象,选择单片机、独立按键及D/A转换器,设计相应的电路构成多种波形发生器。 功能要求: 1.有4个功能键,分别用来选择
[单片机]
基于51<font color='red'>单片机</font>的DAC0832波形发生器设计
STM8等低端单片机打印各种格式数据
#include “stm8l15x.h” #include “delay.h” #include “stdarg.h” #include “stdio.h” //定义LED与按键接口 #define LED_GPIO_PORT GPIOC #define LED_GPIO_PINS GPIO_Pin_4 #define KEY_GPIO_PORT GPIOD #define KEY_GPIO_PINS GPIO_Pin_4 uint8_t HexTable ={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’}; void USART1_S
[单片机]
基于低成本MCU MC9S08QE的肌电假手解决方案
  医疗假手设计成本昂贵。如何为产品选择最经济的问题解决办法是摆在设计人员面前的一道难题。MC9S08QE是一款经济高效的通用低功耗MCU,它封装小巧,特性丰富,为解决方案提供了极好的投资保护,因此非常适合于肌电假手(MHP)应用。请看本文的介绍。   医疗假手设计成本昂贵。因为政府补贴,发达国家的设计人员并不用精打细算。这样,他们就可以快速将他们的产品推向市场。   发展中国家的设计人员可能得不到政府的资助,这也是为什么设计人员必须要花更多时间为产品选择材料和组件的原因。他们必须找到最经济的问题解决办法。   一个由来自“Universidad Jesuita de Guadalajara”ITESO研究生院工程系学生组成
[单片机]
基于低成本<font color='red'>MCU</font> MC9S08QE的肌电假手解决方案
单片机的汇编延时程序
50ms延时;一般书上的程序 DEL: MOV R7,#200 LO: MOV R6,#123 NOP L1: DJNZ R6,L1 DJNZ R7,L0 RET 但是这个程序实际上延时50.001ms,多了一个机器周期, 其实这个问题是不可能由一个二重循环实现精确延时的,必须采用三重循环 我的程序; DEL: MOV R5,#29 L0: MOV R7,#22 L1: MOV R6,#6 L2: DJNZ R6,L2 DJNZ R7,L1 DJNZ R5,L0 RET 此时精确延时50ms,并且三个寄存器里的数值是可以变化的,这里要讨论的是,为什么不能,或说不容易用一个
[单片机]
单片机流水灯小程序
ORG 0000H AJMP START ORG 0030H START: SETB P1.0 ACALL DELAY MOV P1,#00H CLR P1.0 ACALL DELAY SETB P1.1 ACALL DELAY MOV P1,#00H CLR P1.1 ACALL DELAY SETB P1.2 ACALL DELAY MOV P1,#00H CLR P1.2 ACALL DELAY SETB P1.3 ACALL DELAY MOV P1,#00H CLR
[单片机]
STM32之DMA讲解及配置过程,附带代码说明
DMA涉及概念讲解: ①:DMA即Direct Memory Access(直接存储器存取),是STM32特有的外设。大容量STM32产品集成了两个DMA,分别是DMA1和DMA2,。其中DMA1有7个通道,DMA2有5个通道,具体每个通道连接的外设可以参考STM32芯片的数据手册。 ②:通过DMA可以将数据在两个不同的地址之间进行传递,如存储器到外设寄存器,外设寄存器到存储器,也可以从存储器到存储器之间。 ③:当两个数据在不同的地址之间传递时,需要在程序配置中确定每次传输的字节数,确定是字节、半字还是字。 ④:DMA的每个通道优先级是可变的。以DMA1为例,它有7个通道,可以配置每个通道的优先级为很高、高、中,低
[单片机]
基于51单片机,蜂鸣器和led每秒1滴1亮的程序
#include reg52.h #define uchar unsigned char #define uint unsigned int int seccnt,m=0; char tzsta,msta; sbit led=P2^0; sbit beep=P1^5; void ini()//定时器0 { seccnt=0; msta=tzsta=0; TMOD=0x01; TH0=0x0FF; TL0=0x9C; TR0=1; } void on()//蜂鸣器和灯的功能 { if(m =500) { beep=~beep; } if(m =100
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved