DSP28335的XINTF操作SRAM实验
1. 本次使用三兄弟的XDS28335开发板,研究一下XINTF操作SRAM的代码。哈弗结构,奇怪,DSP28335是哈弗结构,那么数据和程序空间应该独立的,为啥书上说采用统一的寻址方式?估计只是读写数据和程序的方法一样的意思。
2. 看下原理图部分,有地址线XA0-XA18,数据线XD0-XD15,XWEn是写信号(低电平有效),XRDn是读信号(低电平有效),F_CSn是片选信号(低电平有效)。
3. 看下芯片的XINTF章节介绍,最近TI把C2000系列划到MCU部分了,搞的找不到,Learn more(了解更多)。下图是DSP28335的内部地址空间,有3个区域,据说CCS可以通过仿真器直接访问XINTF连接的外部存储器,有点厉害。可以看下图的3个区域的地址空间,这里有个问题没明白,区域0的外部地址范围是0X00000-0X00FFF,如果要对区域0的第一个存储单元进行操作,需要将0X00000送到地址线,并将片选信号XZCS0拉低,这没问题,可是下面的0X0000 4000是什么地址?哎,好像明白了,0X0000 4000是DSP28335的内部地址,0X00000-0X00FFF是信号的地址,意思是程序里面写0X0000 4000这个地址,然后硬件上会把XZCS0拉低,XA(19:0)的值是0X00000,这个就是统一寻址的意思吧。本次SRAM用的是区域6。
4. 看下配置流程
5. 时钟的配置
6. 测试下代码,导入工程\SXD_C28335\SXD28335_PRO_1_V2\Example_2833xCodeRunFromXintf,第一个问题下面是什么意思?百度了一下利用#pragma CODE_SECTION指令可以将程序从Flash搬到RAM中运行,从而提高程序执行速率,该方法需要完成以下四步。
第一步,利用#pragma CODE_SECTION指令关联程序和SECTIONS;主函数的一开始用#pragma CODE_SECTION 将中断函数 cpu_timer0_isr 和cpu_timer1_isr 指定到片外 SRAM 空间。
// These two functions will be loaded into SARAM and copied to
// XINTF zone 6 for execution
#pragma CODE_SECTION(cpu_timer0_isr,"xintffuncs");
#pragma CODE_SECTION(cpu_timer1_isr,"xintffuncs");
第二步,为链接创建相关变量;
extern Uint16 XintffuncsLoadStart;
extern Uint16 XintffuncsLoadEnd;
extern Uint16 XintffuncsRunStart;
extern Uint16 XintffuncsLoadSize;
第三步,复制时间关键代码以及Flash设置代码到RAM;这个不懂,有什么用途?
memcpy(&XintffuncsRunStart, &XintffuncsLoadStart, (Uint32)&XintffuncsLoadSize);
第四步,修改CMD文件。这段程序的作用是将程序加载到片内 RAML1 空间中,运行时搬移到片外 ZONE6去 执 行 。 _XintffuncsLoadStart 为 变量加载的起始地址 、_XintffuncsLoadEnd 变量加载的结束地址、_XintffuncsRunStart 运行的起始地址、_XintffuncsLoadSize 加载代码的大小。这四个变量都是 CCS 自己算的(怎么算出来的,问题点?)。第一次接触这个机制,感觉很懵逼。把2个函数放到外部SRAM,那拷贝的时候怎么知道这个两个函数原来的地址和大小?理清思路,一个函数cpu_timer0_isr放到一个空间xintffuncs,这个空间配置如下(CMD文件只是配置地址空间而已):下面CMD文件只是为了生成4个变量给memcopy使用吗?
SECTIONS
{
/* Setup for "boot to SARAM" mode:
The codestart section (found in DSP28_CodeStartBranch.asm)
re-directs execution to the start of user code. */
codestart : > BEGIN, PAGE =
ramfuncs : > RAML0, PAGE =
.text : > RAML1, PAGE =
.cinit : > RAML0, PAGE =
.pinit : > RAML0, PAGE =
.switch : > RAML0, PAGE = xintffuncs : LOAD = RAML1,
RUN = ZONE6,
LOAD_START(_XintffuncsLoadStart),
LOAD_END(_XintffuncsLoadEnd),
RUN_START(_XintffuncsRunStart),
LOAD_SIZE(_XintffuncsLoadSize),
PAGE =
}
看下ZONE6的区域,既然4个变量是CCS自动算的。那么memcopy是什么用途?拷贝的是什么?是2个定时中断函数吗?指定到片外SRAM和可拷贝到片外SRAM的区别是什么?
RAML1 : origin = 0x009000, length = 0x001000
ZONE6 : origin = 0x180000, length = 0x001000
看下这几个变量的定义,不过依然不太懂
_XintffuncsLoadEnd
_XintffuncsLoadSize
_XintffuncsLoadStart
_XintffuncsRunStart
7. 看下代码部分,关注关键点,是不是初始化区域6的SRAM之后,就可以把这两个中断函数复制到这个SRAM里面的意思?
// Initialize XINTF Zone 7
init_zone6(); //首先要初始化访问 zone6 空间的时序 // Copy non-time critical code to XINTF
// This includes the following ISR functions: cpu_timer0_isr(), cpu_timer1_isr()
// The XintffuncsLoadStart, XintffuncsLoadEnd, and XintffuncsRunStart
// symbols are created by the linker. Refer to the F28335_ram_xintf.cmd file.
memcpy(&XintffuncsRunStart, &XintffuncsLoadStart, (Uint32)&XintffuncsLoadSize);
8. 本次例程有3个定时器中断函数,估计是2个拷贝到区域6的SRAM里面运行,一个在DSP28335的内部SRAM里面运行。
__interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
__interrupt void cpu_timer1_isr(void)
{
CpuTimer1.InterruptCount++;
// The CPU acknowledges the interrupt.
EDIS;
}
__interrupt void cpu_timer2_isr(void)
{ EALLOW;
CpuTimer2.InterruptCount++;
// The CPU acknowledges the interrupt.
EDIS;
}
9. 看下XINTF的配置函数
void init_zone6(void)
{
// Make sure the XINTF clock is enabled
EALLOW;
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = ;
EDIS;
// Configure the GPIO for XINTF with a 16-bit data bus
// This function is in DSP2833x_Xintf.c
InitXintf16Gpio();
EALLOW;
// All Zones---------------------------------
// Timing for all zones based on XTIMCLK = SYSCLKOUT
XintfRegs.XINTCNF2.bit.XTIMCLK = ;
// Buffer up to 3 writes
XintfRegs.XINTCNF2.bit.WRBUFF = ;
// XCLKOUT is enabled
XintfRegs.XINTCNF2.bit.CLKOFF = ;
// XCLKOUT = XTIMCLK
XintfRegs.XINTCNF2.bit.CLKMODE = ;
// Disable XHOLD to prevent XINTF bus from going into high impedance state
// whenever TZ3 signal goes low. This occurs because TZ3 on GPIO14 is
// shared with HOLD of XINTF
XintfRegs.XINTCNF2.bit.HOLD = ;
// Zone 7------------------------------------
// When using ready, ACTIVE must be 1 or greater
// Lead must always be 1 or greater
// Zone write timing
XintfRegs.XTIMING6.bit.XWRLEAD = ;
XintfRegs.XTIMING6.bit.XWRACTIVE = ;
XintfRegs.XTIMING6.bit.XWRTRAIL = ;
// Zone read timing
XintfRegs.XTIMING6.bit.XRDLEAD = ;
XintfRegs.XTIMING6.bit.XRDACTIVE = ;
XintfRegs.XTIMING6.bit.XRDTRAIL = ;
// don't double all Zone read/write lead/active/trail timing
XintfRegs.XTIMING6.bit.X2TIMING = ;
// Zone will not sample XREADY signal
XintfRegs.XTIMING6.bit.USEREADY = ;
XintfRegs.XTIMING6.bit.READYMODE = ;
// 1,1 = x16 data bus
// 0,1 = x32 data bus
// other values are reserved
XintfRegs.XTIMING6.bit.XSIZE = ;
EDIS;
//Force a pipeline flush to ensure that the write to
//the last register configured occurs before returning.
__asm(" RPT #7 || NOP");
}
10. 运行ccxml目标配置文件,启动,连接目标开发板,加载程序,
11. 首先将用于中断计数的 CpuTimer0.InterruptCount、CpuTimer1.InterruptCount 和 CpuTimer2.InterruptCount 添加到观察窗口中。并设置窗口为连续刷新。开始全速运行,可以看到这三个计数器会累加计数。我是全部加载到观察窗口了。
12. 看下内存空间,也可以通过View->Memory Browser查看cpu_timer0_isr 和cpu_timer1_isr 所在空间的地址。刚开始我选的Data,所以没找个这个函数,原来还有3个选项。切换到Program空间,找到函数。
13. DONE,飞翔吧,上一个妹子的照片
DSP28335的XINTF操作SRAM实验的更多相关文章
- 外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样(转)
源:外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样 前几天看到开源电子论坛(openedv.com)有人在问这个问题,我特意去做了这个实验,这样用外部SRAM就跟用内部SRAM一样 ...
- C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)
今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...
- Mysql 8.0 导入txt文件操作(课程实验)
一.实验准备: 1.实验设备:Dell laptop 7559; 2.实验环境:windows 10操作系统; 3.数据库版本:mysql 8.0; 二.实验目的: 1.将一个宠物表pet.txt文件 ...
- SQL 数据操作(实验六)
SQL 数据操作 emp.dept 目标表结构及数据 INSERT 命令的使用与结果验证 2.1把一名新来雇员信息插入到EMP表中:雇员号:1011 姓名: 王晓明 入职日期:今天 ```insert ...
- 在WebGL场景中进行棋盘操作的实验
这篇文章讨论如何在基于Babylon.js的WebGL场景中,建立棋盘状的地块和多个可选择的棋子对象,在点选棋子时显示棋子的移动范围,并且在点击移动范围内的空白地块时向目标地块移动棋子.在这一过程中要 ...
- 实验四:xl命令的常见子命令以及操作
实验名称: xl命令的常见子命令以及操作 实验环境: 这里我们需要正常安装一台虚拟机,如下图: 我们这里以一台busybox为例,来进行这些简单的常见的操作: 实验要求: 这里我们准备了5个常见操作: ...
- 第13章 GPIO—位带操作
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- 第13章 GPIO-位带操作—零死角玩转STM32-F429系列
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- (stm32学习总结)—GPIO位带操作
本章参考资料:<STM32F10X-中文参考手册>存储器和总线构架章节.GPIO 章节,<CM3 权威指南 CnR2>存储器系统章节. 位带简介 位操作就是可以单独的对一个比特 ...
随机推荐
- datatable Left and right fixed columns
$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", sc ...
- 【[APIO2012]派遣】
题目 直接线段树合并就好了 之后在线段树上二分贪心选取金额较少的 如果是左偏树的话就开一个大根堆,根和子树顺次合并,合并之后堆内所有元素总和如果大于\(m\)就删除堆顶,由于每个元素只会被删除一次,所 ...
- 【luogu P2298 Mzc和男家丁的游戏】 题解
题目链接:https://www.luogu.org/problemnew/show/P2298 对于迷宫问题,bfs是比较好的选择. 直接bfs模板 #include <iostream> ...
- Android 滑动效果汇总
Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...
- laravel5项目安装debugbar
链接:https://github.com/barryvdh/laravel-debugbar 1.项目目录运行 composer require barryvdh/laravel-debugbar ...
- UGUI防止点击穿透
if (!IsPointerOverGameObject(Input.mousePosition)) { } public static bool IsPointerOverGameObject(Ve ...
- 通过ajax给后台提交数据时,radio性别数据的获取
通过ajax向后台异步发送数据,经常我们会遇到个人信息额提交,一般我们采用FormData来装数据.在装性别值得时候,我们会有两个radio框,获取radio值得方法如下: 一般情况下,一个radio ...
- RL 编、解码(EncodedString、DecodedString) - iOS
开发中对文本传输或二进制传输,都需要将传输的对象进行二进制字节的转化操作,所以无异于编.解码便会经常用到的操作; 当然除了这种方式之外,还有一种常用的 Base64,此文中不具体细谈, Base64 ...
- #leetcode刷题之路20-有效的括号
#include <iostream> #include <string> #include <stack> using namespace std; bool i ...
- <<学会提问>>第一章学习笔记
中国应不应该现在取消死刑? 中医是不是伪科学? 读书无用论? 集体主义和团队精神? 欧洲难民危机,你是支持接收难民,还是反对? 欧洲白左是不是幼稚圣母,抑或是右派种族歧视,顽固保守? 如何看待&quo ...