DSP学习笔记Word文档格式.docx
《DSP学习笔记Word文档格式.docx》由会员分享,可在线阅读,更多相关《DSP学习笔记Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
![DSP学习笔记Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/2/9774cfd7-85cf-4169-bc38-66cb40c935ed/9774cfd7-85cf-4169-bc38-66cb40c935ed1.gif)
中断优先级4
INT5
PMA
中断优先级5
INT6
PMC
中断优先级6
RESERVED
PME
模拟量输入中断(保留)
SW_INT8
PM10
用户定义软件中断
…………………………
SW_INT31
PM3E
用户定义软件中断
中断子向量入口定义pvecs
“.pvecs”
定义子向量段
PVECTORS
保留0000h
保留0001h
…
保留0026h
T1PINT_ISR
T1PINT中断
保留0028h
…
保留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
四.中断的C语言实现方法
方法1:
通过软件识别标志实现可屏蔽中断
.vectors"
PM2中断优先级1
PHANTOM
_capint
定义捕捉中断
SW_INT31
用户定义软件中断
注意,汇编语言中有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中断标志
//返回前开中断
//中断返回
}
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
0000000a
VOLUME.obj(.cinit)
;
VOLUME文件中什么量?
000010d9
00000006
exit.obj(.cinit)
rts2407.lib什么量?
000010df
00000001
--HOLE--[fill=0000]
什么量?
.bss
1
00008000
000000f2
UNINITIALIZED
000000d0
VOLUME.obj(.bss)
000080d0
00000000
boot.obj(.bss)
00000022
exit.obj(.bss)
.stack
000080f2
00000400
boot.obj(.stack)
.sysmem
.reg240x
00007000
00000532
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"
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
,
此时.map映射为.vectors
vectors
00000040
将vectors.h中.sect
改为.sect"
后.map变为
.vectors
LFDIPS.obj(.vectors)
如果改为.sect
呢?
头文件240x.h中定义了宏,如SBIT0
.macro
DMA,MASK
ClearbitMacro
LACC
DMA
AND
#(0FFFFh-MASK)
SACL
.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中数据后