DSP | CCS v3.3 利用I/O端口从外部文件传送数据的相关配置


引言

喵呜,不知不觉有一个多月没来写东西了(摊手

考试月也太难熬了吧(头秃.gif)啊啊啊终于过来了!

每个期末都很难过,但这个期末怕是最难受最焦虑的一个了,主要是一堆事情全堆到了考试月甚至最后的扎堆考试周。五门线上考试有四门是两门两门连着考的,期间还有各种课程的实验(及实验报告)、大作业(及其报告)、结课报告、网课考试,以及零零散散的杂事 balabala。考前赶着 ddl 一天写了两篇半报告,然后挤着时间疯狂 预习考试课程,人都要没了……

这学期选了一门 DSP 原理与应用 选修课,亲身感受证明这门课太难了,唉,后悔没退掉哭唧唧。 这个大作业太难做了呀!之前折腾了好久做不出来,拖着拖着就有点佛系了((

做这个 DSP 大作业需要用到 CCS 软件,就是辣个 TI 出的 Code Composer Studio 集成开发环境 (IDE),然而是用古老的 v3.3 版本!据老师是因为用到的是 DSP 型号为 TMS320C54x 系列,而这个系列只有在这一版本上才有支持。啊是挺古老的了。

去官网看了看,现在最新的是 11 Jun 2020 发布的 10.1.0.00010。

又去翻了翻 CCS 版本历史页面,拉到最下面才找到了 V3.3 版本,佛了,CCSv4.0.x是2009年发布的,那 v3.3 岂不是更古老……

Version3

据说这个软件只支持 32 位操作系统,于是先在虚拟机里整了个 Windows 7 32bit 系统,然后才装上这古董 emmm。

而对于利用 Simulator 的 I/O 端口从外部文件传送数据的方法,查了各种资料几乎没有相关介绍,最后是在老师和小伙伴的指导和提示下,才实现了这一操作。

那正好就来记录一下吧,希望对学弟学妹们有点帮助(如果看到的话),也对想要从事相关研究的读者有所启发。



方法介绍

再扯几句吧。首先是把教材上关于 CCS 使用的介绍过了一遍。

教材第三版:balabala 详见 4.7.3 小节,然而并没有这一节(估计再版的时候没改)。

翻出第一版电子版,傻了,2001年的版本,那时候还没用 CCS,是用命令行模拟的……

网上找了各种资料,也没具体介绍,要不然就是利用 C语言(而不是汇编)来编写的代码,这个导入数据的方法又不一样,是在C语言中相应的语句打上断点,而后修改断点的条件为读取/写入数据来实现的。

看了一遍暑假要补做的 DSP 实验的指导书,貌似介绍的是更古老的 CCS 2.x 版本,这个版本又不一样,试了但数据并没有成功输入,又怀疑是输入文件格式的问题。
……

到了最后,在小伙伴提示下,找到了老师在群里发的拍的几页课本。才知道原来是第二版课本的 4.7.3 小节里做了介绍……(头秃

其实就是将 I/O 口的地址与外部的数据文件相关联。参考第二版课本,具体的实现的步骤如下。

Step 1 修改 GEL 文件

CCS 的 GEL 语言(通用扩展语言)是一种交互式的命令,它是解释执行的,即不能被编译成可执行文件。它的作用在于扩展了 CCS 的功能,可以用 GEL 来调用一些菜单命令,对DSP的存储器进行初始化配置等。

通过修改 GEL文件,定义 I/O 端口地址映像

在初始化过程中将输出端口 PA0 映射到 0x0000,将输入端口 PA1 映射到 0x0001

即在 C5402_Init() 函数中加入下面的语句。

GEL_MapAdd(0x0001,2,1,1,0); /* I/O Read */
GEL_MapAdd(0x0000,2,1,0,1); /* I/O Write */

具体含义是

GEL_MapAdd(address, page, length, readable, writeable);

address 端口地址值。

page 存储空间值。0:程序空间,1:数据空间,2:I/O 空间。

length 地址空间长度。对于 I/O 端口一般取为1。

readable 可读标志。1可读,0不可读。

writeable 可写标志。1可写,0不可写。

修改后的结果如图所示。

gel

gel2

Step 2 Reload GEL File

请注意,一定要重新加载 GEL 配置文件,否则这个配置是不生效的。(这里有一个掉坑里的

具体方法就是在左边的文件列表里这个 gel 文件上右键,点击 Reload 即可。

当然,还有另一种方法,那就是重启 CCS 软件。实在不行重启系统也行 23333.

(重启解决绝大部分问题呢!

Step 3 Port Connect

点击菜单栏下的 Tools - Port Connect。建立端口与文件之间的连接。

PortConnect

端口设置如下。

connect

Port 即在 Step 1 中设置的端口,0x01 为输入端口,0x00 为输出端口。Type也相应设置。

Length 设置为1。

Page 设置为 I/O。

点击OK之后会弹出文件选择窗口,选择你要导入/导出数据的文件即可啦!

噢对了,这里提一句,这个文件的格式是每行一个十六进制的数据,数据长度为16位,不带前导符0x,即形式为 xxxxx为 0-F 之间的数。例如下图所示。

file format

这个格式与利用断点输入输出数据的格式不同,要注意一下!(那个是首行有格式标识的,1651 balabala)

Step 4 确认连接

在下方会有一个新的窗口,配置好后的状态如下图所示。

port

可以通过 Connect 和 Disconnect 按钮来建立/取消端口连接。

要注意的是,这个写入的文件,在断开连接之前,都是一直被 CCS 占用着的,而且并没有实时写入文件!

(盲猜可能在输出缓存中?占用了文件句柄但没有 flush?)

因此要想看到结果的话一种方法是断开输出文件,另一种方法,关掉 CCS(简单粗暴。

Step 5 在汇编中使用端口

首先定义输入输出端口如下。

PA0 .set 0 ;0口 输出 
PA1 .set 1 ;1口 输入

而后结合 PORTR、PORTW 等命令使用端口即可。

PORTR PA1,@x
PORTW @y,PA0

好了,大概就这些了喵~


一种简化方法

噢对了,书上还给出了一种替代方案,可以简化前述方法的 Step 3.

就是在 GEL 文件初始化函数中再加入下面的语句,直接建立端口的连接。

GEL_PortConnect(0x0001,2,1,0x01,"C:\\ti\\C54x\\in.dat");
GEL_PortConnect(0x0000,2,1,0x02,"C:\\ti\\C54x\\out.dat");

具体含义是

GEL_PortConnect(portAddress, page, length, accessType, fileName);

portAddress 端口地址值。

page 存储空间值。0:程序空间,1:数据空间,2:I/O 空间。

length 地址空间长度。对于 I/O 端口一般取为1。

accessType 存取类型。1为读取(输入),2为写入(输出)。

fileName 外部数据文件名。注意是绝对地址,目录要用双斜杠。

(不过这个办法我也没试过,不清楚怎么样喵

(也就是简化了那个端口连接的操作而已啦


其他一些 tips

也算是琢磨出来的/调教出来的一些经验吧……头秃。

  1. 每次修改汇编程序,Rebuild 之后,都要记得 Reload Program(当然第一次跑程序的话就是 Load Program 了2333),将输出的 out 文件加载到 Simulator 中进行仿真调试。

  2. 画图的时候,每运行完一遍程序,都要重新启动(Restart),不然啥也没有变化,或者会出现奇奇怪怪的东西,当然也有可能是代码设计上的问题了。

  3. 画图的话必须要在停下来(halt)的时候才能绘制,不然没变化。这里可以在程序中加入断点来实现。我建议的话还可以在输出数据的位置打个断点,然后选项选择更新所有窗口(Update all windows),还是叫 Refresh Window 来着,感觉上是有用的可行的。而后在最后程序结束死循环那里再打一个断点,这样运行程序的时候,就会自动在结束时停下,把图画出来了!(当然玄学情况就不好说了23333)

  4. ……

反正经常 Reload 就完事了 hhhhh。

这个版本的软件给我的感觉就是,功能实现的设计上十分不友好,用户体验就感觉挺蠢的。

不过毕竟是多古老的版本呢!

BTW,之前还用过 CCS v9.x 版本开发 MSP432 之类的 MCU,当时用C语言开发,主要是 MCU 函数接口的资料比较少,只有官方英文文档,那时网上还没有多少关于那款 MCU 的使用经验(现在不清楚了),就比较难受,但相比而言软件使用感觉上就好多了。可能是新版本换了基于 Eclipse 开源软件框架来做界面的原因吧 23333333。

就这样吧。

(溜了喵~


Reference

Code Composer Studio 集成开发环境 (IDE)(TI 官网)

戴明桢, 周建江. TMS320C54x DSP 结构、原理及应用(第2版)[M]. 北京:北京航空航天大学出版社.


文章作者: MiaoTony
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 MiaoTony !
评论
  目录