TMS320C54x系列DSP内部结构功能笔记 下载本文

大家在阅读的时候使Word成折叠模式看着会更舒服些。 关于文档里边用到的中文参考资料,附下载地址: http://bbs.21ic.com/icview-161578-1-1.html

前言

DSP的本质还是单片机-微机,个人认为,微机类芯片,不论是MCU,ARM还是DSP甚至是PC上的处理器,我们在学习这类芯片的使用时,首先要学习的便是这些芯片的CPU核,存储器组织和中断系统。只有把这几方面的内容掌握之后,你才能说根据其特点来使用这块芯片,Debug时你心中才有数。至于片上外设,与芯片本身其实并没有太大关系,大可以要使用时再去学习,而且不同芯片的外设其实还都是相通的。基于此,我把我在学习这类芯片时对于这几块的学习的笔记摘录出来(这篇文档中对是对Ti的TMS320C54x系列的学习笔记),以供大家参考。

我的笔记虽然可能次序,排版,没有市面上的书本组织得好,但我可以说,我决对是面面向应用来写的,而不是为了出书来写的。市面上的技术类的书,大多数其实只是简单的把官方的文档翻译过来而已,而且在翻译的过程中还省略了很多细节,这些细节其实对于我们的理解和工程开发都是很重要的,另外很多翻译还不准确。在我的笔记中,中文资料我只是作为一个参考,或者作为一种线索,真正有价值的信息都是来自于我对于官方文档的学习。每一部分的记录都是以一个新手的态度来写的,这些问题都是新手在学习过程中很可能会遇到或想到的。虽然排版不好,但当你遇到相关问题或想了解某一块时,把我写的这个Word文档下载下来,然后使用Word文档的搜索功能搜索自己感兴趣的内容,相信一定会让你得到较为满意的结果的。

不仅是DSP芯片方面的知识笔记,在我向信号处理工程师奋斗的路程上,我对我每一天的学习都作了笔记记录,这些笔记记录都是面向新手,面向细节,面向工程的,都是自己用心的体会。当有笔记成熟或自成一块时,我会把这些笔记都陆续分享给大家,以供大家在学习或开发过程的参考,希望能为大家节省点时间。附一张目前自己的笔记文件夹的图。

几十年之后,我的肉体可能已经化为泥土或成为其它生物的一部分,所有我拥有的物质

都是带不走的,我能留给世人,后代子孙的也就是自己活着时的思想,精神。用心记录下自己活着时可能对后人有用的东西,不为物质利益,把它上传到云端,我想这应该是我用心去做的最有意义的事情之一。

在写这些笔记的过程中,我和我的女友虹虹正处在非常困难的时间,说来话长,愿意帮帮我的大侠请慢慢往下看,小弟先谢过了。

我现在(2012年9月到2013年7月,研一)在北京的电信科学技术研究院上研一,即大唐大信集团,研二回成都跟着导师学习。导师招生的方向写的是网络通信,但实际我跟了他才知道是他要搞的是汽车电子,偏各种工业控制总线,并不是自己一直想从事的信号处理的方向。导师给的任务也与信号处理没多大关系,与电信科学技术研究院的特色——通信专业就更没有关系了。我不是电信科学技术研究院的定向生,即以后大唐集团没有义务接收我,以后还要拿着电信科学技术研究院的硕士学位证到社会上找工作,社会上对电信科学技术研究院的承认还在于通信方面,如果我只是按他的要求做,显然自己在2015年找工作时是完全处于劣势的。

作为学生,导师交代什么任务,我自然是会尽心去做,但这位导师手上真的没什么资源,他主要的工作在于当A大学电子信息工程系的院长,没什么工程资源可以给我用,自己在做任务的过程什么都要靠自己垫钱买,自己家里本来就很困难,生活费也紧张,我垫得很痛苦,做起来也是各种资源没有。

最初选导师时并也不是想选他作导师的,我本来是想选另外一位导师的,那位导师的方向是自己喜欢的,也有自己的公司,手上资源多。但在可选学生中,我是复试中是表现最好的,这位导师就把我选了,另外那位我想选的导师也不好拒绝我现在导师的要求,因为我现在的导师是院长,而我想选的那位导师只是A大学电子信息工程系的副院长。

这样的情况促使我除了完成现在导师交给我的任务,我还必须在信号处理,通信这些上去发展,我现在除了每天不断丰富自己在信号处理,通信方面的知识,也在积极寻求能让自己实践的机会。导师那里是不能了,我只能到社会上去寻找。2013年3月份,我在网上遇到了一位成都的工程师,他们公司在成都做无线通信方面的军品,要用到很多信号处理和通信方面的知识,他告知我,2013年6月回成都可以过去面试一下,感觉可以的话,就可以到他们公司去兼职。我现在不要求什么报酬,也和那个工程师沟通得比较快乐,特别是技术方面,所以去这家公司去做兼职问题也不大。

