DSP28335 DMA 官方例程解析以及拓展(一)

文章目录

  • 概述
  • 官方例程1 内部RAM to RAM Example_2833xDMA_ram_to_ram
    • 源码
    • 解析
  • 要点
  • 方法拓展 外部固定地址 TO RAM
    • 完整程序:

对DMA 和 DMA有关的API请看这篇文章
DSP28335 DMA API介绍

概述

本篇主要分析官方提供的28335 DMA 有关的例程 在此基础上有一定的拓展

官方例程1 内部RAM to RAM Example_2833xDMA_ram_to_ram

源码

//###########################################################################
// Description:
//! \addtogroup f2833x_example_list
//! <h1> DMA Ram to Ram (dma_ram_to_ram)</h1>
//!
//! This example will perform a block copy from L5 SARAM to L4 SARAM of 1024
//! words. Transfer will be started by Timer0. Will use 32-bit data size to
//! decrease the transfer time.
//!
//! \b Watch \b Variables \n
//! - DMABuf1
//! - DMABuf2
//
//
//###########################################################################
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
// $Release Date: November  1, 2016 $
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
//             http://www.ti.com/ ALL RIGHTS RESERVED $
//############################################################################include "DSP28x_Project.h"     // Device Headerfile and Examples Include File#define BUF_SIZE   1024  // Sample buffer size// DMA Defines
#define CH1_TOTAL               DATA_POINTS_PER_CHANNEL
#define CH1_WORDS_PER_BURST     ADC_CHANNELS_TO_CONVERT#pragma DATA_SECTION(DMABuf1,"DMARAML4");
#pragma DATA_SECTION(DMABuf2,"DMARAML5");volatile Uint16 DMABuf1[1024];
volatile Uint16 DMABuf2[1024];volatile Uint16 *DMADest;
volatile Uint16 *DMASource;__interrupt void local_DINTCH1_ISR(void);void main(void)
{Uint16 i;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.InitSysCtrl();// Step 2. Initialize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interruptsDINT;// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags:IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.InitPieVectTable();// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.EALLOW;	// Allow access to EALLOW protected registersPieVectTable.DINTCH1= &local_DINTCH1_ISR;EDIS;   // Disable access to EALLOW protected registersIER = M_INT7 ;	                             //Enable INT7 (7.1 DMA Ch1)EnableInterrupts();CpuTimer0Regs.TCR.bit.TSS  = 1;               //Stop Timer0 for now//Step 5. User specific code, enable interrupts:// Initialize DMADMAInitialize();// Initialize Tablesfor (i=0; i<BUF_SIZE; i++){DMABuf1[i] = 0;DMABuf2[i] = i;}// Configure DMA ChannelDMADest   = &DMABuf1[0];DMASource = &DMABuf2[0];DMACH1AddrConfig(DMADest,DMASource);DMACH1BurstConfig(31,2,2);         //Will set up to use 32-bit datasize, pointers are based on 16-bit wordsDMACH1TransferConfig(31,2,2);      //so need to increment by 2 to grab the correct locationDMACH1WrapConfig(0xFFFF,0,0xFFFF,0);//Use timer0 to start the x-fer.//Since this is a static copy use one shot mode, so only one trigger is needed//Also using 32-bit mode to decrease x-fer timeDMACH1ModeConfig(DMA_TINT0,PERINT_ENABLE,ONESHOT_ENABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,THIRTYTWO_BIT,CHINT_END,CHINT_ENABLE);StartDMACH1();//Init the timer 0CpuTimer0Regs.TIM.half.LSW = 512;    //load low value so we can start the DMA quicklyCpuTimer0Regs.TCR.bit.SOFT = 1;      //Allow to free run even if haltedCpuTimer0Regs.TCR.bit.FREE = 1;CpuTimer0Regs.TCR.bit.TIE  = 1;      //Enable the timer0 interrupt signalCpuTimer0Regs.TCR.bit.TSS  = 0;      //restart the timer 0for(;;){}
}// INT7.1
__interrupt void local_DINTCH1_ISR(void)     // DMA Channel 1
{// To receive more interrupts from this PIE group, acknowledge this interruptPieCtrlRegs.PIEACK.all = PIEACK_GROUP7;// Next two lines for debug only to halt the processor here// Remove after inserting ISR Code__asm ("      ESTOP0");for(;;);
}

