四 、实验步骤
1、根据实验要求编写输出周期500ms方波的汇编语言源代码,和C语言源代码(c语言中加入外部中断,通过按键改变方波频率)。
2、编译无误后下载到C5402开发板中,运行程序,观察LED是否周期性亮灭。
3、下载c程序到开发板上,通过按下连接在外部中断上的按键,观察能否改变LED灯的亮灭频率。
五、程序源代码
1、主函数:
#include \int t0_count; void main()
{ CLKMD=0x00; //清零 while(CLKMD&01);
CLKMD=0x47ff; //开启PLL方式且采用5倍频
PMST=0x00a0; //将片内数据RAM映射到程序空间和数据空间并从0080地址开始 coeff=1;
t0_count=250*coeff;
asm(\ //关闭所有可屏蔽的中断 ST1=ST1|0x0800; //INTM=1
TCR=0x0010;//停止定时器,且当PSC减到0后,TIM减1;当调试程序断点时定时器立即
停止工作
PRD=9999; //定时周期寄存器存放定时时间常数,将值赋给TIM TIM=9999; //定时寄存器
TCR=0x669; //定时控制寄存器,启动定时器,将PRD中的数加载到TIM中
IFR=0x108; //中断标志寄存器,启动外部中断INT3和定时器中断0 (TINT0)的标志位
IMR=0x108; //中断屏蔽寄存器,开放外部中断INT3和定时器中断0 (INT0)的屏蔽位
asm(\ //开放全部可屏蔽中断 ST1=ST1&0xf7ff; while(1) {
while(t0_count>0); t0_count=250*coeff;
if(ST1&0x2000) ST1=ST1&0xdfff; //XF=0,即熄灭LED灯 else ST1=ST1|0x2000; //XF=1,即点亮LED灯
5
} }
interrupt void timer() {
t0_count--; }
interrupt void change_frequency() {
coeff++; //改变XF引脚输出的信号的频率 if (coeff>5) coeff=1; }
2、中断函数: .sect \ .ref _c_int00 .ref timer
rs: BD _c_int00 ;Rest nop nop
nmi: .space 4*16 ;NMI, SINT16 sint17:.space 4*16 ;SINT17 sint18: .space 4*16 ;SINT18 sint19: .space 4*16 ;SINT19 sint20: .space 4*16 ;SINT20 sint21: .space 4*16 ;SINT21 sint22: .space 4*16 ;SINT22 sint23: .space 4*16 ;SINT23 sint24: .space 4*16 ;SINT24 sint25: .space 4*16 ;SINT25 sint26: .space 4*16 ;SINT26 sint27: .space 4*16 ;SINT27 sint28: .space 4*16 ;SINT28 sint29: .space 4*16 ;SINT29 sint30: .space 4*16 ;SINT30
int0: .space 4*16 ;INT0, SINT0 int1: .space 4*16 ;INT1, SINT1 int2: .space 4*16 ;INT2, SINT2 tint0: BD timer ;TINT0, SINT3 nop nop
brint0: .space 4*16 ;BRINT0, SINT4 bxint0: .space 4*16 ;BXINT0, SINT5
dmac0: .space 4*16 ;DMAC0, brint2, SINT6 dmac1: .space 4*16 ;DMAC1, bxint2, SINT7
6
int3: .space 4*16 ;INT3, SINT8
hpint: .space 4*16 ;HPINT, SINT9
brint1: .space 4*16 ;BRINT1 or DMAC2, SINT10 bxint1: .space 4*16 ;BXINT1 or DMAC3, SINT11 dmac4: .space 4*16 ;DMAC4, SINT12 dmac5: .space 4*16 ;DMAC5, SINT13 rsvd1: .space 4*16 ;reserved rsvd2: .space 4*16 ;reserved .end
3、链接文件: MEMORY
{
PAGE 0: RESERVER: origin = 0x00, len = 0x80 INT_VECT: origin = 0x80, len = 0x80 PROG_RAM: origin = 0x100, len = 0x1000
PAGE 1: DATA_1: origin = 0x1100, len = 0x0e00 DATA_2: origin = 0x2000, len = 0x2000 }
SECTIONS {
.vectors: {} > INT_VECT PAGE 0 .text: {} > PROG_RAM PAGE 0 .stack: {} > DATA_1 PAGE 1 vars: {} > DATA_1 PAGE 1 .data:{} > DATA_2 PAGE 1 .bss:{} > DATA_2 PAGE 1 }
六、实验结果及体会
实验结果:每次按下按键,LED灯亮灭周期发生变化。
实验体会:一开始写入程序没成功,但是按下按键后,LED灯亮灭周期也发生变化,出现这种情况是实验板内部已经因为上一个人在试验中写入了程序,所以会出现插电后,程序没写入也能够按键改变亮灭周期。最后在老师的提醒下,成功写入程序,验证发现功能也得到了实现。在实验过程中每一步都要细心的去完成,多想想出现某种情况的原因,有不懂的就向老师、同学请教,这样才能在实验中进步。
7
二、基于DSPLib的FFT程序设计
一、实验目的
1、了解FFT的原理;
2、了解在DSP中FFT 的设计及编程方法; 3、熟悉对DSPLIB的调用方法;
二、实验内容
编写256点的实序列FFT的DSP程序,利用数据文件对FFT程序进行调试。
三、实验要求
1、产生256点的数据文件,表示方波、正弦等信号;
2、编写256点的实序列FFT的DSP程序对上述信号进行傅立叶变换; 3、利用CCS中VIEW菜单中的Graph调试工具观察信号时域波形及其频谱。
四、背景知识
1、时间抽选基2FFT算法的基本原理。(参阅《数字信号处理》教材) 2、DSPLib的应用
CCS提供DSPLib,其中包含了基本的数学计算和数字信号处理常用算法模块的函数,可直接调用这些函数实现一些数字信号处理算法。本实验主要使用了DSPLib的cbrev,rfft两个函数实现数字序列的逆序和DFT的计算。有关这两个函数的说明请参阅《dsplib中文版__TMS32054X_函数库中文用户指南.pdf》
程序流程图为:
开始输入待分析数据待分析数据变址运算基2FFT运算计算幅度谱
返回
8
五、实验步骤
1、根据实验要求编写256点FFT的C语言代码,中断向量表和CMD文件; 2、编译成功无误后下载到C5402开发板中,然后运行程序;
3、程序运行完成后,通过CCS中的View->Graph选项查看输入和输出波形, 4、分析实验结果是否符合要求。
六、程序源代码
1、主程序:
#include\
#include
#define Nx 256 //定义数组的长度即FFT运算长度 #define pi 3.1415926 //定义参数π的值
int i,j;
int scale=1; //归一化设置 int noscale=0; //非归一化设置
DATA x[Nx],x_tempt[Nx]; //用于存放输入的数据的数组 DATA y[Nx/2]; //用于存放输出的数据数组
#pragma DATA_SECTION(x,\
#pragma DATA_SECTION(x_tempt,\#pragma DATA_SECTION(y,\static void dataIO(void); void main() {
PMST=0x00a0; //将片内数据RAM映射到程序空间和数据空间,且地址从0080开始
dataIO(); //调用函数dataIO,即导入数据,且存放到x数组中 for(i=0;i x[i]=(1000*(cos(2*pi*1000*i/16000)+2*cos(2*pi*2000*i/16000)+cos(2*pi*3000*i/16000))); x[i]=(1000*(cos(2*pi*1000*i/16000)+2*cos(2*pi*2000*i/16000))); x_tempt[i]=x[i]; //将导入的数据存放到x_temp中 } 9