情况看来并不遭糕,但2013年出了一个变故让情况有了很大的变化,我的女友,和我是成都同一所大学电子信息工程系的同班同学,2012年上半年,即大四下期她在成都找到了一份Layout的工作,就这样一直在成都工作。

我2012年9月离开成都到北京的电信科学技术研究院上研一的理论课程,她一个人留在了成都。虽然她一个人在成都很苦,但我们相信只要熬一年,研二我回成都就好了。我们自认为一年我们撑得过去。但我们显然高估了女友耐一个人独处的能力,女友从小都在她父亲和哥哥的保护下长大的,父亲和哥哥都是很Men的那种,所以导致她自己一个人是相当不习惯一个人的独处生活,一个人的时候她也极度缺乏安全感。

熬到今年(2013年)三月份,女友实在是熬不过去了,辞职了,到深圳去找实习单位,这样导致我们的情况发生了巨大的变化。

我2013年2月20号过完寒假回到北京开始研一下半学期的学习。这段时间女友面临者三座大山:

①从2012年2月工作到2013年3月女友所在的公司都没有一点加薪的动静,其实女友也不是那么看重钱的人,只是我的家庭条件实在不好,家里的钱在成都连给首付的钱都不够,所以也只能靠我们俩努力挣房钱,所以自然就希望工资高一点。

②不加薪就算了,2012年12月份还新引进了一位不懂管理的管理者,用小学生式的管理方法把公司管得一团乱,女友感到工作很压抑。

③2013年2月20号我离开成都到北京上学后的一段时间,女友是极度不适应我不在的日子,特别希望我回成都陪陪她,但我想我还一个月的时间都没走到,就没有坐火车从北京回成都去陪她,现在真是后悔,如果当时自己回去了陪陪她,女友后来也不会做出那样冲动的决定。

④我的兼职有着落的时候,女友还没有做出后来的决定,但是我找的那份兼职工作在离女友现在所做的公司很远,每天坐公交要坐很久。在女友工作的周围找(高新西区),又很难找到跟信号处理与通信有关的兼职。成都本来兼职实习机会就很少,方向对口就很不容易了。所以到时候我回成都后,如果我们要想在一起,很有可能又会遇到很多麻烦,说不定又要搬家,2012年我们在成都就已经搬了两次家,女人都是很讨厌搬家这种事的。

以上四点压在女友的心上,都快使得她崩溃了,在这种情况下,没和我商量,她辞职了,并且准备到深圳去发展,他哥在深圳那边工作了两年,工资还涨的挺快的。

我听说这个消息后,基于种种考虑,既然事情都已这样,还是只能让女友到深圳去工作了。我想,她哥和嫂子在那边,他们在一起的话,女友应该不会害怕,也不会感到孤单。这两天,女友到了深圳,这两天正在找Layout的工作(还没找着,有机会的大侠联系我下哈),才发现她哥和嫂子每天也很忙,也没时间照顾她。她现在明白了自己希望的生活也并不是和她哥和嫂子一起生活,而是希望自己所爱的人和她一起在那边租个小单间,一起工作,生活,奋斗。同时也意识到两年的时间在我们俩的感情她肯定是挺不过去的,她肯定会先放弃我们这段感情,虽然我们现在都很爱对方,但她相信,两年的时候,她对我的感情肯定会被磨灭,这样的结果也是她不想发生的,想到这一点她就非常痛苦。

虽然两年的时候不会把我对她的感情磨灭,反而我会越来越爱她,但一个巴掌拍不响,到时候别人乘虚而入,我也是无力回天。所以我现在就是特别想尽量保持住我们的感情。

现在的我要想保持住这份感情,想来想去,好点的办法就是我在成都上研二,研三的时候尽量多去深圳,多陪陪她。

我希望能在深圳找一份数字信号处理偏通信方向的兼职工作,按理说,在深圳,找这种兼职很好找,但是我相信大家也看了我上面的情况,也肯定能想到我这份兼职工作肯定是有特殊要求的。总结起来,这份兼职工作应该有以下特点。

①能允许我将工作带到成都去做,因为我的导师在成都,所以按理我也应该呆在成都,但我的导师很忙,我们也难得见一面,一般是1个月到2个月才见一面,但还是偶尔要见一次才行吧!当我呆在成都的时候,我也想尽心心力完成贵公司交给我的任务,所以要允许我将工作带到成都去做。当然当工作确实需要在深圳的公司完成的时候,比如需要借助某些硬件平台或仪器调试测试的时候我也会到深圳来。

②我不要求报酬,也不要求什么福利,只希望公司能帮我报火车票的车费,我只坐硬坐,所以还是不贵的,而且谁也不愿意整天坐火车成都-深圳的来回跑的,所以不到非要从深圳到成都见导师面或从成都到深圳对实际的工作进行测试,调试的时候,我不会轻易去花费这个火车费的,这点请公司放心。

