DSP学习笔记.docx
- 文档编号:9101003
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:10
- 大小:26.51KB
DSP学习笔记.docx
《DSP学习笔记.docx》由会员分享,可在线阅读,更多相关《DSP学习笔记.docx(10页珍藏版)》请在冰豆网上搜索。
DSP学习笔记
DSP学习笔记
(1)中断结构及其实现
戎马书生发表于2006-7-1018:
06:
39
一.程序存储器的中断向量区
程序存储器的0000h-003Fh是dsp的中断向量区,只能用于存放中断向量,不能存放主程序代码。
中断向量包括内核中断int1-int6,软件中断int8-int16,软件中断int20-int31,TRAP,和NMI。
其中每两个单元存放一条中断向量,而两个单元没有办法处理中断程序,所以一般在此空间有跳转指令跳到中断服务子程序。
二Dsp特有的两级中断模式
内核中断指CPU接受到的中断信息
可见,对于每一个内核中断(int1-int6),都对应了很多外围中断,DSP是通过一个PIV(外围中断向量)寄存器来判断到底是哪一个外设发出的中断请求。
每一个特定的外围中断对应一个唯一的PIV值,当外设发出中断请求时,这个PIV值被DSP自动放入放入PIV寄存器,而程序员可通过软件编程来判断是何种中断并跳到中断子程序。
外围中断对应PIV值如下:
三.中断的汇编语言实现方法
.sect "vectors" ;定义主向量段
RSVECT B _c_int0 ;PM0 复位向量
INT1 B PHANTOM ;PM2 中断优先级1
INT2 B GISR2 ;PM4 中断优先级2
INT3 B PHANTOM ;PM6 中断优先级3
INT4 B PHANTOM ;PM8 中断优先级4
INT5 B PHANTOM ;PMA 中断优先级5
INT6 B PHANTOM ;PMC 中断优先级6
RESERVED B PHANTOM ;PME 模拟量输入中断(保留)
SW_INT8 B PHANTOM ;PM10 用户定义软件中断
…………………………
SW_INT31 B PHANTOM ;PM3E 用户定义软件中断
;中断子向量入口定义pvecs
.sect “.pvecs” ;定义子向量段
PVECTORS B PHANTOM ;保留0000h
B PHANTOM ;保留0001h
…
B PHANTOM ;保留0026h
B T1PINT_ISR ;T1PINT中断
B PHANTOM ;保留0028h
…
B PHANTOM ;保留0041h
;(主程序略)
;中断程序
GISR2:
;优先级INT2中断入口
;保护现场
LDP #0E0H
LACC PIVR,1 ;读piv左移
ADD #PVECTORS ;加piv
BACC ;跳到gisr
T1PINT_ISR:
;通用定时器1中断入口
LDP #DP_EVA
SPLK #0,T1CNT
GISR2_RET:
;中断返回
;恢复现场
CLRC INTM ;开总中断
;假中断程序
PHANTOM
KICK_DOG ;复位看门狗
RET
END
RET
四.中断的C语言实现方法
方法1:
通过软件识别标志实现可屏蔽中断
.sect ".vectors" ;定义主向量段
RSVECT B _c_int0 ;PM0 复位向量
INT1 B PHANTOM ;PM2中断优先级1
INT2 B PHANTOM ;PM4 中断优先级2
INT3 B PHANTOM ;PM6 中断优先级3
INT4 B _capint ;PM8 定义捕捉中断
INT5 B PHANTOM ;PMA 中断优先级5
INT6 B PHANTOM ;PMC 中断优先级6
RESERVED B PHANTOM ;PME 模拟量输入中断(保留)
SW_INT8 B PHANTOM ;PM10 用户定义软件中断
…………………………
SW_INT31 B PHANTOM ;PM3E 用户定义软件中断
;注意,汇编语言中有C语言的变量时,要在变量前加”_”
;捕捉中断服务程序
void interrupt capint()
{
int flag;
flag=*EVBIFRC&0X01; //判断是否是CAP4中断
if(flag!
=0x01)
{
asm("clrc INTM"); //返回前开中断
return; //如果不是CAP4中断,则直接返回
}
load(); //如果是CAP4中断,则装载捕捉值
*EVBIFRC=*EVBIFRC|0x01; //写"1"清除CAP4中断标志
asm("clrc INTM"); //返回前开中断
return; //中断返回
}
int load()
{
result[k]=*CAP4FIFO; //读取捕捉值,存于相应的数组
k++;
}
方法2:
通过外围中断向量寄存器piv实现
VoidinterruptGISR4()
{
switch(*PIVR)
{case0x0036:
f(x) //f(x)为中断处理程序
break;
default:
break;
}
*EVBIFRC=*EVBIFRC|0X01;
asm(“clrc INTM”)
Ruturn;
}
DSP学习笔记
(2)EV模块
学习心得
1不用管内部硬件结构,即不管事件管理器的功能是如何通过硬件实现的,会用即可
2有些工作过程是cpu自动完成的,编程时可不用管
3分别学习每一个部分功能(GP,比较,捕捉,QEP),最后再归纳一下各个部分的联系
4EVA,EVB功能完全相同,仅仅是对其定义的寄存器有A,B之分
一、GP(定时器模块)
功能:
1定时,定时时间到时产生中断
2通过TxPWM引脚输出PWM波(EVA:
x=1,2; EVB:
x=3,4)
相关寄存器(略)
定时器的计数操作模式(指TxCNT的增减方式)
1停止/保持模式,GP停止操作并保持当前状态
2连续增计数
3定向增减计数
4连续增减模式
定时器的比较操作
注:
比较操作可输出PWM波
1非对称波形的输出
2对称波形的输出
二、COMPARE(比较模块)
功能:
240xA的比较模块是从240发展来的。
240有单比较和全比较模式,而240x仅保留了全比较模式。
个人感觉称为PWM模块更合适,因为它的作用就是输出PWM波
单比较指输出不同宽度、周期的矩形脉冲
EVA的比较模块可以输出6路PWM波
EVB的比较模块可以输出6路PWM波
可加入死区,防止同一桥臂上两开关管短路
相关寄存器(略)
心得:
因为比较模块也是有GP提供时钟, 所以可以把它当成定时器的TxCNT来计数,TxPR提供周期,但是由比较模块的CMPRx代替TxCMPR做比较寄存器,且由ACTRA(对EVA)设置比较方式,比定时器的比较输出优点是可由DBCONA来进行死区控制,最后别忘了比较模块是由比较控制寄存器COMCONA来统一控制。
1非对称PWM波形
2对称PWM波形
三、CAPTURE(捕捉模块)
功能:
对外部引脚输入的脉冲进行捕捉检测(上升沿,下降沿或两个边沿),从而可以测量输入方波的周期,频率,占空比或非周期信号额脉冲宽度。
EVA可检测三路输入(CAP1,2,3)
EVB可检测三路输入(CAP4,5,6)
相关寄存器(略)
注意:
捕获单元是由GP提供时钟
FIFO中存放的是TxCNT的值,要在中断时及时读出以免下一个值覆盖
四、QEP(正交编码脉冲模块)
QEP:
指两个频率变化且正交(相位相差90度)的脉冲,由电机轴上的光电编码器产生。
功能:
通过检测两个脉冲序列中的哪一列先到可以判断出电机旋转方向,通过检测脉冲数和脉冲频率可以检测电机旋转的角位置和转速。
心得:
QEP并不是一个单独的电路模块,而是以上模块功能的集合。
工作:
由捕捉模块对两个脉冲进行检测,把CAPCONA的CAPQEPN设为11就把捕捉模块设成了QEP模式,其实就是指捕捉模块的时钟源来自两个引脚CAP1,2(对EVA)而不是GP。
DSP学习笔记(3)实验
对DSP有了基本了解之后,就应当通过做实验调程序加深对DSP的理解。
千万不要想着我把DSP书全部看明白之后再去做实验,因为只是看书是永远看不懂的。
我用的是瑞泰教学试验箱,感觉里面的试验设计的还可以,虽然很多程序都有瑕疵。
其它公司的试验箱我没用过,不过应该都差不多吧。
没试验箱的话买块最小系统板加一个仿真器也可以做试验。
下面第一个是瑞泰试验箱的试验指导书,第二个是各个试验的例程。
ICETEK-LF2407-A-EDU使用说明书v3.rar
ICETEK-LF2407-EDULab.rar
我再把调试过程中的问题和心得在这里转发一下,开头有“?
?
?
”的是对此有疑问但是还没有解决的问题,问题解决后我就把“?
?
?
”删掉了。
其中应该有很多不足之处,还请大家指正。
实验1:
rts2407.lib文件有什么内容和作用,是如何编写的,每个程序的库文件都不一样吗:
库文件,TI编写的,内有可以被直接调用的函数
.cmd文件中Page0和Page1里都有SARAM段,即段名可重复,Page1里的SARAM段是8000H开始的外部数据存储器。
看懂.map文件中各程序及变量在DSP中的存储方式,再结合反汇编窗口研究!
!
!
.map文件中 .text段包含的00001051 0000002e rts2407.lib:
boot.obj(.text) 什么作用?
0000107f 00000050 :
exit.obj(.text)
.cinit 0 000010cf 00000011
000010cf 0000000a VOLUME.obj(.cinit) ;VOLUME文件中什么量?
000010d9 00000006 rts2407.lib:
exit.obj(.cinit) ;rts2407.lib什么量?
000010df 00000001 --HOLE--[fill=0000] ;什么量?
.bss 1 00008000 000000f2 UNINITIALIZED
00008000 000000d0 VOLUME.obj(.bss)
000080d0 00000000 rts2407.lib:
boot.obj(.bss)
000080d0 00000022 :
exit.obj(.bss)
.stack 1 000080f2 00000400 UNINITIALIZED
000080f2 00000000 rts2407.lib:
boot.obj(.stack)
.sysmem 1 00008000 00000000 UNINITIALIZED
.reg240x 1 00007000 00000532 UNINITIALIZED
00007000 00000532 rts2407.lib:
boot.obj(.reg240x)
c程序作用是读取inp_buffer[BUF_SIZE]内容,乘以因子volume后放入out_buffer[BUF_SIZE]
read_signals函数原本用于读取A/D的数据并放到DSP缓冲区中,但由于此实验不涉及A/D,所以利用Probe断点模拟填入A/D数据
实验2:
将.asm中开始的.globle改成.def之后,发现效果一样
实验3:
.cmd文件中PAGE1定义了DATA :
origin=8000h,length= 8000h
.blk3 :
{}>DATA PAGE1 ;为外部扩展数据存储器,只有外扩RAM时可用。
实验4:
汇编语言,当某行有标号时,该行左起不能有空格,否则编译出错
编译选项的LINK中可以选择上电时程序的起始地址
.asm中加入.sect".vectors"
bstart 上电跳到start处
在.map中可以看到bstart占了两个单元
c编译器的实现形式为:
-10/3=-3,10/-3=-3,-10%3=-1,10%-3=1,但是一般不用C实现,因为开销太大
汇编语言有BGEZ指令、ZAC指令和LAC指令且通过了编译:
这些指令属于增强指令,见《24系列指令编程工具》P247
将变量加入到watchwindows时不能识别,显示identifiernotfound:
××××:
在编译选择的Assembly中选-as后即可
在Compiler属性页上单击,在开关栏处输入“–g”;按“确定”保存,是不是和在GenerateDebug中选fullsymboldebug一样
此选项作用:
使能符号调试
-as作用:
保存标识符和符号
实验5:
第一个实验没有创建*.PJT项目,我自己创建了一个,但是文档里已经有asm和cmd文件了,加上就可以了。
头文件自动把中断向量定义好了,0x40个。
其定义方式为.sect "vectors",
此时.map映射为.vectors 0 00000000 00000000 UNINITIALIZED
vectors 0 00000000 00000040
将vectors.h中.sect "vectors"改为.sect".vectors"后.map变为
.vectors 0 00000000 00000040
00000000 00000040 LFDIPS.obj(.vectors)
如果改为.sect ".vectors"呢?
头文件240x.h中定义了宏,如SBIT0 .macro DMA,MASK ;ClearbitMacro
LACC DMA
AND #(0FFFFh-MASK)
SACL DMA
.endm
其中SBIT1和SBIT0是带参数的宏,其它的是不带参数的宏。
其使用是不是和内联函数inline一样?
见《24系列指令编程工具》P274
?
实验中只用到了RAM的三个存储单元,但是在单步调试时其它相邻的单元内容也在变
在使用IN/OUT指令时DSP自动使IS变低从而访问I/O空间?
是的
MP/MC为1时DSP自动使PS变低从而访问外部存储器?
是的
如何使DSP访问外部RAM呢?
当地址大于8000H时,DS自动变低从而访问外部RAM
实验6.CMD文件开始为直接编写的编译命令。
这些命令都是可以在工程中配置的。
c语言头文件2407c.h与实验5中汇编语言头文件240x.h的差别,一个是unsignedint*SCSR1= (unsignedint*)0x7018,
一个是SCSR1 .set7018h
-stack200 ;栈定为200字 -heap;200堆定为200字 -lrts2xx.lib ;连接系统库文件rts2xx.lib
在工中没程有.lib库文件,但是在.cmd文件加入了rts2xx.lib,因此项目就加入了库文件,但是加的是什么地方的库文件:
是 \c2000\cgtools\lib 里面的文件。
实验箱控制模块上指示灯J5在什么地方:
指导书写错了,不是J5
实验7:
PRCT在PAGE0的0040H-0044H之间为密码段,全部填入1,有什么作用吗:
1等于不加密。
?
vector.h中最后的GISR1-6和最后的PHANTOM是干什么用的?
但是如果去掉后编译将出错
.C主程序asm("clrcINTM"); /*开中断*/后为什么不加一个无限循环指令:
应该加一个。
中断程序执行完后回到什么地方:
到库函数中的一个名为abort的函数执行
对程序做修改后加入无限循环while
(1){},程序执行良好
?
主程序开始的FOR循环需要执行很长时间,不知道是起什么作用的延时?
改为i<0x0001缩短执行时间,且不影响程序执行
voidinterruptgptime1(void)加interrupt关键字是声明中断函数,必须无输入参数及返回值,优点是保护所有的内核寄存器
后面加(void)是增强程序的健壮,显式声明函数无参数
实验8:
ADC的最小转换时间:
40MHZ时为375ns(S/H+转换),30MHZ时为500ns。
设置I/O端口指示灯时为什么用ioportunsignedcharport000c;用ioportunsignedintport000c;不行吗:
可以。
主程序开始注释上说/*关中断*/,但是并没有关中断的语CNT句asm("setcINTM");是否要加上:
不用,进入主程序后INTM为0
为什么要打开所有外设*SCSR1=0x81fe;只打开ADC和EVA不行吗如*SCSR1=0x8184;可以。
说明书中程序写错,应为pResult2=RESULT1;
?
ADCTRL1中的ACQPS3-0根据什么来设置采样时间?
调整它与调整采样周期有什么联系和区别吗?
ADC工作模式为连续转换模式(CONTRUN=1),即转换序列自动重新开始,此模式必须保证在下一个转换序列开始前读取寄存器值。
定时器1的周期中断并不使能ADC,只是设置标志位来保存RESULT值。
当周期中断发生时寄存器值还没读出时转换序列又重新开始了:
是的。
*GPTCONA=0x0100;(周期中断使能ADC):
此语句写错了,应该为*GPTCONA=0x0000;
定时器中断子程序voidinterruptgptime1(void)中的switch语句用不用加上defaultbreak;以增强程序鲁棒性(健壮性):
可以。
启动转换(socseq1=1),SEQ采用中断模式1(Mode=01,立即中断)能否在一条语句中(*ADCTRL2=0x2400;)使用:
可以。
指导书作业中为什么要用定时器中断启动ADC,读取RESULTn中数据后
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 学习 笔记