TMS320C2X/C5X 软件应用 (2)
L.系数表的动态寻址
在用乘/加指令实现F1R滤波器时,TMS320C2X/C5X从数据存储器取输入样值,而从程序空间取滤波器系数。由于同时从存储器中取两个操作数,使乘/加操作得以在一个周期内完成。在C25中,系数表的地址只能用直接寻址方式指定,这可满足大部分的应用。但是如果系数表的地址事先不能确定,而需在程序运行过程中确定时,C25实现就比较困难。对这种情况,C5X提供了一个称为块移动地址寄存器(BMAR)的专用寄存器,使乘/加操作可以用间接方式寻址,BMAR指向程序存储器中的系数表地址。例如
- LACL table_add
- SAMM BMAR ;更新系数表的地址
- LAC ONE, 14
- ZPR ;PREG=0
- RPT num_a-1 ;重复
- MADD * - ;乘/加
- APAC ;加最后一个乘积
- SACH result,1 ;保存结果
复制代码
3 软件应用
A.压缩与扩张程序。
与PCM Codec接口时,由于Codec输出和输入的数据均采用8位压缩格式,因此DSP处理前和处理后的数据均需进行变换。从Cedec来的压缩数据先要进行扩张变换为线性数据才能进行处理,同样,在送给Cedec前也需将线性数据变换为压缩数据。下面我们分别给出相应的应用程序。
(1)扩张程序
由于8位数据只有256个数值,因此扩张变换一般可以采用查表法实现,表的大小为256,根据给出的V律扩张的数据表。TMs320c25的查表程序如下。
- ULOT: LAC IN
- ANDK #OFFH
- ADLK _ulawtab
- TBLR OUT
- RET
复制代码
上述程序中,待扩张的数据在IN中,扩张后的数据在OUT中,,ulawtab为256点数据表的起始地址。
(2)压缩程序
线性到压缩数据的变换一般采用程序计算实现,下面是线性数据到(律压缩数据的TMSC25程序。
;初始化
- LDPK 0
- LALK 132
- SACL BIAS2
- LALK -7
- SACL NEG7
- LARP ARO
复制代码
;压缩子程序
- LTOU: ZALH IN
- SFL
- SFL
- BLZ NEGCMP
- ADDH BIAS2
- LAR AR0,NEG7
- RBTK 6
- NORM
- ANDK OF000H,14
- SACH Q
- SAR AR0,S
- ZALH S
- ABS
- ADD Q,2
- XORK 0FF00H,4
- B SATCH。
- NEGCMP: ABS
- ADDH BIAS2
- LAR AR0,NEG7
- RBTK 6
- NORM
- ANDK 0F000H,14
- SACH Q
- SAR AR0,S
- ZALH S
- ABS
- ADD Q,2
- XORK 07F00H,4
- SACH OUT,4
- RET
复制代码
上述程序中,待压缩的数据在IN中,压缩后的数据在OUT中。数据存储单元都定义在第 0页中。需要注意的是,应保证待压缩数据的数值范围在一7774”+7774之间。
B.内部定时器的应用
TMS320C2X内部具有一个定时器,可产生周期中断,可以用来设置诸如A/D的采佯频率,在外部标志引脚XF上产生周期脉冲等。TMS320C2X的定时器由一个16位的定时器寄存器和一个16位的周期寄存器组成。在每个CLKOUT1周期,定时器寄存器的值减1,当该寄存器的值为0时,产生一个定时器中断(TINT)。在下一个CLKOUT1周期,周期寄存器的内容(PRD)装入至定时器寄存器。因此,定时器中断的周期是PRD+l个CLKOUT1周期,即中断频率为 CLKOUTl/(PRD+1)。设晶体的时钟为40MHz,要产生一个10KHz的定时器中断,则周期寄存器的值为:
- f = CLKOUT1/(PRD+1)
- PRD = (CLKOUT1/f)-1 =(10MHz/10KHz)-1 = 999
复制代码
下面是一个在XF引脚上产生一个10KHz正脉冲的TMS320C2x程序。
- PRD .set 3
- IMR .set 4。
- .text
- LDPK 0
- LALK #999
- SACL PRD ;置定时器周期寄存器 = 999
- LACL #8
- 0R IMR
- SACL IMR ;开放定时器中断
- RXF ;XF 置低
- EINT :开中断
- LO0P: B LOOP
复制代码
;定时器中断服务程序
- TINT_ISR:
- SXF ;XF置高
- SXF ;XF置低
- EINT ;开中断
- RET ;中断返回。
复制代码
TMS320C5X的定时器在TMS320C2X的基础上增加了一些控制功能,通过设置定时器控制寄存器TCR可以启动、停止定时器,也可以设定定时器分频比。定时器的中断频苹为
- f = CLKOUT1/[(TDDR+1)(PRD+1)]
复制代码
式中,TDDR为分颇比,PRD为周期寄存器的值。
C.中断的保护和恢复
中断程序的状态保护和恢复只要根据中断程序中寄存器的使用情况进行保护和恢复即可。但是在保护两个状态寄存器ST0和STl时必须特别注意恢复时的先后顺序。TMS320C2X保护ST0和STl寄存器时使用专门的指令SST0和SST1,恢复时使用LST0和LST1,如果采用间接寻址进行保护,则保护和恢复的顺序无关紧要。但是如果采用直接寻址,则必须注意恢复时的先后顺序。下面是采用直接寻址方式时TMS320C2x中断保护和恢复的正确方法,程序中TST0、TST1等都是定义在数据空间第O页的存储单元。
- ISR_SUB:
- SST0 TST0 ;保存ST0至TST0单元(强制DP = 0)
- SST1 TST1 ;保存ST1至TST1单元(强制DP = 0)
- LDPK 0 ;DP = 0
- SACL TACCL ;保存ACC的高16位
- SACH TACCH ;保存ACC的低16位,“
- ZAIS TACCL ;恢复ACC的低16位
- ADDH TACCH :恢复ACC的高16位
- LST1 TST1 ; 恢复 ST1
- LST0 TST0 ;恢复ST0
- EINT :中断使能。
- RETI ; 中断返回
复制代码
如果将恢复的顺序颠倒过来,即首先执行LST0指令然后执行LST1指令,则数据页指针DP就不能正确地加以恢复。因为,数据页指针DP在状态寄存器ST0中,执行了LST0实际上就将当前数据页改为ST0中的DP值,再执行LSTl时,由于不像SST1那样强迫将DP置为0。因此数据页不对,恢复的ST1内容就不正确了。
D.TMS320C5X矢量表的重定位
TMS320C2x中断矢量表的地址固定在程序空间o地址开始的一段位置,固定中断矢量表地址在某些情况下会带来一定的麻烦。例如.当系统采用低速EPROM加高速RAM的存储器配置时,虽然程序可以在系统加电运行时从EPROM搬移至高速RAM运行,但由于中断矢量的地址是固定的,因此系统产生中断时,在中断矢量地址的跳转指令将不得不多运行几个指令周期。TMS320C5x作了改进,使中断矢量表的地址可以通过程序进行重定位,可以将矢量地址重新定位至程序空间中任何2K字页面的开始,如800H。重定位的方法是在PMST寄存器的IPTR域中设置对应的值,复位时,IPTR =0,中断矢量表的首地址为0H,若IPTR=1则首地址为800H。复位后执行下面的指令将矢量表地址重定位在800H:
复制代码
执行上述指令后,后面产生的中断将从新的矢量表中获取中断矢量,例如复位后定时器中断的矢量地址为BH,而新的矢量地址为808H。
E.TMS320C5X等待状态产生的软件实现
为了与低速的存储器或I/O设备接口, TMS320C2x需要采用硬件等待状态产生器实现,这使硬件设计复杂化。TMS320C5X支持硬件等待状态产生,也可采用软件控制等待状态的产生,从而使硬件设计简单化,节省了系统体积。软件可编程等待状态产生器是由两个16位等待状态寄存器PDWSR和IOWSR及一个5位控制寄存器CWSR控制的.
F.TMS320C2x至TMS320C5X的软件移植
TMS320C2x的指令集在源代码级是向上兼容的。因此,原则上说,TMS320C2X的程序经过TMS320C5X的汇编器重新汇编后就可以在TMS320C5x上运行。但是,由于TMS32l0C5x在串行口、定时器和全局控制等方面与TMS320C2x不同, 因此在TMS320C2x至TMS320C5X的软件移植时,还必须作-些迎要的修改,例如表2.2列出了有关串行口设置的一些指令的侈改。此外,还必须注意有些寄存器的地址也不相同。
- 表2.2 串行口指令的修改
- TMS320C25 TMS320C50
- RFSM APL #0FFF7H,SPC
- SFSM OPL #8,SPC
- RTXM APL #0FFDFH,SPC
- STXM OPL #020H,SPC
- FORT0 APL #0FFFBH,PC
- FORT1 OPL #4,SPC
复制代码
|