概述

变量的存储



正常情况下,变量存储在SRAM中,如果要发送该变量的值到外设,需要调用内核操作,使SRAM中的数据送到外设。

此类型操作过多会导致占用CPU高,整体卡顿。

DMA控制概述



  • DMA:Direct Memory Access
  • 专门用于数据传输,解放CPU
  • 对于 DMA,CPU 首先启动传输,然后在传输过程中执行其他操作,最后在操作完成时接收来自 DMA 控制器的中断。
  • --->CPU启动,结束后DMA中断标志传输完成。
  • DMA传输是双向的,可以从外设传向SRAM,也可以从SRAM传向外设。
  • 一般情况下,DMA传输的数据,在外设/SRAM中,地址是连续的---->可以顺序移位寻址,达到依次传输数据的效果。

DMA寄存器相关(通用)

PerAddr(传输外设地址)

SramAddr(传输SRAM地址)

Direction(设置传输方向)

DataSize(传输数据大小)

Sram+(SRAM地址是否移动)

Peri+(外设地址是否移动)

-->一般外设地址是固定不动的

G3507 DMA设置

设置寻址方式

  1. Fixed address to fixed address

    固定地址 到 固定地址

  2. Fixed address to block of addresses

    固定地址 到 地址块

  3. Block of addresses to fixed address

    地址块 到 地址块

  4. Block of addresses to block of addresses

    地址块 到 地址块

  5. Fill data to block of addresses

    填充数据到地址块

  6. Data table to specific address

    数据表到特定地址

通道设置

  • 分为基本通道全功能通道
  • 基本频道仅支持单次或块传输
  • FULL通道支持重复单次和重复块传输
  • 最高优先级 DMA 通道(从 DMAo 开始)为 FULL 通道,其余优先级通道是基本渠道。

传输模式设置

  • 单次传输
  • 块传输
  • 重复单次传输(仅全功能通道支持)
  • 重复块传输(仅全功能通道支持)

模式一:单次传输

  • 可定义传输次数
  • 可定义两地址是否递加或递减
  • 可以设置递加或递减的步长
  • 有三个个寄存器会在每次传输后递增或递减-->当其中某个寄存器递减到0时,一个标志寄存器会被置位。同时DMA使能会被清零(即使DMA不工作-->需要再次设置)。

模式二:块传输

  • 定义块的大小
  • 三个寄存器的值会被存到临时寄存器中,其中两个在每次传输后递减或递加。存在寄存器指示地址到步长。
  • 存在寄存器显示递减后剩余的块数。

模式三:重复单次传输

  • 特性同单次传输,不过会一直使能,重复单次传输。

模式四:重复块传输

  • 特性同块传输,会一直使能,重复块传输。

子模式:跨步传输

  • 每次指针不递增一,自定义递增步长---->即跳过部分数据读取或写入。

拓展模式:四个

  • 普通模式
  • 填充模式
  • 表模式

使用

外部DMA通道

  • 触发类型选择外部DMA通道
  • 再选择触发方式
  • 选择寻址模式

  • Source Length和Destination Length决定DMA读/写的字节数

    ->DMA每次从源地址读多少字节的数据和每次向目标地址发送多少字节的数据。

    ->寻址模式决定DMA每次完成读/写操作后,下次读/写地址是增/减/不变--->指的是块内部寻址增/减/不变。

  • 勾选配置传输大小,可配置每次传输数据的大小(只和块传输有关)

    -->区分读/写大小和传输大小。可以读多了,慢慢写。

    -->Transfer Size决定每次传输多大的块数据。

  • 每次传输完成后,对源和目标地址寻址是增/减/不变
  • 注:源地址--->DMA--->目标地址,若为块传输模式时:



  • DMA中断的触发方式

DMA_block_transfer例程详解

见注释



#include "ti_msp_dl_config.h"

#define DMA_TRANSFER_SIZE_WORDS (16)

//源数据
const uint32_t gSrcData[DMA_TRANSFER_SIZE_WORDS] = {0x00000000, 0x10101010,
0x20202020, 0x30303030, 0x40404040, 0x50505050, 0x60606060, 0x70707070,
0x80808080, 0x90909090, 0xA0A0A0A0, 0xB0B0B0B0, 0xC0C0C0C0, 0xD0D0D0D0,
0xE0E0E0E0, 0xF0F0F0F0}; //目标地址
uint32_t gDstData[DMA_TRANSFER_SIZE_WORDS]; //DMA触发中断标志
volatile bool gChannel0InterruptTaken = false; //验证结果标志位
volatile bool gVerifyResult = false; int main(void)
{
SYSCFG_DL_init(); /* Setup interrupts on device */
DL_SYSCTL_disableSleepOnExit();
NVIC_EnableIRQ(DMA_INT_IRQn); /* Configure DMA source, destination and size */
//设置源地址
DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gSrcData[0]);
//设置目的地址
DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gDstData[0]);
//设置传输大小--->多少个uint32数据
DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, sizeof(gSrcData) / sizeof(uint32_t)); //使能开启DMA通道
DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID); //开始传输
gChannel0InterruptTaken = false;
DL_DMA_startTransfer(DMA, DMA_CH0_CHAN_ID); /* 等待块传输完成 */
while (gChannel0InterruptTaken == false)
{
__WFE();
} //此时已经传输完成,可以验证数据是否正确
gVerifyResult = true;
for (int i = 0; i < DMA_TRANSFER_SIZE_WORDS; i++)
{
/*先比较源数据和目的数据是否相同-->比较出true或false
*再将结果和gVerifyResult进行与运算-->false和任意值进行与运算结果为false
*以此达到验证数组内所有值是否相同的目的*/ gVerifyResult &= gSrcData[i] == gDstData[i];
} /* 完成传输,使LED灯亮 */
DL_GPIO_clearPins(
GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN); /* 断点检测结果 */
__BKPT(0); while (1) {
__WFI();
}
} void DMA_IRQHandler(void)
{ switch (DL_DMA_getPendingInterrupt(DMA))
{
//判断哪个DMA通道产生中断
case DL_DMA_EVENT_IIDX_DMACH0:
gChannel0InterruptTaken = true;
break;
default:
break;
}
}