③平时的时间我一周花四天的时间在兼职上,花三天的时间在导师交给的任务上。 ④放暑假和寒假我都是可以每天呆在深圳的,也不要求什么报酬,给点生活费就可以了。 ⑤以后毕业之后我肯定会到深圳工作,所以请公司不用担心我以后毕业不来深圳了。 有机会的大侠请帮帮我,我真的很想保护好我和女友的爱情,也真的很想在信号处理与通信的方向上有长远的方展,如果这次能得到某位大侠的帮助,小弟感激不尽。

笔记记录人:苏文昊(大地知心)

电信科学技术研究院(CATT)2012届研究生 联系方式:

更多相关专业文章请访问以下百度空间: http://hi.http://www.32336.cn//dsp_suwenhao?page=1

目录

必须知道这一点: ........................................................................................................................... 6 意外的惊喜: ................................................................................................................................... 6 一、54x系列CPU核 ...................................................................................................................... 7 二、54x系列存储器组织 .............................................................................................................. 23 三、54x系列中断 .......................................................................................................................... 26

必须知道这一点:

DSP复位后,首先执行FF80H的指令,而FF80~FFFFH是中断矢量表。具体是这样的:在MP/MC管脚置低,这样上电复位后,程序自动从内部的FF80H(中断矢量表的起始地址)地址开始运行。在FF80H处,有一条跳转到BOOT程序的指令,开始运行内部的BOOT程序。BOOT程序的作用就是把外部FLASH存储器的程序搬移到RAM中去。

意外的惊喜:

哇噻,官方文档上还有推荐的寄存器初始化顺序:

关于指令集:

20:50:49 为了方便不懂指令的查询,我把《DSP应用系统设计实践+郑红等编著.pdf》末尾附的汇编指令表给做成txt文档了(后来发现真的不如文档:spru172c TMS320C54x DSP Reference Set Volume 2 Mnemonic Instruction Set.pdf来得快啊,来得好啊),如下:指令集

C54x指令集.txt

一、54x系列CPU核

《DSP程序开发:MATLAB调试及直接目标代码生成》30页(非电子书页数)开始有详细叙述

先总体来看有哪些功能单元。

首先来看ALU

这里面我有几个疑问:

1.饱和模式功能的效果和进位位所产生的效果有何区别? 2.条件操作码C和NC 是怎么用的?

也许下面这段话能解释第1个问题,但是又存在另外的问题~

要注意,上面的数值都只有32位哈,还有8位是保护位的。 我的疑问是: 1.符号位哪去了?

答:当SXM=0时,是没有符号位的;当SXM=1时,是有符号位的。 理解了这个,第2问就好理解了。

2.8000 0000h应该是一个很大的数啊,怎么小于它的数还要饱和到它?哦,懂了,这个是用补码表示的最小负数。那说明最高是符号位啦!

再来看累加器:

这段话好明白。

关键是要把这个例子的结果为什么是那么多搞清楚!

相关的指令我作的索引里也没有,光有下ST ST也不带中间的参数,所以我弄不懂了

这个简单撒,全部转化成二进制就好看了。 FF 4321 1234

>> dec2bin( hex2dec('ff43211234'))

ans =

11111111 0100001100 1000010001001000110100

>> dec2bin( hex2dec('2112'))

ans =

10000100010010 可见,取得是其中我用绿色标出的那段,可是绿色前面的那段除去保护位还有10位啊! 这个就是问题的所在了! 再看第二条吧~

>> dec2bin( hex2dec('ff43'))

ans =

1111111101000011

对比:

1111111101000011 001000010001001000110100

还是不知道怎么移的,这个根本就没移过啊! 强烈建议明天去下:

好了,今天就到这里,先睡了吧! 后来查到了,原来是这样的:

这里是第3种情况,所以 STH A,8,TEMP;

中,移位量是8-16=-8 即向右移8位,正数的情况下是向左移8位的。 知道了这个之后,我们再来对比: >> dec2bin( hex2dec('ff43211234'))

ans =

11111111 0100001100 1000010001001000110100

>> dec2bin( hex2dec('2112'))

ans =

10000100010010

显然情况还是不对的。这种情况显然是向左移了10位的。这个该怎么办?只好把这个问题留在这里,等我能写实际的汇编程序的时候再写一个程序测试一下就OK了。

继续昨天的,先去把上图中的5个文档都下载下来吧! spru 131 172 173 179 302

10:23:24 下载完成了,也查到了。如下:

SXM 符号扩展方式位

打绿颜色的意思是在SXM=1的情况下,最高位39位,即符号位的扩展是在执行一个操作之后。这个操作是指超出32位到39位的保护位边界的右移。???呜呜,自己分析了半天也没搞清楚是怎么回事?

