您当前的位置:五五电子网电子知识单片机-工控设备综合-其它TI C54xx DSP 十天速成讲义(3) 正文
TI C54xx DSP 十天速成讲义(3)

TI C54xx DSP 十天速成讲义(3)

点击数:7698 次   录入时间:03-04 11:44:18   整理:http://www.55dianzi.com   综合-其它
另外C5400系列中不同型号DSP的中断向量数量和在中断向量表中的位置有所不同,程序移植时需要查相应datasheet确认。

2.中断向量指针
中断向量表的位置并没有强制的位置,可以在内部存贮器,也可以在外部存贮器。但有一个要求:中断量表必须放在80H字长存贮块的起始处,即中断向量表的首地址的低7位必须全为0。DSP 
的寄存器PMST的高9位是中断向量表的指针IPTR。其上电时默认是在FF80H处,这是为了运行固化在内部ROM的上电加载程序(见实验八的程序加载部分)。由于FF80H是只读的,加载用户自定义的中断向量表时会报错。这样需要重新设置IPTR的值,本书一般把它重定义到0080H(也可以用自定义的地址),并在程序开头重新设置一下IPTR的值:
;改变中断向量表位置
K_IPTR .set 0080h ;指向0080H,默认是FF80
LDM PMST,A
AND #7FH,A ;保留低7位,清掉高位
OR #K_IPTR,A ;将新值传到高9位
STLM A,PMST ;修改PMST寄存器

技巧指示:由于这段代码几乎每个程序都需要,可以单独存成一个文件:IPTR0080H.asm,然后在程序需要的地方用.copy或.include指令:
.copy “IPTR0080H.asm”
或: .include “IPTR0080H.asm”
编译时就会自动把这段代码嵌到相应位置。稍微要注意的是由于这一小段代码要用到累加器A,所以最好保证执行这段代码之前不要使用累加器A。
其它还有一些经常重复的代码,如初始化SP、DP、IPTR的代码都可以写在一个文件里include/copy进来。
注1:.copy和.inlucde指令效果是一样的,只是在生成程序列表时,.copy会把代码复制过来,而.include不会。
注2:文件名可以用路径,如果不用,则编译器会按下面的循序搜索:当前目录、编译选项指定的目录、环境变量指定的目录。

更多参考:
1.关于中断:SPRU131 TMS320C54x DSP Reference Set, Volume 1: CPU and 
Peripherals,6.10 Interrupts
2.关于定时器:SPRU131 TMS320C54x DSP Reference Set, Volume 1: CPU and 
Peripherals,8.4 Timer



实验3.2 外部中断:频率计
DSP有4个外部中断INT0-INT3,下降沿触发,实验箱的频率计使用的是INT3。
频率计的设计原理是:在设定时间下计外部中断INT3的次数,除以定时器的定时周期(也就是乘以定时器中断的触发频率),就得到外部脉冲频率。实验箱上配有1.024k-262.144k共8档频率源,也可以外接频率源。用跳线冒选择频率源,并接到INT3上。下面的例程是定时器定时1s,在INT3中断服务子程序中计脉冲个数,到时则关闭中断。脉冲计数结果显示到数码管上,即为以单位为Hz的频率值

**********************************************
*频率计
**********************************************
.mmregs
.global CodeStart
.global TINT1_ISR
.global INT3_ISR

.include "../DefineIO.asm" 

.data
DATA_DP:
PulseCounter: .word 0 ;脉冲计数器
Display: .word 0FH,0FH,0FH,0FH,0FH,0FH;存放数据管显示值,值F在数码管上不显示
DotData: .word 000000B ;数码管的dot point
Number10: .word 10 ;十六进制转BCD所除的10

.text
CodeStart:
.copy "../SP_DP_IPTR.asm" ;初始化SP、DP和IPTR的代码段
STM #99,AR1 ;10ms计数后再100分频
STM #Display,AR3 ;定义数据管显示存贮区指针
LD #0,A ;A用来计脉冲数

SSBX INTM ;关中断
CALL Timer1Init ;初始化Timer1 
STM #110000000B,IMR ;允许Timer1和INT3中断
STM #0FFH,IFR ;清除挂起的中断
RSBX INTM ;开中断

wait: 
B wait;
***************************************
*外部中断子程序
***************************************
INT3_ISR:
ADD #1,A ;计中断次数
RETE
***************************************
*定时器中断子程序
***************************************
TINT1_ISR:
BANZ GoOnCount,*AR1- ;测量次数计数器减1,次数为0就中止计数数,
;结束计数
STM #0,IMR ;取消所有中断

HEX2BCD: ;把计数结果转成BCD码
RPT #15
SUBC Number10,A
STH A,*AR3+
AND #0FFFFH,A
BC HEX2BCD,ANEQ 
;在数码管上显示结果
STM #Display,AR3
PORTW *AR3+,Digital0
PORTW *AR3+,Digital1
PORTW *AR3+,Digital2
PORTW *AR3+,Digital3
PORTW *AR3+,Digital4
PORTW *AR3+,Digital5
PORTW DotData,DotPoint 
RETE

GoOnCount: ;继续计数
STM #1100001B,IFR ;清除挂起的中断
RETE
***************************************
*定时器初始化
***************************************
Timer1Init: 
;定时器1的寄存器地址
TIM1 .set 0030h ;减1计数器
PRD1 .set 0031h ;存放定时时间常数
TCR1 .set 0032h ;定时器状态及控制寄存器

;F=50MHz, T=20ns*(1+15)*(1+3124)=20ns*16*31250=10ms
STM #010,TCR1 ;TSS置位停止Timer
STM #31249,PRD1
STM #2FH,TCR1
RET
.end 

简单起见本例只能测一次,可以做一些改进,比如每隔1-2S自动重新测量,或者用按键来触发测量。

上一页  [1] [2] 


本文关键字:暂无联系方式综合-其它单片机-工控设备 - 综合-其它