首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

MSPM0G3507外设DMA学习笔记

编程知识
2024年07月28日 12:36

概述

变量的存储

image.png
正常情况下,变量存储在SRAM中,如果要发送该变量的值到外设,需要调用内核操作,使SRAM中的数据送到外设。
此类型操作过多会导致占用CPU高,整体卡顿。

DMA控制概述

image.png
image.png

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

DMA寄存器相关(通用)

image.png

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
    数据表到特定地址
    image.png

通道设置

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

传输模式设置

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

模式一:单次传输

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

模式二:块传输

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

模式三:重复单次传输

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

模式四:重复块传输

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

子模式:跨步传输

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

拓展模式:四个

image.png

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

使用

外部DMA通道

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

image.png

  • Source Length和Destination Length决定DMA读/写的字节数
    ->DMA每次从源地址读多少字节的数据和每次向目标地址发送多少字节的数据。
    ->寻址模式决定DMA每次完成读/写操作后,下次读/写地址是增/减/不变--->指的是块内部寻址增/减/不变。

image.png

  • 勾选配置传输大小,可配置每次传输数据的大小(只和块传输有关)
    -->区分读/写大小和传输大小。可以读多了,慢慢写。
    -->Transfer Size决定每次传输多大的块数据。

image.png

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

image.png
image.png

  • DMA中断的触发方式
    image.png

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通讯里面,在合集里能找到。

From:https://www.cnblogs.com/tuakura/p/18328135
本文地址: http://shuzixingkong.net/article/513
0评论
提交 加载更多评论
其他文章 攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃
前言 最近看了《中国数据库前世今生》纪录片,感触颇深,也是一直在思考到底该用何种方式起笔来回顾这段筚路蓝缕却又充满民族自豪感的历程。大概构思了一周左右吧,我想,或许还是应该从那个计算机技术在国内刚刚萌芽的年代开始讲起,那时的一切都显得那么原始而纯粹,一群怀揣梦想的科研人员,在资源匮乏、条件艰苦的环境
攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃 攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃 攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃
前端如何处理后端一次性返回10万条数据?
在前端开发中,我们经常需要处理后端返回的大量数据。假设后端一次性返回10万条数据,直接在浏览器中处理和展示这些数据会导致性能问题,比如页面卡顿、内存占用过高等。本文将结合Vue项目实战,介绍如何有效地处理和展示大数据集的方法。 1. 后端数据处理 首先,确保后端在传输数据时是经过压缩的,可以大大减少
周期信号的傅里叶级数和频谱
傅里叶级数和信号频谱 对于一个确定的时域信号,我们只需要知道它的函数表达式就可以在任意时刻确定一个信号,但是各种场景下中我们需要的往往并不是这样的解析式,因为这些复杂的式子首先难以快速准确地获得,另外难以进行快速进行分析,其中所蕴含的信息也难以提取。因此需要一种更高效的工具来进行信号的分析。 傅里叶
周期信号的傅里叶级数和频谱 周期信号的傅里叶级数和频谱 周期信号的傅里叶级数和频谱
【WPF】Command 的一些使用方案
Command,即命令,具体而言,指的是实现了&#160;ICommand 接口的对象。此接口要求实现者包含这些成员: 1、CanExecute 方法:确定该命令是否可以执行,若可,返回 true;若不可,返回 false; 2、CanExecuteChanged 事件:发送命令(命令源)的控件可以
【WPF】Command 的一些使用方案 【WPF】Command 的一些使用方案 【WPF】Command 的一些使用方案
马斯克: 教育是解决问题, 而不是教工具
1. 马斯克: 教育是解决问题, 而不是教工具 [3,4,6] 2. 老天爷的教的方法 我理解这就跟游戏一样, 从环境中持续获得反馈, 体会乐趣, 修正不足, 而不是在工具方法和原理中消磨意志力. 实践中学习是我们天生的 比如我们学说话,不是先学拼音,学走路,也不先学力学原理,而是直接模仿,边说边学
马斯克: 教育是解决问题, 而不是教工具 马斯克: 教育是解决问题, 而不是教工具
七天.NET 8操作SQLite入门到实战 - 第七天Blazor学生管理页面编写和接口对接(3)
前言 本章节我们的主要内容是完善Blazor学生管理页面的编写和接口对接。 七天.NET 8 操作 SQLite 入门到实战详细教程 第一天 SQLite 简介 第二天 在 Windows 上配置 SQLite 环境 第三天 SQLite 快速入门 第四天 EasySQLite 前后端项目框架搭建
七天.NET 8操作SQLite入门到实战 - 第七天Blazor学生管理页面编写和接口对接(3) 七天.NET 8操作SQLite入门到实战 - 第七天Blazor学生管理页面编写和接口对接(3) 七天.NET 8操作SQLite入门到实战 - 第七天Blazor学生管理页面编写和接口对接(3)
XCode 编译 PAG 源码
最近工作中要使用PAG替换Lottie,为了方便阅读源码,使用XCode对其源码进行了编译。 1 下载源码 编译源码首先要下载源码,有关PAG源码可直接到github上下载。 2 添加相关依赖 下载源码之后,进入到PAG项目根目录,执行如下脚本: ./sync_deps.sh 3 构建 iOS PA
XCode 编译 PAG  源码 XCode 编译 PAG  源码 XCode 编译 PAG  源码
基于Hive的大数据分析系统
1.概述 在构建大数据分析系统的过程中,我们面对着海量、多源的数据挑战,如何有效地解决这些零散数据的分析问题一直是大数据领域研究的核心关注点。大数据分析处理平台作为应对这一挑战的利器,致力于整合当前主流的各种大数据处理分析框架和工具,以实现对数据的全面挖掘和深入分析。本篇博客笔者将为大家介绍如何构建
基于Hive的大数据分析系统 基于Hive的大数据分析系统 基于Hive的大数据分析系统