后来我查了SXM,觉得应该是这么回事,保护位里的数字是1还是0应该与最高位的39位一样,进行符号位的扩展就是在0到31位最高的0位填符号位。既然保护位里的数字是1还是0应该与最高位的39位一样,那么我进很好办了,我只需要保护位的数字跨过保护位与有效位的界即可啦。这也是绿色颜中的数字所述的意思啦!

去查一下SXM吧!

哪里有呢?应该是讲CPU中的有吧!于是查:

spru131g TMS320C54x DSP Reference Set Volume 1 CPU and Peripherals 真心没查到详细介绍。

再查:

spru172c TMS320C54x DSP Reference Set Volume 2 Mnemonic Instruction Set 和

spru179c TMS320C54x DSP Reference Set Volume 3 Algebraic Instruction Set 也是真心没有详细介绍!

折狂,难道还有其它资料?仔细一看《DSP应用系统设计实践-C54x》中的参考资料,也没有啊其它会有这个介绍的资料了。

于是静下心再查“Set Volume 1 CPU and Peripherals”果然是第一次查的方法不对引起的,查到了专门介绍这个的,在第93页。

其实还是没说清楚。但是单从这个SXM的功能来说,我的确是知道的,但是结合具体的STH我就不太清楚了。哦,我猜大概是这个意思啦。详见一号书签

好,我们再回归我要解决的这条指令执行后为什么是那么多的问题。

但是在看这条指令的介绍时,我又发现了新的问题?即ASM与SHFT有何关系?我需要查下ASM。ASM不是指汇编文件的后缀吗?在这种情况下是何意思呢?

查到了,意思如下:

ASM 5-bit accumulator shift mode field in ST1 (–16 ASM 15)

可见,它是被存储在ST1寄存器中的偏移量。好了,现在我们回到昨晚问题的记录处吧!详见:二号书签

这幅图中,我还有疑问?Smem和Xmem是怎么回事?这里说的也不清楚啊~operand 是运算域的意思。从字面意思来讲,Smem是在单数据域的操作。而Xmem是双数据域的操作?这两个有何区别呢?

查了三个官方文档都没查到,都是直接用而已,具体在哪里出现的,看来我只有百度了。 百度上查了,一个结果都没有,但是谷歌一下,却很多结果,我在一个PPT上找到了我要的结果。

与Ti的DSP芯片相关的资料\\网上所下资料\\第3章 TMS320C54x的数据寻址方式.PPT 这个PPT的第3页有详细介绍,如下:

由此,我总结如下,Ti的DSP芯片的汇编指令从操作数上可分为单操作数指令和双操作数指令。Smem就是针对单操作数指令的。而Xmem和Ymem则是针对双操作指令,其中Xmemj 是在双操作数指令及某些单操作数指令中所用的16位双数据存储器操作数,从DB总线上读出,而Ymem则是在双操作数指令中所用的16位双数据存储器操作数,从CB总线上读出;在读同时并行写的指令中表示写操作数

继续看书,关于54系列DSP的介绍。

31页 说到桶形移位器中有一句话:

桶形移位器的输出连接到某一ALU的输入或EB数据总线上。为什么是EB数据总线上?

27页说C5000有三套数据总线,即CB,DB和EB,前两个知道是什么东东,EB数据总线是什么东东?

查官方资料,找到了:

54x系列资料\\spru131g TMS320C54x DSP Reference Set Volume 1 CPU and Peripherals.pdf

44页:

看到了没有,一个是读,一个是写,哈哈!

31页 再来看乘/加单元吧

注意,乘法器的两个输入法的数据来源是有点差别的,X源操作数不能用程序存储器,而Y源操作数是可以的。

31页 再来看CSSU 比较/选择/存储单元吧

CSSU是专用于实现Viterbi蝶形运算的硬件单元,先记住这个就可以了。

31页 再来看指数编码器

由作者的介绍我可以作出这样的推测:指数编码器这个硬件单元还并不是就完成实了指数化的过程,只是其中的一步而已,这一步具体的操作就是图中的绿线部分。

32页 接下来是寄存器的映射,当然,我认为最好的处理方式是到网上去下一张表,方便以后搜索即可。当然也要知道官方文档这部分在哪里。

官方文档的这部分在:

54x系列资料\\Datasheet TMS320vc5402.pdf的27页 0 1 2-5 6 7 8 9 A B C D E F

IMR IFR - ST0 ST1 AL AH AG BL BH BG T TRN 中断屏蔽寄存器 中断标志寄存器 测试保留 状态寄存器0 状态寄存器1 累加器A低字(15-0比特) 累加器A高字(31-16比特) 累加器A保护位(39-32比特) 累加器B低字(15-0比特) 累加器B高字(31-16比特) 累加器B保护位(39-32比特) 乘法寄存器 传送寄存器