DMA用到了之前发的SPI通讯里面,在合集里能找到。

MSPM0G3507外设DMA学习笔记的更多相关文章

  1. STM32学习笔记(七) ADC模数转换测电平(普通和DMA模式)

    嵌入式系统在微控制领域(温度,湿度,压力检测,四轴飞行器)中占据着重要地位,这些功能的实现是由微处理器cpu(如stm32)和传感器以及控制器共同完成的,而连接他们,使它们能够互相正常交流的正是本小节 ...

  2. 1--STM32 ADC1与ADC2 16通道DMA采集笔记(原创)

    最近在搞ADC,网上还是很多资源的,以下为参考链接:1.对STM32 ADC单次转换模式 连续转换模式 扫描模式的理解:https://www.cnblogs.com/zhanghankui/p/51 ...

  3. stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

    STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...

  4. linux驱动开发之块设备学习笔记

    我的博客主要用来存放我的学习笔记,如有侵权,请与我练习,我会立刻删除.学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.h ...

  5. IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)

    在学习内核过滤驱动的过程中,遇到了大量的涉及IRP操作的代码,这里有必要对IRP的数据结构和与之相关的API函数做一下笔记. 1. 相关阅读资料 <深入解析 windows 操作系统(第4版,中 ...

  6. DSP EPWM学习笔记1 - EPWM定时中断

    DSP EPWM学习笔记1 - EPWM定时中断 彭会锋 EPWM模块组成 EPWM有7个子模块组成:时间基准 TB.比较功能 CC.动作限定 AQ.死区产生 DB.斩波控制 PC.故障捕获 TZ.事 ...

  7. AM335x(TQ335x)学习笔记——挂载Ramdisk

    上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramd ...

  8. STM32学习笔记之一(初窥STM32)

    怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...

  9. STM32学习笔记(一)——点亮一个LED

    引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...

  10. 基于51单片机IIC通信的PCF8591学习笔记

    引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...

随机推荐

  1. rofi编译支持中文输入版本

    准备工作 git clone https://github.com/davatorium/rofi.git 根据网上的信息,rofi 中文输入主要是依赖 xcb-imdkit 这个库 当然我们是使用源 ...

  2. uniapp 跳转tabbar页面传递参数

    我们这里采用的是本地缓存的方式进行页面的传参 首先看下官方有关本地缓存的介绍 1.设置本地缓存(-- uni.setStorageSync(KEY,DATA) --) 参数 类型 必填 说明 key ...

  3. 使用eNSP配置灵活QinQ

    参考链接:https://blog.csdn.net/xu119718/article/details/55260519 在"使用eNSP配置端口QinQ"实验中是基于端口划分的用 ...

  4. kvm链接克隆虚拟机迁移到openstack机器的实验

    总结 如果是完整克隆的那种虚拟机,是可以直接在openstack使用的,如果镜像格式没问题的话. 因为kvm虚拟机大部分都是链接克隆出来的镜像,不可用直接复制使用,所以需要创建新的镜像文件 创建空盘: ...

  5. C# .NET 生成国密私钥公钥对

    使用的工具类: using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.GM; using Org.BouncyCastle.Asn1.X9; ...

  6. .NET5 ASP.NET CORE 发布到IIS 文件无法替换

    由于默认是:进程内托管.要在IIS里停止网站,才能替换文件. 建议解决方案是:进程外(out-of-process)托管 记事本修改项目的  .csproj 文件(或在VS上,选中web项目,右键-编 ...

  7. MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过

    这是一个轻松赚钱的项目. 短视频时代,谁掌握了流量谁就掌握了Money! 所以给大家分享这个经过精心打造的MoneyPrinterPlus项目. 它可以:使用AI大模型技术,一键批量生成各类短视频. ...

  8. win10系统,磁盘出现惊叹号和一把锁符号如何关闭去掉

    如标题描述,图标如下 解决方法如下:搜索cmd -> 以管理员身份运行 输入命令如下 根据c,d,e盘符的文件量大小执行时间有些差异. manage-bde -off c:就可以解密c盘,成为b ...

  9. C#如何创建一个可快速重复使用的项目模板

    写在前面 其实很多公司或者资深的开发都有自己快速创建项目的脚手架的,有的是魔改代码生成器实现,有的直接基于T4,RazorEngine等模板引擎打造:但无论如何,其最终目的其实就是搭建一个自定义项目模 ...

  10. 01-Linux系统介绍、安装与入门

    关于Linux 背景 最先出现的是Unix操作系统,这种操作系统收费,而且适用于大型机上面. Linus想做一个免费的,传播自由的操作系统.他就仿照Unix的操作,做了一个类Unix系统:Linux内 ...