解析

  1. 常规系统的初始化
  2. 初始化DMA相关中断 所以需要有一个中断函数local_DINTCH1_ISR
  3. 初始化用到的变量DMABuf1 DMABuf2
  4. DMAInitialize(); DMA初始化
  5. DMACH1AddrConfig(DMADest,DMASource); 确定了Soruce and Dest 的地址
  6. Burst Config: DMACH1BurstConfig(31,2,2)
    • 参数1 代表 32bit 的 datasize
    • 参数2 代表 发送步长为2(335 是 16位的单片机 所以步长为2)
    • 参数3 代表 接收步长为2
  7. DMACH1TransferConfig(31, 2, 2);
    • 参数1 代表 一个burst 传 32 个最小单位 也就是32个32bit
    • 参数2 代表 发送步长为2(335 是 16位的单片机 所以步长为2)
    • 参数3 代表 接收步长为2
  8. DMACH1WrapConfig(0xFFFF, 0, 0xFFFF, 0);
  9. DMACH1ModeConfig(DMA_TINT0, PERINT_ENABLE, ONESHOT_DISABLE, CONT_DISABLE, SYNC_DISABLE, SYNC_SRC, OVRFLOW_DISABLE, THIRTYTWO_BIT, CHINT_END,
    CHINT_ENABLE);
    • DMA_TINT0 : DMA触发源为定时器0
    • PERINT_ENABLE:启用外设中断
    • ONESHOT_ENABLE:触发一次中断就完成所有传输
    • CONT_DISABLE:转换后禁用DMA
    • SYNC_DISABLE:禁用同步
    • SYNC_SRC:SRC包装计数器控制
    • OVRFLOW_DISABLE:禁用溢出中断
    • THIRTYTWO_BIT:DMA传输的位为32位
    • CHINT_END:传输结束后发生中断
    • CHINT_ENABLE:启用DMA中断
  10. StartDMACH1(); 启动转换

要点

我对于DMA的理解 它是有2个循环 一个内循环 是BURST内的循环 BURST循环传完后 进入到 Transfer循环
BURST循环
DMACH1BurstConfig(31,2,2)
source: DMA每读取一个 偏移2
Dest:DMA每写一个 偏移2
Transfer循环
TransferConfig(31, 2, 2);
source: DMA每传完一个bust 偏移2
Dest:DMA每写一个burst 偏移2
针对上面的 为什么要Transfer一个后要偏移2呢 因为最后是要在第32个地址处来赋值的 burst传完后是在第31个地址处赋值(因为写的是31) 这时候是32位 2个16位 所以就是2 如果写的是0 0 那么最后一个数据会被覆盖掉

重要参数

  • THIRTYTWO_BIT:DMA传输的位为32位 这也导致如果想要顺序吧source里的数据转入到dest里面 DMACH1BurstConfig(31,2,2) 后两个参数要均为2 这代表着内循环用时候的偏差

方法拓展 外部固定地址 TO RAM

有时候很多芯片以外部接口+固定地址的FIFO给出的数据 此时 source的地址是不变的 dest 地址是递增的 这种情况下用以下配置
如果是16位的数据总线
可以用以下配置
DMACH1BurstConfig(0,0,0)
DMACH1TransferConfig(31, 0,1);
字为16bit
一次传递一个单位的数据

在底下for循环内加个延时带改DMAsource的值
在这里插入图片描述

测试结果:
在这里插入图片描述

完整程序:

#include "DSP28x_Project.h" // Device Header file and Examples Include File
#include "HAL/Hal.h"
#include "FML/Fml.h"//---DMA--------------------#define BUF_SIZE   1024  // Sample buffer size// DMA Defines
#define CH1_TOTAL               DATA_POINTS_PER_CHANNEL
#define CH1_WORDS_PER_BURST     ADC_CHANNELS_TO_CONVERT#pragma DATA_SECTION(DMABuf1,"DMARAML4");
#pragma DATA_SECTION(DMABuf2,"DMARAML5");volatile Uint16 DMABuf1[1024];
volatile Uint16 DMABuf2[1024];volatile Uint16 *DMADest;
volatile Uint16 *DMASource;__interrupt void local_DINTCH1_ISR(void);typedef struct DMA_TS{int BurstConfig_bsize;int BurstConfig_srcbstep;int BurstConfig_desbstep;int TransferConfig_tsize;int TransferConfig_srctstep;int TransferConfig_deststep;int ModeConfig_persel;int ModeConfig_perinte;int ModeConfig_oneshot;int ModeConfig_cont;int ModeConfig_synce;int ModeConfig_syncsel;int ModeConfig_ovrinte;int ModeConfig_datasize;int ModeConfig_chintmode;int ModeConfig_chinte;}DMA_TS;DMA_TS dma_ts = {.BurstConfig_bsize = 0,.BurstConfig_srcbstep = 0,.BurstConfig_desbstep = 1,.TransferConfig_tsize = 31,.TransferConfig_srctstep = 0,.TransferConfig_deststep = 1,.ModeConfig_persel = DMA_TINT0,.ModeConfig_perinte = PERINT_ENABLE,.ModeConfig_oneshot = ONESHOT_DISABLE,.ModeConfig_cont = CONT_DISABLE,.ModeConfig_synce = SYNC_DISABLE,.ModeConfig_syncsel = SYNC_SRC,.ModeConfig_ovrinte = OVRFLOW_DISABLE,.ModeConfig_datasize = SIXTEEN_BIT,.ModeConfig_chintmode = CHINT_END,.ModeConfig_chinte = CHINT_ENABLE,
};
int flag = 1;
//---DMA--------------------
void main(void){Uint16 i;// Step 1. Initialize System Control:PLL, WatchDog, enable Peripheral ClocksInitSysCtrl();// Step 2. Initialize GPIO: This example function is found in the F2837xS_Gpio.c file and illustrates how to set the GPIO to it's default state.InitCpuTimers();InitGpio();configtestled();// Step 3. Clear all interrupts and initialize PIE vector table:// Disable CPU interruptsDINT;// Initialize the PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags// are cleared.// This function is found in the F2837xS_PieCtrl.c file.InitPieCtrl();EnableInterrupts();// Disable CPU interrupts and clear all CPU interrupt flags:IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).// This will populate the entire table, even if the interrupt// is not used in this example.  This is useful for debug purposes.// The shell ISR routines are found in F2837xS_DefaultIsr.c.// This function is found in F2837xS_PieVect.c.InitPieVectTable();InitXintf();EALLOW;// Allow access to EALLOW protected registersPieVectTable.DINTCH1 = &local_DINTCH1_ISR;EDIS;// Disable access to EALLOW protected registersIER = M_INT7;	                             //Enable INT7 (7.1 DMA Ch1)EnableInterrupts();CpuTimer0Regs.TCR.bit.TSS = 1;               //Stop Timer0 for now// Initialize DMADMAInitialize();// Initialize Tablesfor (i = 0; i < BUF_SIZE; i++) {DMABuf1[i] = 0;DMABuf2[i] = i + 1;}// Configure DMA ChannelDMADest = &DMABuf1[0];DMASource = &DMABuf2[0];DMACH1AddrConfig(DMADest, DMASource);DMACH1BurstConfig(dma_ts.BurstConfig_bsize, dma_ts.BurstConfig_srcbstep, dma_ts.BurstConfig_desbstep);         //Will set up to use 32-bit datasize, pointers are based on 16-bit wordsDMACH1TransferConfig(dma_ts.TransferConfig_tsize, dma_ts.TransferConfig_srctstep, dma_ts.TransferConfig_deststep);      //so need to increment by 2 to grab the correct locationDMACH1WrapConfig(0xFFFF, 0, 0xFFFF, 0);//Use timer0 to start the x-fer.//Since this is a static copy use one shot mode, so only one trigger is needed//Also using 32-bit mode to decrease x-fer timeDMACH1ModeConfig(dma_ts.ModeConfig_persel, dma_ts.ModeConfig_perinte, dma_ts.ModeConfig_oneshot, dma_ts.ModeConfig_cont, dma_ts.ModeConfig_synce,dma_ts.ModeConfig_syncsel, dma_ts.ModeConfig_ovrinte, dma_ts.ModeConfig_datasize, dma_ts.ModeConfig_chintmode, dma_ts.ModeConfig_chinte);StartDMACH1();//Init the timer 0CpuTimer0Regs.TIM.half.LSW = 512;    //load low value so we can start the DMA quicklyCpuTimer0Regs.TCR.bit.SOFT = 1;      //Allow to free run even if haltedCpuTimer0Regs.TCR.bit.FREE = 1;CpuTimer0Regs.TCR.bit.TIE = 1;      //Enable the timer0 interrupt signalCpuTimer0Regs.TCR.bit.TSS = 0;      //restart the timer 0DELAY_US(10);for (;;){int i;for (i = 0; i < 30; ++i) {DELAY_US((Uint32)1000000);}DMABuf2[0]++;};}// INT7.1
__interrupt void local_DINTCH1_ISR(void)     // DMA Channel 1
{// To receive more interrupts from this PIE group, acknowledge this interruptPieCtrlRegs.PIEACK.all = PIEACK_GROUP7;// Next two lines for debug only to halt the processor here// Remove after inserting ISR Code__asm ("      ESTOP0");for(;;);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19344.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Java SE】JDBC

JDBC&#xff08;Java DataBase Connectivity&#xff09;是一套用于在 Java 中操作关系型数据库的 API。它允许开发者使用统一的 Java 代码来访问不同的关系型数据库。 JDBC 的本质&#xff1a;JDBC 是由官方&#xff08;Sun 公司&#xff09;定义的一套接口规范&#xff0c;…

西电数据库课设|设计学籍管理系统

前言&#xff1a;ER图和逻辑结构图不准确&#xff0c;因为在后期实际建表的过程中有改动&#xff0c;去除了一些列和外键关系&#xff0c;但是我懒得返回去改图了&#xff0c;所以还是需要自己情况画图&#xff0c;还有学生信息我忘记加性别什么的&#xff0c;这个比较简单&…

优维HAO案例:500强旗下全牌照综合性券商CMDB平台项目

撰文&#xff1a;鹿小U / 制图&#xff1a;脾气超好 某中国500强集团旗下的HS公司&#xff0c;是一家具有一定行业影响力的综合性证券公司。在近年来的发展进程中&#xff0c;该公司坚定不移地持续推进财富管理转型工作&#xff0c;将 ETF 的财富管理以及机构经纪业务作为公司…

github进不去解决办法-误打误撞进去了

我的要求不高&#xff0c;就算麻烦&#xff0c;只要能进去就行&#xff0c;但是我找了很多的办法&#xff0c;xbox下载助手、watt Toolkit、更改host文件、fastgithub…最终还是没有用 绝望之际随便进了一个当时找的fastgithub连接 结果显示不是专用链接 然后看了该博主的文章…

RHCE——WEB服务器的部署及优化

URL组成 <scheme>://<user>:<password><host>:<port>/<path>:<params>?<query>#<frag> scheme 方案 访问服务器以获取资源时要使用哪种协议 user 用户 某些方案访问资源时需要的用户名 pass…

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…

基于SSM的毕业论文管理系统【附源码】

基于SSM的毕业论文管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统结构设计 4.2 系统顺序图设计 4.3 系统数据库设计 5 系统的实现 5.1 登录模块的实现 5.2 学生管理模块的实现 5.3 导师管理模块的实现 5.4 课题管理模块的实现 …

擎耀数字车灯CAN/LIN总线网络定向数据采集控制解决方案实施流程

2024年是数字车灯崛起的元年&#xff0c;随着车辆的智能化和网络化程度不断提高&#xff0c;车载网络系统&#xff08;如CAN总线&#xff09;成为连接各个电子控制单元&#xff08;ECU&#xff09;的重要纽带。车灯作为车辆重要的安全组件之一&#xff0c;其工作状态直接影响到…

【C++之STL】摸清 string 的模拟实现(上)

文章目录 1. 为什么要模拟实现&#xff1f;2. 基本框架搭建3. 构造函数3. 1 默认构造/from c_str3. 2 拷贝构造3. 2. 1 深浅拷贝 3. 3 fill3. 4 迭代器区间构造 4. 容量操作4. 1 size()和capacity()和empty()4. 2 clear()4. 3 resize()4. 4 reserve() 1. 为什么要模拟实现&…

视频直播5G CPE解决方案:ZX7981PG/ZX7981PMWIFI6网络覆盖

方案背景 视频直播蓬勃发展的当下&#xff0c;传统直播网络联网方式的局限性越来越明显。目前传统直播的局限性主要集中在以下几个方面&#xff1a; 传统直播间网络架构条件有限&#xff0c;可连接WIFI数量少&#xff0c;多终端同时直播难以维持&#xff1b;目前4G网络带宽有限…

input file结合vue3和vant实现上传图片效果,并显示上传进度百分比%

这里写自定义目录标题 采用的dom结构是input file&#xff0c;label事件绑定&#xff0c;一下为代码传入参数为uploadNum实现效果如图上传中&#xff0c;图片1上传成功&#xff0c;图片2 采用的dom结构是input file&#xff0c;label事件绑定&#xff0c;一下为代码 传入参数为…

SELECT 语句详解

开发准备 注:如果你是从上一节直接进入本节进行学习的,请先删除上一节建立的数据库mysql_shiyan,删除语句为DROP DATABASE mysql_shiyan;。在正式开始本实验内容之前,需要先下载相关数据库表,搭建好一个名为mysql_shiyan 的数据库(有三张表:department,employee,projec…

重力传感器算法概述!

一、核心技术 高精度重力测量技术&#xff1a; 无人机重力传感器的核心技术之一是能够高精度地测量重力加速度数据。这通常依赖于先进的传感器设计和制造工艺&#xff0c;以确保传感器具有高度的灵敏度和稳定性。 例如&#xff0c;中国船舶第七〇七研究所自主研发的低空重力…

炼码LintCode--数据库题库(级别:中等;数量:更新中~)--刷题笔记_03

目录 炼码LintCode--数据库题库&#xff08;级别&#xff1a;中等&#xff1b;数量&#xff1a;更新中~&#xff09;--刷题笔记_033617 更换连续两个人的座位&#xff08;case when&#xff09;题&#xff1a;sql&#xff1a;解释&#xff1a; 3615 数据中位数&#xff08;窗…

【stm入门学习SPI_铁头山羊系列教程】

stm入门学习SPI_铁头山羊教程 1.SPI总线1.电路结构与通信协议2.SPI的特点&#xff1a;3. 极性 相位4. 4中时钟模式5. 比特位的传输模式6.数据宽度 2. SPI引脚IO引脚初始化 1.SPI总线 1.电路结构与通信协议 主机向从机NSS引脚发送低电压&#xff0c;选中该从机。 主机通过向MOS…

RK3568平台开发系列讲解(platform虚拟总线驱动篇)实验:点亮一个LED

🚀返回专栏总目录 文章目录 一、设备树二、平台驱动三、应用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢xxx 程序编写的主要内容为添加 LED 灯的设备树节点、在驱动程序中使用 of 函数获取设备节点中的属性,编写测试应用程序。 • 首先向设备树添加 LED 设备节点…

Spring Boot 与腾讯云 MySQL 监听 Binlog 数据变化,并使用 UI 展示页面效果

引言 在现代的分布式系统和微服务架构中&#xff0c;数据同步和变更监控是保证系统一致性和实时性的核心问题之一。MySQL 数据库的 binlog&#xff08;二进制日志&#xff09;功能能够记录所有对数据库的修改操作&#xff0c;如插入&#xff08;INSERT&#xff09;、更新&…

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

PlantUML——时序图

PlantUML时序图 背景 时序图&#xff08;Sequence Diagram&#xff09;&#xff0c;又名序列图、循序图&#xff0c;是一种UML交互图&#xff0c;用于描述对象之间发送消息的时间顺序&#xff0c;显示多个对象之间的动态协作。时序图的使用场景非常广泛&#xff0c;几乎各行各…

算法——链表相交(leetcode23)

链表相交这题就是找出两个相交链表相交的节点并返回 如上图假设上方第一个节点是链表A的头结点下方第一个节点是链表B的头结点 解法有以下两种 方法一(移动长链表指针后同步移动两个链表的指针直至相等) 也就是先遍历链表A和链表B的长度接着得到链表A和B长度的差值然后领长链…