10-17 18 19 1A 1B 1C 1D 1E 1E-1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D-2F 30 31 32 33 34 35 36-37 38 39 3A 3B 3C 3D 3E 3F 40 AR0-AR7 SP BK BRC RSA REA PMST XPC - BDRR0 BDXR0 BSPC0 BSPCE0 TIM PRD TCR - SWWSR BSCR - XSWR HPIC - TRCN TDXR TSPC TCSR TRTA TRAD - AXR0 BKX0 ARR0 BKR0 AXR1 BKX1 ARR1 BKR1 BDRR1 辅助寄存器ARn n=0~7 堆栈指针 循环缓存区大小寄存器 块重复计数器 块重复开始地址 块重复结束地址 状态寄存器 PC扩展寄存器 保留 带缓存串口0数据接收寄存器 带缓存串口0数据发送寄存器 带缓存串口0控制寄存器 带缓存串口0控制扩展寄存器 定时器计数器 定时器周期寄存器 定时器控制寄存器 保留 等待状态产生寄存器 Bank-switching控制寄存器 保留 扩展等待状态寄存器 主机接口控制寄存器 保留 TDM串口数据接收寄存器 TDM串口数据发送寄存器 TDM串口控制寄存器 TDM串口通道选择寄存器 TDM串口接收发送寄存器 TDM串口接收地址寄存器 保留 ABU0发送地址寄存器 ABU0发送缓冲大小寄存器 ABU0接收地址寄存器 ABU0接收缓冲大小寄存器 ABU1发送地址寄存器 ABU1发送缓冲大小寄存器 ABU1接收地址寄存器 ABU1接收缓冲大小寄存器 带缓存串口1数据接收寄存器

41 42 43 44-57 58 59-5F BDXR1 BSPC1 BSPCE1 - CLKMD - 带缓存串口1数据发送寄存器 带缓存串口1控制寄存器 带缓存串口1控制扩展寄存器 保留 时钟方式寄存器 保留 33页 接下来,终于到重点了,也是我为什么写这个文档的原因,那就是对状态寄存器ST0和ST1的研究。

首先我要讲算出它们各自的复位值。 >> dec2bin( hex2dec('1800'))

ans =

0001 1000 0000 0000 这是ST0的复位值

>> dec2bin( hex2dec('2900'))

ans =

10100100000000 这是ST1的复位值

好,我们来具体看每一位进行了怎样的设置。

00 0 1 1 00 0 0000 0000 这是ST0的复位值

ST0的0到8位:DP Data-memory page pointer.

ST0 中0到8位的默认值都是0,说明基地址是0 同时这个说明也告诉我们,数据存储器的地址生成是9位+7位的生成方式。

注意,是否用DP作为基指针,还与一位有关,即ST1的第14位:

再看第9位和第10位:OVA OVB

复位值显然是两个0,也是符号正常情况的、 要注意,溢出标志位和进位标志位是不一样的。

再看第11位 进位标志位 C 这一位书上讲得严重不清楚。所以我还是决定到官方资料上去查看一下到底怎么回事。

复位置是1 ,这个1值应该对初始化没有什么影响的 官方是这样说的:

spru131g TMS320C54x DSP Reference Set Volume 1 CPU and Peripherals

Carry is set to 1 if the result of an addition generates a carry; it is cleared to 0 if the result of a subtraction generates a borrow. Otherwise, it is reset after an addition and it is set after a subtraction, except for an ADD or SUB with a 16-bit shift. In these cases, the ADD can only set and the SUB only reset the carry bit, but they cannot affect it otherwise. Carry and borrow are defined at the 32nd bit position and are operated at the ALU level only. The shift and rotate instructions (ROR, ROL, SFTA, and SFTL), and the MIN, MAX, ABS, and NEG instructions also affect this bit.

我把其中的重点抽出来,这个C和我们以前接触到的C是有差别的。具体来说是如下的情况:

一、加法的情况下

1.加法如果产生了进位,其值为1 2.如果加法没有产生进位,其值为0

可见,每做一次都要进行一次更新,不需要你手动清楚

二、减法的情况下

1.减法如果产生了借位,其值为0 2. 如果减法没有产生借位,其值为1

可见 ,和以前接触到的C位的不同在于,以以前接触到的C位不管是进位和加位都被置为1,而这里不同,这里是根据加法还是减法来确定的

在移位的情况下,不管怎样,若是加法,是必将其值置为1;若是减法,必然其值置为0,其实这是显然的,移位必然伴随着进位或借位嘛

再来看第12位 TC Test/control flag 位 复位值为1 就是根据其状态来控制程序的走向的

