dsp考试阅读程序 2.docx
- 文档编号:3282727
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:20
- 大小:169.50KB
dsp考试阅读程序 2.docx
《dsp考试阅读程序 2.docx》由会员分享,可在线阅读,更多相关《dsp考试阅读程序 2.docx(20页珍藏版)》请在冰豆网上搜索。
dsp考试阅读程序2
DSP复习
一.简答
1.DSP的结构特征
DSP芯片的主要结构特征有:
采用了哈佛结构、流水线技术、硬件乘法器和特殊DSP指令等。
2.总线结构
C2XX的内部将程序、数据读和写总线分开,构成6组16位总线。
PAB:
程序空间地址总线
PRDB:
程序代码数据读取总线
DRAB:
数据空间地址读总线
DWAB:
数据空间地址写总线
DRDB:
数据空间数据读取总线
DWEB:
数据空间数据写入总线
3.CPU结构
C2XX的CPU主要包括以下一些功能模块:
一个32位的中央算术逻辑单元(CALU);
一个32位的累加器(ACC);
CALU的输入和输出数据定标器;
一个16X16位的乘法器;
一个乘法定标移位器;
另外,CPU还包括一个辅助寄存器运算单元
4.存储空间的分配
⏹程序空间
⏹数据空间
⏹I/O空间
5.等待状态产生方式
⏹READY
⏹等待状态发生器
6.中断结构
⏹中断结构:
内核中断和外设中断
⏹内核中断:
不可屏蔽中断NMI和6个可屏蔽中断
⏹中断层次:
两级中断(扩展中断个数)
⏹中断请求/应答硬件逻辑也是一个两级的结构
7.中断响应条件
书上33面,中断请求的结构
8.中断响应流程
书上36面
9.WD定时器的功能
WD计数器在系统复位后自动启动;保证系统故障或看门狗自身故障时产生可靠的系统复位。
10.WD定时器的复位
⏹WDCNT溢出
⏹写入WDKEY寄存器的值或序列不正确
⏹写入的检验位不正确(非101B)
11.寻址方式
⏹立即寻址方式
⏹直接寻址方式
⏹间接寻址方式
12.什么是直接寻址方式、
⏹该方式下,数据存储器以128个字被分为若干块,每个块称作数据页,64K数据存储器包含512个数据页。
⏹当前的数据页由状态寄存器ST0的9位页指针DP决定,CPU访问的特定单元地址由数据页和指令包含的7位偏移量产生。
13.头文件功能
用于定义外设控制寄存器的映射地址、用户定义的端口寄存器地址和相关常量的头文件
14命令文件功能
该文件实现对程序存储空间和数据存储空间的分配。
15.存储空间分配
MEMORY
{
PAGE0:
/*程序空间*/
VECS:
ORIGIN=00000H,LENGTH=00040H/*中断向量存贮空间*/
PVECS:
ORIGIN=00044H,LENGTH=00100H/*外设中断向量*/
PM:
ORIGIN=00150H,LENGTH=07EAFH/*片内flash存储空间*/
PAGE1:
/*数据空间*/
REGS:
ORIGIN=0H,LENGTH=60H/*存储器映射的寄存器和保留地址*/
BLK_B2:
ORIGIN=60H,LENGTH=20H/*块B2*/
BLK_B0:
ORIGIN=200H,LENGTH=100H/*块B0,如果CNF=0,则分配为片内ARAM*/
BLK_B1:
ORIGIN=300H,LENGTH=100H/*块B1*/
}
16.宏定义作用
类似于一个子程序,在编译时嵌入在引用的汇编行中。
17.中断服务程序的处理方式
书上35面软件结构
18.如何确定一个数的定标
考察数的范围和数的精度
然后按照表格定标
(1)
LDP#WD_KEY>>7//右移7位,高九位赋给DP
SPLK#05555H.WD_KEY//05555H低八位赋给WD_KEY
SPLK#0AAAAH.WD_KEY//0AAAAH低八位赋给WD_KEY
复位watchdog
(2)
LDP#0//加载数据页指针DP
LACCIFR//将IFR寄存器的值加载到累加器ACC中
SACLIFR//将累加器ACC的低16位赋给IFR
清除中断标志位
(3)
MAR*,AR7//当前辅助寄存器设置为AR7
SST#1,*-//ST1保存至当前AR即AR7中的值所指向的位置,并将AR7中的值减1
SST#0,*-//ST0保存至当前AR即AR7中的值所指向的位置,并将AR7中的值减1
SACH*-//累加器高16位保存至当前AR即AR7中的值所指向的位置,并将AR7中的值减1
SACL*-//累加器低16位保存至当前AR即AR7中的值所指向的位置,并将AR7中的值减1
中断现场保护
(4)
MAR*,ARO//当前辅助寄存器设置为AR0
LARAR1,#5//将数据5赋值给AR1
LARAR0,#200H//将数据200H赋值给AR0
LOOPADD*+,AR1//当前辅助寄存器即AR0中的值对应的存储单元的值与ACC相加,结果保存至ACC中,并且AR0中的值自增,当前辅助寄存器更改为AR1
BANZLOOP,*-,ARO//检查当前辅助寄存器即AR1中的值是否为0,若不为0则跳转LOOP,并且AR1中的值自减,将辅助寄存器更改为AR0
将200H201H202H203H204H205H中的值与累加器ACC累加
、
程序运行结果
(1)LDP#4//将4赋值给数据页指针DP
SPLK#100,0//将100存储在0000001000000000
SPLK#20,1//将20存储在0000001000000001中
LACC0//将地址0000001000000000中的值100加载到ACC中
RPT#15//重复16次下一条指令与,下一条指令合在一起构成16位正数除法,被除数位于累加器低字即为100,正除数位于0000001000000001中,即为20,最终商位于累加器低字,余数位于累加器高字,商为5,余数为0,即最终ACC的值为00000000000000000000000000000101
SUBC1
SACL0//将ACC低16位保存至0000001000000000地址中,即将5存入地址
SACH1//将ACC高16位保存至0000001000000001中,将0存入地址,
结果:
ACC00000000000000000000000000000101
0000001000000000地址5H
0000001000000001地址0H
(2)MAR*,AR7//设置当前寄存器为AR7
LARAR7,#301H//将301H储存到AR7
LACC#9//将9加载到ACC中
LDP#6//将6加载到数据页指针DP中
SPLK#4,1//将数据4写到00000011000000001地址中
SUB*-,AR0//ACC减当前辅助寄存器AR7中值301H对应的数据单元的值,即9-4=5,将5保存至ACC中,AR7的值自减,变为300H,辅助寄存器更改为AR0
结果ARP0
ACC5H
AR7301H
DP6H
301H4H
(3)SETCSXM//符号扩展方式位置1
LACC#0F000H,1//0F000H移位为1E000H,再扩展为FFFFE000H,存入ACC
LDP#4//将4加载到数据页指针DP中
SACL0//将ACC的低16位存入0000001000000000地址中
SACH1//将ACC高16位存入0000001000000001地址中
结果:
ACCFFFFE000H
0000001000000000地址E000H
0000001000000001地址FFFFH
(4)SECTOVM//设置溢出方式为置1
LDP#4//将4加载到数据页指针DP中
SPLK#0000H,0//将立即数0000H存入200H的地址中
SPLK#8000H,1//将立即数8000H存入201H的地址中
LACL0//将200H里的数(0000H)载入ACC的低16位
并且高位清0在载入过程中不进行符号位扩展
ADD1,16//将201H里的数(8000H)左移16位后与ACC相加
80000000H+00000000H--->ACC中
ACC为80000000HOV=0C=0
ABS//对ACC取绝对值,由于OVM=1,则产生溢出OV=1,ACC值为7FFFFFFFH
SACL0//把ACC低16位(FFFFH)存入200H地址中
SACH1//把ACC高16位(7FFFH)存入201H地址中
结果:
ACC7FFFFFFFH
200H地址FFFFH
201H地址7FFFH
计算定时器时间
LDP#GPTCONA>>7
SPLK#1000101001000000B,T1CON
SPLK#1250,T1PR
01:
连续计数
010:
四分频
00:
内部时钟
T=1250*2*4*25ns=250us
;Filenamevector.h
.sect“vectors”
RSVECTBSTART
INT1BGISR1
INT2BGISR2
INT3BGISR3
INT4BGISR4
INT5BGISR5
INT6BGISR6
RESERVEDBPHANTOM
三.编写程序
1.例题
(1)Clarke变换
Clarkespm0
ldp#i_a
splk#5017,k5017
splk#2896,k2896
lti_a
mpyk5017;(3/2)^(1/2)=5017Q12
pac
sachi_alfa,4
lacci_b,1
addi_a
sacli_beta
lti_beta
mpyk2896;2^(1/2)/2=2896Q12
pac
sachi_beta,4
ret
(2)Clarke逆变换
I_clarkespm0
ldp#i_alfa
splk#3344,k3344
splk#7094,k7094
splk#1672,k1672
lti_alfa
mpyk3344;(2/3)^(1/2)=3344Q12
pac
sachi_a,4
lti_beta
mpyk7094;3^(1/2)=7094Q12
pac
sachi_b,4
lacci_b
subi_alfa
sacli_b
lti_b
mpyk1672;1/6^(1/2)=1672Q12
pac
sachi_b,4
ret
(3)Park变换
Parkspm0
lacc#0
lti_beta
mpysintheta;Q15
ltai_alfa
mpycostheta;Q15
mpyasintheta
sachi_M,1
lacc#0
lti_beta
mpyscostheta
apac
sachi_T,1
ret
(4)逆Park变换
I_Parkspm0
lacc#0
lti_M
mpysintheta;Q15
ltai_T
mpycostheta;Q15
mpyasintheta
sachi_beta,1
lacc#0
lti_M
mpyscostheta
apac
sachi_alfa,1
ret
(5)例子:
在BOOT_EN/XF引脚上输出频率为2KHz的方波。
(CLKOUT=40MHz)
include“2407.h”
include“vector.h”
.bssAX,1
.text
STARTLDP#0
SETCINTM
SPLK#0,IMR
LACCIFR
SACLIFR
LDP#WDKEY>>7
SPLK#0004H,SCSR1
SPLK#006FH,WDCR
KICK_DOG
LDP#GPTCONA>>7
SPLK#0000000000000000B,GPTCONA
SPLK#0000000000000000B,T1CNT
SPLK#1000101001000000B,T1CON;up/downx/4
SPLK#1250,T1PR
SPLK#0000000010000000B,EVAIMRA;Periodinterrupt
SPLK#0000000010000000B,EVAIFRA
LDP#0
SPLK#0000000000000010B,IMR
CLRCINTM
WAITNOP
BWAIT
GISR2LDP#4
LACCAX
XOR#0001H
SACLAX
BITAX,15
BCNDGISR21,TC
CLRCXF
BGISR22
GISR21SETCXF
GISR22LDP#EVAIFRA>>7
LACC#0080H
SACLEVAIFRA
CLRCINTM
RET
GISR1RET
GISR3RET
GISR4RET
GISR5RET
GISR6RET
PHANTOMRET
.END
(6)例子:
在T1PWM/T1CMP/IOPB4引脚上输出频率为2KHz、占空比为60%的波形
include“2407.h”
.text
STARTLDP#0
SETCINTM
SPLK#0,IMR
LACCIFR
SACLIFR
LDP#WDKEY>>7
SPLK#0004H,SCSR1
SPLK#006FH,WDCR
KICK_DOG
LDP#0E1H
SPLK#0001000000000000B,MCRA
LDP#GPTCONA>>7
SPLK#0000000001000010B,GPTCONA;ActiveHigh
SPLK#0000000000000000B,T1CNT
SPLK#1000101001000010B,T1CON;up/downx/4
SPLK#2500,T1PR
SPLK#1000,T1CMPR
WAITNOP
BWAIT
.END
后面中断见上面的程序
2.作业
(1)统计数据存储单元200H与201H中“1”的个数,结果存放在存储单元202H中;
.text
LDP#4
MAR*,AR1
LARAR1,#31
LARAR2,#0
LACL0
ADD1,16
LOOP
SFL
BCNDNEXT,NC
ADRKAR2,#1
NEXT
BANZLOOP
SARAR2,2
.end
(2)将两个数4.5和0.4相乘,其结果采用Q12表示存放在数据存储单元200H中;
.text
SPM0
LDP#4
SPLK#18432,0
SPLK#1638,1
LT0
MPY1
PAC
SACH0,4
.end
(3)练习:
在定时器T1的下溢中断和周期中断中分别将引脚XF清零和置“1”,使引脚XF输出频率为1KHz的方波。
include“2407.h”
include“vector.h”
.text
STARTLDP#0
SETCINTM
SPLK#0,IMR
LACCIFR
SACLIFR
LDP#WDKEY>>7
SPLK#0004H,SCSR1
SPLK#006FH,WDCR
KICK_DOG
LDP#0E1H
SPLK#0000000000000000B,MCRA
SPLK#1111111100000000B,PBDATDIR
LDP#GPTCONA>>7
SPLK#0000000000000000B,GPTCONA
SPLK#0000000000000000B,T1CNT
SPLK#1000111101000010B,T1CON
SPLK#1111111111111111B,T1PR
SPLK#0000000011111111B,T1CMPR
SPLK#0000011110000000B,EVAIMRA
SPLK#0000011110000000B,EVAIFRA
LDP#0
SPLK#0000000000000010B,IMR
CLRCINTM
WAITNOP
BWAIT
GISR2LDP#PIVR>>7
LACLPIVR
XOR#002AH
BCNDSISR2A,EQ;T1OVERFLOW
LACLPIVR
XOR#0029H
BCNDSISR29,EQ;T1UNDERFLOW
LACLPIVR
XOR#0028H
BCNDSISR28,EQ;T1COMPARE
LACLPIVR
XOR#0027H
BCNDSISR27,EQ;T1PERIOD
RET
SISR2ALDP#0E1H
LACLPBDATDIR
XOR#01H
SACLPBDATDIR
LDP#GPTCONA>>7
LACC#0400H
SACLEVAIFRA
CLRCINTM
RET
SISR29LDP#0E1H
LACLPBDATDIR
XOR#02H
SACLPBDATDIR
LDP#GPTCONA>>7
LACC#0200H
SACLEVAIFRA
CLRCINTM
RET
SISR28LDP#0E1H
LACLPBDATDIR
XOR#04H
SACLPBDATDIR
LDP#GPTCONA>>7
LACC#0100H
SACLEVAIFRA
CLRCINTM
RET
SISR27LDP#0E1H
LACLPBDATDIR
XOR#08H
SACLPBDATDIR
LDP#GPTCONA>>7
LACC#0080H
SACLEVAIFRA
CLRCINTM
RET
GISR1RET
GISR3RET
GISR4RET
GISR5RET
GISR6RET
PHANTOMRET
.END
3.实验
实现功能代码分析:
第一、三灯和二、四交替点亮,每次持续时间为1s
#include"c2407A.h"
unsignedintuWork,nCount;
ioportunsignedport000c;
unsignedchardata[2]={0x05,0x0a};
unsignedcharmark=0;
voidInitial()
{
asm("setcINTM");//INTM=1,禁止中断
asm("setcSXM");//SXM=1,符号扩展位使能
asm("clrcOVM");//OVM=0,累加器中结果正常溢出
asm("clrcCNF");//CNF=0,双口RAM区B0被映射到数据存储空间
*IMR=0x0002;//INT2中断允许
*IFR=0xFFFF;//清除所有的INTFlag
*SCSR1=0x81EF;//CLIKN=10M,CLKOUT=40M
*WDCR=0xE8;//看门狗
}
voidtimer1init()
{
*EVAIMRA=*EVAIMRA|0x0080;//7位置1,其他位清零:
通用定时器1周期中断使能
*EVAIFRA=*EVAIFRA&0x0080;//7位为1时将其复位,为0时不管
*GPTCONA=0x0000;
*T1CON=0x160C;//连续增计数,64分频,使用北部时钟
*T1PR=0x0271;//计数周期为1Ms,40000000/64=625000,0x271=625
*T1CNT=0x00;//计数器清零
}
voidinlinedisable()//中断子程序
{
asm("setcINTM");
}
voidinlineenable()//使能中断子程序
{
asm("clrcINTM");
}
//假中断程序
voidinterruptnothing()
{
return;
}
voidinterrupttimer1a()
{
unsignedintflag;
flag=*PIVR;//interuptservesubprogramaddress
switch(flag)
{
case0x27:
{
(*EVAIFRA)=0x80;//7位为1时将其复位,为0时不管
nCount++;//interupttimes
if(nCount>=1000)
{
port000c=data[mark];
mark^=0x01;
nCount=0;
}
break;
}
}
return;
}
voidmain()
{
Initial();
timer1init();
nCount=0;
enable();
*T1CON=*T1CON|0x0040;//启动Timer1
while
(1){}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dsp考试阅读程序 dsp 考试 阅读 程序