首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

学DSP的请进来看看!!!

更多参考:
1.关于代码书写格式:SPRU102: TMS320C54x Assembly Language Tools User's Guide,3.5
Source Statement Format
2.关于链接配置文件:SPRU102: TMS320C54x Assembly Language Tools User's Guide,7.5
Linker Command Files,7.7 The MEMORY Directive,7.8 The SECTIONS Directive
练习:
1、试一下不按规定格式书写代码会产生什么样的编译错误。
2、试一下将链接配置文件中的MEMORY,SECTIONS改成小写会出现什么样的编译错误。
3.修改程序1.2中AR1,AR2的值,观察LED闪烁频率
实验二 基本运算
<本节选自为HK-DSP实验箱写的实验指导书,有待整理>
DSP指令数量最多的是:算术指令、逻辑指令和数据加载与传送指令。数据加载与传送指令由于处处要用,所以不单独列为实验。算术与逻辑指令也是数量繁多,无法一一举例,这里简单举一个加法和除法的例子,乘法和乘加指令在FIR用得比较多,稍后一并介绍。其它指令有兴趣可以对照指令表的说明,试验一下各指令运行的结果。
实验2.1 加减法计算
************************************************
*计算z=x+y-w。
.mmregs
.def CodeStart
Data_DP: ;数据段指针
x: .word 10 ;初始化变量
y: .word 26
w: .word 23
z: .word 0
.text
CodeStart:
LD #Data_DP,DP ;装载数据指针DP
STM #STACK+10H,SP
SUMB: LD x,A ;A=x
ADD y,A ;A=A+y
SUB w,A ;A=A-w
STL A,z ;z=A
END: B END
计算结果数据存储器地址存储内容十进制
x1010H000aH10
y1011H001aH26
w1012H0017H23
z1013H000dH13
技巧提示:试验算术指令由于不需要外部资源,可以不需要仿真器和实验箱。同学们可以平时自己用软件仿真,多多实验。但是复杂的算法最好还是在线仿真,因为程序是流水线执行,软件仿真有时与实际硬件执行结果有所不同
实验2.2 除法计算
DSP并没有除法指令,回想一下我们用在稿纸上演算除法列的竖式,实际是一种移位减法,DSP中也是通过做多次减法的办法来做除法。下面例子是把用除以10的办法二进制数转成BCD码例子
16进制转BCD码
*********************************
.mmregs
.global CodeStart
.data
x: .word 1234 ;待转换的数字
y: .word 10 ;除数
z: .word 0Fh,0Fh,0Fh,0Fh,0Fh;结果区,每位BCD存一个字,
;初始化为F因为实验板的数码管不显示F
.text
 
CodeStart:
LD #x,DP ;设置DP
LD x,A ;被除数
STM #z,AR1 ;结果区指针
loop:
RPT #15 ;执行完16次减法后,A的高16位是余数
SUBC y,A ;低16位是商
STH A,*AR1+ ;余数保存到Z
AND #0FFFFH,A ;掩盖掉高16位,保留商值
BC loop,ANEQ ;继续做除法直到商为0
end: B end
练习:
练习其他算术指令
其它参考:
spru172c:TMS320C54x DSP Reference Set Volume 2: Mnemonic Instruction
Set,2.1 Arithmetic Operations
这个资料对每个指令都有详细说明。也可以在Help中的TMS320C54x DSP Mnemonic Instruction
Set中查询或搜索相关指令
实验三 中断
中断的概念应该不陌生,指的是当某个事件发生时,暂停当前的操作,转向中断服务程序,执行完后再返回继续原来的操作。这使得DSP能够处理多个任务。
DSP有许多中断源,可以设置中断控制寄存器来确定响应哪些中断而不理会哪些中断。本实验介绍最常用的定时器中断和外部中断的使用方法,并介绍中断向量表和中断向量指针。
实验3.1 定时器中断:方波发生器
实验目的:学习定时器中断的设计方法
回顾一下实验一控制LED的闪烁实际就是一个简单的方波发生器。但不足的是延时的方法定时不精确,另外还有一个缺点是在执行延时的过程中DSP就无法执行其它指令,这时就可以用定时器来改进。
使用定时器首先要对它初始化,基本步骤如下:
1.关掉中断
2.停止定时器运行。
3.设定时器的定时长度
4.允许定时器中断
5.运行定时器
6.打开中断
现以简单的方波程序为例:
;==============================================
; fangbo1.asm
; 利用定时器Timer0在XF脚产生周期2ms的的方波
;==============================================
.title "fangbo1.asm"
.mmregs
.def codestart ;程序入口
.def TINT0_ISR ;Timer0中断服务程序
STACK .usect "STACK",10H ;分配堆栈空间
;设定定时器0控制寄存器的内容
K_TCR_SOFT .set 0B<<11 ;TCR第11位soft=0
K_TCR_FREE .set 0B<<10 ;TCR第10位free=0
 
K_TCR_PSC .set 0B<<6 ;TCR第9-6位,可设TDDR一样,也可不设自动加载
K_TCR_TRB .set 1B<<5 ;TCR第5位TRB=1此位置1,PSC会自动加载的
K_TCR_TSS .set 0B<<4 ;TCR第4位TSS=0
K_TCR_TDDR .set 1001B<<0 ;TCR第3-0位TDDR=1001B
K_TCR .set
K_TCR_SOFT|K_TCR_FREE|K_TCR_PSC|K_TCR_TRB|K_TCR_TSS|K_TCR_TDDR
K_TCR_STOP .set 1B<<4 ;TSS=1时计数器停止
.data
DATA_DP: ;数据区指针
XF_Flag: .word 1 ;当前XF的电平标志,如果XF_Flag=1,则XF=1
主程序:
;================================================
.text
CodeStart:
STM #STACK+10H,SP ;设堆栈指针SP
LD #DATA_DP,DP ;设数据地址DP
STM #XF_Flag,AR2 ;AR指向XF标志
;改变中断向量表位置
K_IPTR .set 0080h ;指向0080H,默认是FF80
LDM PMST,A
AND #7FH,A ;保留低7位,清掉高位
OR #K_IPTR,A ;
STLM A,PMST
*初始化定时器0
*f=50MHz,定时2ms时:
*根据定时器长度计算公式:Tt=T*(1+TDDR)*(1+PRD)
*给定TDDR=9,PRD=9999,CLKOUT主频f=40MHz,T=25ns
*Tt=20ns*(1+9)*(1+9999)=2000us=2ms
*f=100Mhz,定时最大是:10ns*2^4*2^16=10ms,
PERIOD .set 9999 ;定义计数周期
STM K_TCR_STOP,TCR ;停止计数器0
; STM #PERIOD,TIM ;可设成跟PRD一样,也可不设自动加载
STM #PERIOD,PRD ;设定计数周期
STM #K_TCR,TCR ;开始Timer0
stm #0008h,IMR ;允许Timer0中断
STM #0008h,IFR ;清除挂起的中断
rsbx intm ;开中断
end: nop
B end
Timer0中断服务程序:TIN0_ISR
;================================================
TINT0_ISR:
PSHM ST0 ;本中断程序影响TC,位于ST0中
;判断当前XF状态并作电平变化
BITF *AR2,#1 ;IF XF_Flag=1 then TC=1 else TC=0
BC ResetXF,TC ;IF TC=1 then XF=0 else XF=1
setXF:
SSBX XF ;置XF为高电平
ST #1,*AR2 ;相应修改标志
B Next
ResetXF:
RSBX XF ;;置XF为高电平
ST #0,*AR2 ;相应修改标志
Next:
POPM ST0
RETE
.end
返回列表