Test/control flag. TC stores the results of the arithmetic logic unit (ALU) test bit op- erations. TC is affected by the BIT, BITF, BITT, CMPM, CMPR, CMPS, and SFTC instructions. The status (set or cleared) of TC determines if the conditional branch, call, execute, and return instructions execute. TC = 1 if the following conditions are true: A bit tested by BIT or BITT is a 1.

A compare condition tested by CMPM, CMPR, or CMPS exists between a data- memory value and an immediate operand, AR0 and another auxiliary register, or an accumulator high word and an accumulator low word.

Bit 31 and bit 30 of an accumulator tested by SFTC have different values from each other.

再来看13位到15位 ARP Auxiliary register pointer复位值为000

Auxiliary register pointer. This 3-bit field selects the auxiliary register to use in the com- patibility mode of indirect single-operand addressing (see section 5.5, Indirect Ad- dressing, page 5-10). ARP must always be set to zero when the DSP is in standard mode (CMPT = 0).

具体是这样的,DSP芯片有两种工作模式,一种是兼容模式;另一种是正常模式。模式的不同导致可以使用的辅助寄存器有所不同。在正常模式下只能使用000号辅助寄存器。在兼容模式下则能使用0号到7号辅助寄存器。

再去查下 辅助寄存器auxiliary register 有关的知识吧~

3.3.4.6 Auxiliary Registers (AR0–AR7)

The eight 16-bit auxiliary registers (AR0–AR7) can be accessed by the CPU and modified by the auxiliary register arithmetic units (ARAUs). The primary function of the auxiliary registers is to generate 16-bit addresses for data space. However, these registers can also act as general-purpose registers or counters. For information about the role the auxiliary registers play in data- memory addressing, see section 5.5, Indirect Addressing, on page 5-10.

终于把T0寄存器看完了,再来看T1寄存器吧!

首先是0到4位 ASM(Accumulator shift mode.)位 复位值为0000

在上边的问题中我已经见识过它的用处了,这里就不多说了,需要详细了解时去查帮助文档即可。

其次是第5位,CMPT值(Compatibility mode.)复位值为0这个在上边ST0的ARP中已经见识过了~

其次是第6位 FRCT复位值为0 一般初始化时都要把这一位置为1,原因见下面的详述

ractional mode. When FRCT is 1, the multiplier output is left-shifted by one bit to compensate for an extra sign bit

我想不同的是为什么乘法器的结果左移一位才是补足符号位?为什么不是右移一位? 仔细一想,哦,我知道了,乘法的结果最高两位实际上都是符号位产生的结果,比如二进制的101*101 (乘数和被乘数的最高位都为1,说明是负数与负数相乘)结果为11001,而真正的结果应该为01吧!左移一位,结果为1001,怎么成-1了呢?这里面的悬机是怎样的?我觉得我该上网查一查这个问题。

查到了,在谷歌上查到的:

与Ti的DSP芯片相关的资料\\定点数,浮点数专题\\DSP_FIXED_POINT(重点讲解FRCT的作用).pdf

TMS320C5509A 是 16 位定点数处理器,其累加器是 32 位/40 位的。在定点处理器中处

理浮点数需要对定点数进行定标。下面所说的定点数都是指有符号数。

通常采用的定标有 Q15 和 Q31,分别表示小数点后有二进制 15 位和二进制 16 位。因

此 16 位 Q15 最大能表示的数是1-2^-15,32 位 Q31 最大能表示的数是1-2^(-31)。定标不同的数可以直接相乘, 例如 Q13*Q15=Q28。 两个定标不同的数不能直接相加, 比如 Q13+Q15,通常要将 Q15 右移两位,转换为 Q13后再相加,当然这样损失了两位的精度。

好,下面就是真正的原因了:

虽然DSP的乘法器有17位,但是它的乘操作的乘数和被乘数都是Q15 的数,这样结果为 Q30,存储在累加器中。为了将累加器的结果转换为更为常用的 Q31 定标,55x 系列 DSP 在状态寄存器 ST1_55 中设置了 FRCT控制位,FRCT=1 时,乘积自动左移一位,这样乘积变成了 Q31。对于累加器中 Q31 定标的数,直接取累加器中高 16 位,就能获得结果的 Q15 定标数。。

再来看第7位 C16 复位值为0

这一位的作用由下面这段话来解释:

再来看第8位SXM Sign-extension mode 复位值为1 这个前面遇到过了,不用说

再来看第9位 OVM Overflow mode 复位值为0

第10位 保留位Always read as 0 不是没有用啊,假如我需要0值的时候不是可以从这里取吗?

第11位 INTM 复位值为0 Interrupt mode 这个跟中断有关,应该是有点复杂吧!那咱们还是洗了澡之后再来看吧!洗完澡再来看,其实一点也不复杂。如下图所示:

第12位 HM 复位值为0 Hold mode.

这个意思我倒能看懂,但是具体怎么用,这还是个问题

第13位XF 复位值显然为1

XF status. XF indicates the status of the external flag (XF) pin, which is a general- purpose output pin. The SSBX instruction can set XF and the RSBX instruction can reset XF.

这一位显然经常作为硬件的测试吧!

第14位 CPL 复位值为0

终于到最后一位了,即第15位 复位值为0

块循环 是否激活由它表示。为什么要有这位?

那是因为有指令RPTB,查下RPTB指令是干什么的。

块循环的根本目的还是在于通过增加一点硬件开销来优化程序中循环体。这个上DSP体系结构课时是讲过的。

不容易啊 ST0和ST1的内容终于看完了,接下来,继续看。 接下来,还有一些重要的寄存器是需要我们了解的!

暂存器(T)

转换寄存器(TRN)

辅助寄存器(AR0~AR7)我在上边已经提到过了:

DSP模式状态寄存器,PMST 这个寄存器比较重要,得好好了解下 Processor Mode Status Register (PMST)

关键词:IPTR MP/MC OVLY AVIS IPTR Interrupt vector pointer.

MP/MC Microprocessor/microcomputer mode. 来源于引脚 OVLY RAM overlay

AVIS Address visibility mode. AVIS enables/disables the internal program address to be visible at the address pins

我的疑问:

第5位OVLY同时映射到程序和数据空间是什么意思?这个地址是怎么分配呢?这个有必要查一下。

微博:OVLY=1具体是怎样映射的?

这个问题暂时没有查到答案,先放在这里吧! 网络上找不到答案,只好在21IC上提问了: 提问:

关于54x系列PMST寄存器中OVLY位的疑问! 4

OVLY = 0 The on-chip RAM is addressable in data space but not inprogram space.

OVLY = 1 The on-chip RAM is mapped into program space and data space.Data page 0 (addresses 0h to 7Fh), however, is not mapped intoprogram space.

当OVLY = 0好理解,此时就是不能使片内RAM映射到程序区而已。

OVLY = 1时单从官方的解释,就出现意义上的模糊了。上面的语句只提到此时片内RAM可以映射到程序空间也可以映射到数据空间,并没有说是怎样映射的。这就有很多疑问了:在此种情况下到底是程序区和数据区共占一段RAM空间还是分别占据一段RAM空间?不管是共占一段RAM空间还分别占据一段RAM空间,程序空间的地址?(写到这里我瞟了一眼54x的存储器映射图,一下就有答案了)

再结合这句话就理解了撒:

很明显,在没有外部RAM的情况下,必须要使LAY=1,而且你在书写cmd文件时,因为程序空间和数据空间共用一段RAM,所以程序空间和数据空间在地址上不能重叠啊。

第4位用来调试时挺好的,如下图所示:

看,还可以用来判断是哪个中断,根据中断矢量的地址判断嘛,这个真心不错。

关键词:DROM CLKOFF SMUL

注意:打*号有特殊意义的:

所以我用的5402很有可能都没有这一位所对应的功能。

第3位 DROM显然是和5位OVLY一样的道理

第2位CLK OFF没什么好说的,这种还是用来节省晶振吧!注意,带* 所以5402若不是A版是没有的。

第1位人家说的很清楚,我没必要再说了。

等等,复位值的N/A是什么意思?我还要去查下官方的解释。

ETSI GSM 是什么意思?这是哪个标准组织,查一查吧!等等,鉴于现在的网速,而且这也不是一个很严重的问题,就不去查了,留在这里吧!

查完整篇文档,都没有关于N/A的说明,只有上搜索引擎了 微博:查复位值N/A的意思

鉴于现在网速,要查出来是很困难的,就明天再查吧!

第0位 注意这一位要配合SXM使用哈

下一项内容:

二、54x系列存储器组织

本来以为这一块内容只需要大概浏览下即可以了,没想到一看发现一大堆的问题。而且你还必须要把这些问题解决,试问,一个连存储器映射都搞不清楚的人,谈何使用芯片呢!

首先遇到的问题就是芯片命名的规则,即那些讨厌的前缀,后缀的意思。我之所以遇到这个问题在于我想看下书上28页的表2-1 ,我想知道5402的存储区间有多大,然后看与自己计算出的存储空间大小相不相符。但是当我看到型号的完整名称是,我不知道那些前缀是什么意思,如我要看的5402,全称是:U/VC5402 我查我前边下载的一个文档,发现完全是一片混乱。所以我必须要另外找一份资料。哪里找,估计自己向Ti官方提问了,明天提问吧!

咨询:Ti哪个官方文档有对芯片命名规则的说明呢?

选芯片型号时,搞不清楚那些前缀,后缀是什么意思,官方有没有对这一块有专门介绍的文档呢?

接下来的问题:

TMS320VC5402有20根地址线,按理可以寻址1M的空间吧!那这1M的空间是怎样分配呢?《DSP程序开发:MATLAB调试及直接目标代码生成(带书签)》说得相当简略,所以还是要去看官方文档。

好了,从文档:

spru131g TMS320C54x DSP Reference Set Volume 1 CPU and Peripherals.pdf 60页开始看吧~

spru131g 60页 一个DSP芯片,它的存储器,从物理类型上来分,有以下几种: RAM, ROM,EPROM, EEPROM, 这里我要区分一下:

ROM 只读,这里边的内容是厂家生产芯片时就已经固化好的内容。比如54x系列它里边的内容为:

最后一句话怎样解释?即复位后PC的值是FF80呗!记住,DSP复位后,首先执行FF80H的指令,而FF80~FFFFH是中断矢量表。具体是这样的:在MP/MC管脚置低,这样上电复位后,程序自动从内部的FF80H(中断矢量表的起始地址)地址开始运行。在FF80H处,有一条跳转到BOOT程序的指令,开始运行内部的BOOT程序。BOOT程序的作用就是把

外部FLASH存储器的程序搬移到RAM中去。

RAM:这里面存储的才是程序运行时的所需要的程序代码和数据空间。

因为RAM里的程序和数据掉电后不能被保存,所以需要把程序存储在一定要的外部空间中,上电之后首先由引导程序把这些程序加载到RAM中,系统才能正常运行。ERPOM和EEPROM就是为些而产生的。ERPOM的擦除要靠紫外线,而EEPROM直接用电就可擦除,所以现在已很少用EPROM,用的多的是EEPROM,即FLASH.

回顾了上面的知识后,我们再来看具体的54x是怎样的。

学习资料\\书籍类资料\\DSP程序开发:MATLAB调试及直接目标代码生成(带书签).pdf 45页

spru131g TMS320C54x DSP Reference Set Volume 1 CPU and Peripherals.pdf Depending on the DSP version, several on-chip memory types are available on the C54x devices: dual-access RAM (DARAM), single-access RAM

(SARAM), two-way shared RAM, and ROM. The RAMs are always mapped into data space, but may also be mapped into program space. The ROM may be activated and mapped into program space; it can also be mapped, in part, into data space.

从些段话我们可以看出54x中是没有EEPROM的,所以用它的话必须自己外配啊。

\\54x系列资料\\spru131g TMS320C54x DSP Reference Set Volume 1 CPU and Peripherals.pdf 67页和68页有详细的存储器映射图哦,而且我现在终于把它看懂了。

因为图太大了,我不好截过来,以后复习到这里的时候再调出来看就可以了。 我要说的是对于5402来说有16K的RAM

所以其内部可用的最多也就16K的RAM

程序区可以从Page0 到Page F Page0的地址范围为:00000~0FFFF Page1的地址范围为:10000~1FFFF Page2的地址范围为:20000~2FFFF ??

当OVLY=1时,16K的RAM(0060到3FFF 其实还不够16K,还差一点)被映射到所有程序页去当程序空间和数据空间。很明显,这段RAM是被所有在的程序页公用的。

很明显,在没有外部RAM的情况下,必须要使LAY=1,而且你在书写cmd文件时,因为程序空间和数据空间共用一段RAM,所以程序空间和数据空间在地址上不能重叠啊。

所以,我们可用的程序空间的地址显然为1M 而数据空间由于没有分页,所以只有0000~FFFF64K的空间。

三、54x系列中断

spru131g TMS320C54x DSP Reference Set Volume 1 CPU and Peripherals.pdf 182页有中断矢量表

注意,软件中断不分优先级 NMI: Nonmaskable interrupt.

这个中断我猜测是这样的,当发生这个中断的时候不管你现在在干什么,是不是在响应中断,都使程序从这个矢量的位置开始运行。这个的作用其实就很大了撒。特别是处理一些异常情况是,亦是如此。

IMR IFR

显然 IMR寄存器是很好理解的,但是IFR就很不好理解了,官方资料上是这样说的:

感觉有点矛盾啊!1既然是表明这个中断是挂起的(等候判定或决定),那为什么写1又是清除标志?网上查了下,也没查到说得相对清楚的资料,我总结了下,应该是如下的理解:

1的确表明这个中断挂起了

通常CPU响应这个中断之后就应该把这个挂起的标志清除

怎样清除,方法之一就是向挂起的这一位写1,注意不是写0,写1之后这一们便成了零

不是写0,而是写1,有什么好处?好处便是:

即只需要把IFR的备份重新导入到IFR中即可,相当于做异或运用,做完之后所有位都为零了。

这样的问题是为什么BRC要比ST1先恢复?

官方文档上也是这个意思,注意restore不是存储的意思,而是重建的意思。 BRAF:

BRC: Block-repeat counter register

这幅图中话读懂了就完全知道为什么了。