南邮大四课程设计
更新时间:2024-04-04 16:38:01 阅读量: 综合文库 文档下载
一、EMIF 接口上的I/O接口扩展
一.实验原理
1.TMS320VC5509DSP 的EMIF 接口:
存储器扩展接口(EMIF)是DSP 扩展片外资源的主要接口,它提供了一组控制信号和地址、 数据线,可以扩展各类存储器和寄存器映射的外设。
-ICETEK-VC5509-A 评估板在EMIF 接口上除了扩展了片外SDRAM 外,还扩展了指示灯、 DIP 开关和D/A 设备。具体扩展地址如下: 400800-400802h: D/A 转换控制寄存器 400000-400000h: 板上DIP 开关控制寄存器 400001-400001h: 板上指示灯控制寄存器
-与ICETEK-VC5509-A 评估板连接的ICETEK-CTR 显示控制模块也使用扩展空间控制主要 设备:
602800-602800h: 读-键盘扫描值,写-液晶控制寄存器 600801-600801h: 液晶辅助控制寄存器 602801h 、600802h: 液晶显示数据寄存器
602802-602802h: 发光二极管显示阵列控制寄存器 2.指示灯扩展原理
3.实验程序流程图:
二.实验步骤
1.实验准备:
关闭实验箱上扩展模块和信号源电源开关。
2.设置Code Composer Studio 2.21 在硬件仿真(Emulator)方式下运行。 3.启动Code Composer Studio 2.21: 选择菜单Debug→Reset CPU。 4.打开工程文件:
工程文件为:C:\\ICETEK-VC5509-EDULab\\Lab0301-LED\\LED.pjt。 打开源程序LED.c。 5.编译、下载程序。 6.运行程序,观察结果。 7.退出CCS:
三.部分程序代码
// 定义指示灯寄存器地址和寄存器类型
#define LBDS (*((unsigned int *)0x400001)) // 子程序接口
void Delay(unsigned int nDelay); // 延时子程序 int i; main() {
unsigned int uLED[4]={1,2,4,8}; // 控制字,逐位置1: 0001B 0010B 0100B 1000B CLK_init(); // 初始化DSP运行时钟 SDRAM_init(); // 初始化EMIF接口 while ( 1 ) {
}
}
for ( i=0;i<4;i++ ) {
LBDS=uLED[i]; Delay(256); }
for ( i=3;i>=0;i-- ) {
LBDS=uLED[i]; Delay(32); }
// 正向顺序送控制字 // 延时
// 反向顺序送控制字 // 延时 【延时256->32】
四.实验结果
映射在扩展存储器空间地址上的指示灯寄存器在设置时是低4位有效的,数据的最 低位对应指示灯D1,次低位对应D2,...依次类推。LED指示灯由D1→D2→D3→D4→D3→D2→D1循环依次点亮。
五.实验体会
了解ICETEK-VC5509-A 板在TMS320VC5509DSP 外部扩展存储空间上的扩展。 了解ICETEK-VC5509-A 板上指示灯扩展原理。 学习在C 语言中使用扩展的控制寄存器的方法。
二、定时器的使用
一.实验原理
1.通用定时器介绍及其控制方法
TMS320VC5509A 内部有两个20 位通用定时器(GP): *每个通用定时器包括:
-一个16 位的减计数的计数器TIM; -一个16 位的定时器周期寄存器PRD; -一个16 位的定时器控制寄存器TCR; -一个16 位的定时器预定标寄存器PSCR; *PSCR 寄存器说明: 15 10 9 6 5 4 3 0
Reserved PSC Reserved TDDR
PSC: 4 位的预定标值,与TIM 共同组成20 位的定时计数器. TDDR: 预定标周期寄存器(在需要时重装入PSC 的值) TCR 寄存器说明 2.中断响应过程
外设事件要引起CPU 中断,必须保证:IER 中相应使能位被使能,IFR 相应中断也被使能。 在软件中,当设置好相应中断标志后,开中断,进入等待中断发生的状态;外设(如定时器)
中断发生时,首先跳转到相应中断高级的服务程序中(如:定时器1 会引起TINT 中断), 程序在进行服务操作之后,应将本外设的中断标志位清除以便能继续中断,然后返回。 3.中断程序设计:
-程序中应包含中断向量表,VC5509A 默认向量表从程序区0 地址开始存放,根据IPVD 和 IPVH 的值确定向量表的实际地址。
-注意观察程序中INTR_init()函数的定义部分,其中IPVD 和IPVH 的值都为0x0d0;同时观察配置文件ICETEK-VC5509-A.cmd 中的VECT 段描述中o=0x0d000。 -向量表中每项为8 个字,存放一个跳转指令,跳转指令中的地址为相应服务程序入口地址。 第一个向量表的首项为复位向量,即CPU 复位操作完成后自动进入执行的程序入口。 -服务程序在服务操作完成后,清除相应中断标志,返回,完成一次中断服务。 4.实验程序流程图:
二.实验步骤
1.实验准备:
连接实验设备:关闭实验箱上扩展模块和信号源电源开关。
2.设置Code Composer Studio 2.21 在硬件仿真(Emulator)方式下运行: 3.启动Code Composer Studio 2.21: 选择菜单Debug→Reset CPU。 4.打开工程文件:
打开菜单“Project”的“Open”项;选择C:\\ICETEK-VC5509-EDULab\\Lab0303-Timer 目录 中的“Timer.pjt”。
在项目浏览器中,双击main.c,激活main.c 文件。
打开ICETEK-VC5509-A.cmd,对照vector.asm 源程序学习中断向量表的写法。
5.编译、下载程序。 6.运行程序,观察结果。
7.改变TIMER_init()函数里*prd0 = 0x0ffff 为 “=0x0fff ”;重复步骤5,6 观察实验现象。 8.退出CCS
三.部分程序代码
// 定义指示灯寄存器地址和寄存器类型 #define LBDS (*((unsigned int *)0x400001))
void INTR_init( void ); void TIMER_init(void);
unsigned int uLED[4]={1,2,4,8}; int i=0;
int nCount;
main() { nCount=0; CLK_init(); SDRAM_init(); LBDS=0; INTR_init(); TIMER_init(); while ( 1 ) { } }
void interrupt Timer() { nCount++; nCount%=256; if ( nCount==0 ) { LBDS=uLED[(i++)%4]; } }
void INTR_init( void ) { IVPD=0xd0; IVPH=0xd0;
IER0=0x10; DBIER0 =0x10; IFR0=0xffff; asm(\ }
void TIMER_init(void) {
ioport unsigned int *tim0; ioport unsigned int *prd0; ioport unsigned int *tcr0; ioport unsigned int *prsc0; tim0 = (unsigned int *)0x1000; prd0 = (unsigned int *)0x1001; tcr0 = (unsigned int *)0x1002; prsc0 = (unsigned int *)0x1003; *tcr0 = 0x04f0; *tim0 = 0;
*prd0 = 0x0ffff; //从0x0fff改为0x0ffff,现象:循环变慢 *prsc0 = 2; *tcr0 = 0x00e0; }
四.实验结果
LED指示灯D1在定时器的定时中断中按照设计定时闪烁。
五.实验体会
通过实验熟悉VC5509A 的定时器; 掌握VC5509A 定时器的控制方法;
掌握VC5509A 的中断结构和对中断的处理流程;
学会C 语言中断程序设计,以及运用中断程序控制程序流程。
三、中断的使用
一.实验原理
1.中断及中断处理过程: ⑴中断简介:
中断是一种由硬件或软件驱动的信号,DSP 在接到此信号时,将当前程序悬挂起来,转 去执行另外一个任务,这个任务我们称为中断服务程序(ISR)。TMS320C55x (C55x) DSP 可支持32 个ISR,可由硬件或软件触发。
所有的C55x 中断,可以分成可屏蔽中断和不可屏蔽中断两种,软件中断是不可屏蔽的。
⑵DSP 处理中断的步骤:
①接收中断请求。请求由软件或硬件发出。
②响应中断请求。对于可屏蔽中断,需要满足若干条件,才发生响应;而对于不可屏蔽中 断,则立即响应。
③准备执行中断服务程序。
-完成当前正在执行的指令;将进入流水线但还未解码的指令清除。 -自动保存若干寄存器的值到数据堆栈和系统堆栈。
-取得用户定义的中断向量表中当前中断向量,中断向量指向中断服务程序入口。
④执行中断服务程序。中断服务程序包含中断返回指令,这样返回时可以出栈以前保存的 关键寄存器数据,从而恢复中断服务程序执行前的现场。 ⑶中断向量表:
中断向量表的地址可以由用户指定。 ⑷外中断:
TMS320C5509 可以响应INT0-INT4 五个外中断。 2.ICETEK-CTR 板的键盘接口:
显示/控制模块ICETEK-CTR 通过接口P8 连接小键盘,接收小键盘传送的扫描码,并在每 个扫描码结束后保存,同时向DSP 的INT2 发送中断信号;当DSP 读键盘时将扫描码送到 数据总线上。小键盘上每次按下一个键将产生2 个扫描码、2 次中断。 3.程序编制:
由一个不含中断处理程序的工程通过改写加入中断处理程序部分大致需要如下操作(假设使 用INT2):
⑴编制中断服务程序:可以用C 语言程序实现,编写单独的一个函数XINT, 此函数使用interrupt 修饰,没有参数和返回值。
⑵构造中断向量表:可以用汇编语言构造,编写一个汇编语言模块程序vector.asm,在程序 头上声明段名为“.vectors”;定义外部标号_XINT,由于汇编语言要使用C 语言程序中定义的标号XINT,需要在这个标号前加底线;在中断向量表该中断对应位置(int2)写汇编语言语句跳转语句。
⑶修改连接命令文件:在MEMORY 小节中开辟单独的地址段用以存放中断向量表;在 SECTIONS 小节中指定.vectors 段到前步开设的内存段中。
⑷主程序中进行初始化设置:定位中断向量表,使能中断,清中断等。 4.实验程序流程图:
二.实验步骤
1.实验准备: 1. 连接实验设备:
连接实验箱附带的键盘的PS2 插头到ICETEK-CTR 的“键盘接口”P8。
将ICETEK-CTR 板的供电电源开关拨动到“开”的位置。开关位置请参见第二部分、第 一章、五、“扩展模块电源开关及其指示灯”。
2.设置Code Composer Studio 2.21 在硬件仿真(Emulator)方式下运行: 3.启动Code Composer Studio 2.21:选择菜单Debug→Reset CPU。 4.打开工程文件:
工程目录:C:\\ICETEK-VC5509-EDULab\\Lab0304-XINT\\XINT.pjt。 开始初始化:DSP 时钟、EMIF、 ICETEK-CTR、GPIO、 初始化中断控制寄存器 等待中断产生 改变指示灯状态 中断服务开始 中断服务结束
浏览main.c 文件的内容,理解各语句作用。 打开ICETEK-VC5509-A.cmd。 5.编译、下载程序。 6.运行程序,观察结果:
运行程序,按一下小键盘上任意一个键,注意观察ICETEK-CTR 板上指示灯闪烁的情况。 7.观察中断函数的执行:
选择“Debug”菜单中“Halt”暂停运行程序,在XINT 程序中的语句上加软件断点,重新 运行程序(选择“Debug”菜单中“Run”),观察何时程序停留在断点上。 8.退出CCS。
三.部分程序代码 void InitMcBSP();
void INTR_init( void ); void TIME_init(void);
int nCount;
main() {
nCount=0; CLK_init(); SDRAM_init(); INTR_init(); InitCTR(); InitMcBSP();
CTRGR=2; // 使能IO
while ( 1 ) { } }
void InitMcBSP() {
// IOPin: McBSP1.FSX S15
//SPCR2.XRST_=0,PCR.XIOEN=1,PCR.FSXM=1,PCR.FSXP=0/1 SPCR2_1&=0x0fffe; PCR1|=0x2800; }
void interrupt XINT() {
nCount++; nCount%=2; if ( nCount==0 ) PCR1^=8; }
void INTR_init( void ) {
IVPD=0x80; IVPH=0x80; IER0=8; DBIER0=8; IFR0=0xffff;
asm(\}
四.实验结果
通过实验可以发现,每次按下键盘均会发生两次中断,当按下键不放时会产生连续的中断;只有在外中断发生时,XINT 函数才会被执行。
五.实验体会
1.通过实验熟悉VC5509A 的中断响应过程。
2.学会C 语言中断程序设计,以及运用中断程序控制程序流程。
四、步进电机控制
一.实验原理
1.EMIF 接口:
TMS320C5509DSP 的扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如 连接片外扩展存储器等。这一接口提供地址连线、数据连线和一组控制线。ICETEK-VC5509-A
将这些扩展线引到了板上的扩展插座上供扩展使用。
2.步进电机是由DSP 通用I/O 管脚输出直接控制。步进电机的起动频率大于500PPS(拍每秒),空载运行频率大于900PPS。5509A 的通用I/O 口S22 控制电机的转动频率,S14 控制转动方向。
3.控制的方法是使用DSP 通用定时器设置S22 以一定的频率改变高低状态,输出方波,设置S14 为高电平则顺时针转动,低电平为逆时针转动。
4.实验程序流程图:
二.实验步骤
1.实验准备: ⑴连接实验设备。
⑵连接实验箱附带的键盘的PS2 插头到ICETEK-CTR 的“键盘接口”P8。 ⑶将ICETEK-CTR 板的供电电源开关拨动到“开”的位置。
2.设置Code Composer Studio 2.21 在硬件仿真(Emulator)方式下运行: 3.启动Code Composer Studio 2.21: 选择菜单Debug→Reset CPU。 4.打开工程文件:
工程目录:C:\\ICETEK-VC5509-EDULab\\Lab0407-SAMotor\\SAMotor.pjt。 5.编译并下载程序。 6.运行程序,观察结果。
电机转动时按下ICETEK-CTR 板上连接的小键盘中“4”和“6” 键,控制电机转动方向。 用“+”和“-”键可微调速度。 7.停止程序运行并退出。 8.退出CCS。
三.部分程序代码
void INTR_init( void ); void TIME_init(void);
int nCount,nStep,nAddStep; unsigned int uTimPrd0;
unsigned int pwm2[8]={ 0x86,0x87,0x83,0x8b,0x89,0x8d,0x8c,0x8e }; main() {
int sEnd;
unsigned char dbScanCode,tKey;
nCount=0; nStep=1; sEnd=1,nAddStep=1; uTimPrd0=0x1002; CLK_init(); SDRAM_init(); InitCTR(); CTRLR=0x0c2; TIME_init(); INTR_init(); do {
if ( nCount>16 ) {
nCount=0;
dbScanCode=GetKey(); // Scan for Keyboard input
tKey=CTRCLKEY; // Clear Keyboard scan buffer if ( dbScanCode!=0 && dbScanCode!=0x0ff ) {
switch(dbScanCode) {
case SCANCODE_Enter: // Exit Program sEnd=0; break;
case SCANCODE_4: // Motor Turn Forward nAddStep=1; break;
case SCANCODE_6: // Motor Turn Backward nAddStep=-1; break;
case SCANCODE_Minus: // Motor Speed Down uTimPrd0+=0x800; if(uTimPrd0>=0x8000) uTimPrd0=0x8002; asm( \ TIME_init();
asm(\ break;
case SCANCODE_Plus: // Motor Speed up uTimPrd0-=0x800; if(uTimPrd0<=0x1000) uTimPrd0=0x1002; asm( \
TIME_init();
asm(\ break; } } }
}while(sEnd); exit(0); }
void interrupt Timer() {
CTRLR=pwm[nStep]; nStep+=nAddStep;
if ( nStep<0 ) nStep=7; else if ( nStep>7 ) nStep=0; nCount++; }
void INTR_init( void ) {
IVPD=0x80; IVPH=0x80; IER0=0x10; DBIER0 =0x10; IFR0=0xffff;
asm(\ }
void TIME_init(void) {
tim0 = (unsigned int *)0x1000; prd0 = (unsigned int *)0x1001; tcr0 = (unsigned int *)0x1002; prsc0 = (unsigned int *)0x1003;
*tcr0 = 0x04f0; *tim0 = 0x0;
*prd0 = uTimPrd0; *prsc0 = 2;
*tcr0 = 0x00e0; }
四.实验结果
可以看到显示/控制模块上的电机指针在转动,使用“4”和“6”键可控制其转 动方向;使用“+”和“-”键可以控制其转动速度。
五.实验体会
通过实验学习使用 5509DSP 的扩展I/O 端口控制外围设备信息的方法,掌握使用5509DSP 通用计时器的控制原理及中断服务程序的编程方法;了解步进电机的控制方法。
五、多路信号混频
一.实验原理
1.模数转换工作过程:
-模数转换模块接到启动转换信号后,按照设置进行相应通道的数据采样转换。 -经过一个采样时间的延迟后,将采样结果放入AD 数据寄存器中保存。 -等待下一个启动信号。 2.模数转换的程序控制:
模数转换相对于计算机来说是一个较为缓慢的过程。一般采用中断方式启动转换或保存结 果,这样在CPU 忙于其他工作时可以少占用处理时间。设计转换程序应首先考虑处理过程如何与模数转换的时间相匹配,根据实际需要选择适当的触发转换的手段,也要能及时地保存结果。由于TMS320VC5509DSP 片内的A/D 转换精度是10 位的,转换结果(16 位)的最高位(第15位)表示转换值是否有效(0 有效),第14-12 位表示转换的通道号,低10 位为转换数值,所以在保留时应注意取出结果的低10 位,再根据高4 位进行相应保存。 4.混频波形产生:
将接收到的两路AD 采集信号进行相加,并对结果的幅度进行限制,从而产生混合后的输出 波形。实验中采用了同相位混频方法,也可修改程序完成异相混频法。 5.源程序及注释:
本实验程序在主循环中对AD 进行连续采样,每次采样首先设置AD 转换控制寄存器
(ADCCTL),发送转换通道号和启动命令,然后循环等待转换结果,最后将结果保存。由于需要进行实时混频,所以交替转换通道0 和通道1(ICETEK-VC5509-EDU 实验箱上ADCIN2 和ADCIN3)。
二.实验步骤
1.实验准备: ⑴连接实验设备。
⑵准备信号源进行AD 输入。
①取出2 根实验箱附带的信号线。
②用1 根信号线连接实验箱底板上信号源I 模块的“波形输出”和“A/D 输入”模块的“ADCIN2”插座。这样,信号源I 的输出波形即可送到ICETEK-VC5509-A板的AD 输入通道0。
③用1 根信号线连接实验箱底板上信号源II 模块的“波形输出”和“A/D 输入”模块的“ADCIN3”插座。这样,信号源II 的输出波形即可送到ICETEK-VC5509-A 板的AD 输入通道1。
④设置信号源I:
-调整拨动开关“频率选择”拨到“100Hz-1KHz”档。 -将“频率微调”顺时针调到头(最大)。
-调整拨动开关“波形选择”拨到“正弦波”档。 -将“幅值微调”顺时针调到头(最大)。 ⑤设置信号源II:
-调整拨动开关“频率选择”拨到“10Hz-100Hz”档。 -将“频率微调”顺时针调到头(最大)。
-调整拨动开关“波形选择”拨到“正弦波”档。 -将“幅值微调”顺时针调到头(最大)。
⑥将两个信号源的电源开关拨到“开”的位置。
2.设置Code Composer Studio 2.21 在硬件仿真(Emulator)方式下运行: 3.启动Code Composer Studio 2.21: 选择菜单Debug→Reset CPU。
4.打开工程文件:工程文件为:C:\\ICETEK-VC5509-EDULab\\Lab0603-Mixer\\AD.pjt。 5.编译、下载程序,选择菜单Debug->Go Main,使程序运行到main 函数入口位置。 6.设置软件断点和观察窗口:
-打开源程序main.c,在有注释“在此加软件断点”的行上加软件断点。 -选择菜单View->Graph->Time/Frequency…进行如下设置:
-选择菜单View->Graph->Time/Frequency…进行如下设置:
-选择菜单View->Graph->Time/Frequency…进行如下设置:
7.运行程序观察结果: 按“F5”键运行到断点,注意观察窗口“AD0”和“AD1”中的输入波形,同时分析“nMixing” 窗口中混频合成的波形与输入波形的关系。 8.观察动态效果:
选择菜单Debug->Animate,运行程序,同时改变信号源输入的波形、频率参数,观察动态 效果。
三.部分程序代码 void InitADC();
void wait( unsigned int cycles ); void EnableAPLL( );
unsigned int nADC0[256],nADC1[256],nMixing[256];
main() {
int i;
unsigned int uWork;
EnableAPLL(); SDRAM_init(); InitCTR(); InitADC();
PLL_Init(144); while ( 1 ) {
for ( i=0;i<256;i++ ) {
ADCCTL=0x8000; // 启动AD转换,通道0 do {
uWork=ADCDATA;
} while ( uWork&0x8000 ); nADC0[i]=uWork&0x0fff;
ADCCTL=0x9000; // 启动AD转换,通道1 do {
uWork=ADCDATA;
} while ( uWork&0x8000 ); nADC1[i]=uWork&0x0fff;
uWork=(nADC0[i]+nADC1[i]); // 混频 uWork>>=1; // 限幅,混频后仍然产生12位数据 // uWork=(nADC0[i]+nADC1[i]*3); // uWork>>=2;
nMixing[i]=uWork; }
} // 在此加软件断点 }
void InitADC() {
ADCCLKCTL=0x23; // 4MHz ADCLK ADCCLKDIV=0x4f00; }
void wait( unsigned int cycles ) {
int i;
for ( i = 0 ; i < cycles ; i++ ){ } }
四.实验结果
五.实验体会
掌握A/D 转换的基本过程和程序处理过程; 学习通过对采样值进行计算产生混频波形。
六、异步串口通信
一. 实验原理
1.ICETEK-VC5509-A 板异步串口设计。
在板上加上16C550、Max232 和驱动电路部分即可。驱动电路主要完成将输出的0-3.3V 电 平转换成异步串口的工作电平,转换电平的工作由MAX232 芯片完成,但由于它是5V 器件所以它同DSP 间的信号线必须有电平转换,此板采用的是74LVC245。 2.串行通信接口设置。
内部生成的串行时钟由系统时钟SYSCLK 频率和波特率选择寄存器决定。串行通信接口使 用16 位波特率选择寄存器,数据传输的速度可以被编程为65000 多种不同的方式。 不同通信模式下的串行通信接口异步波特率由下列方法决定: -BRR=1—65535 时的串行通信接口异步波特率:
串行通信接口异步波特率=SYSCLK/[( BRR+1)*8]。其中,BRR=SYSCLK/(SCI 异步波特率*8)-1;
-BRR=0 时的串行通信接口异步波特率:
串行通信接口异步波特率=SYSCLK/16。这里BRR 等于波特率选择寄存器的16 位值。
3.实验程序流程图:
二. 实验步骤
1.实验准备: ⑴连接实验设备。 ⑵连接串口接线:
注意连接前需要将实验箱和计算机的电源关闭。
用随实验箱附带的串口线(两端均为9 孔“D”形插头)连接计算机com1 或com2 插座和 ICETEK-VC5509-A 板上标准RS-232 插座。
2.设置Code Composer Studio 2.21 在硬件仿真(Emulator)方式下运行: 3.启动Code Composer Studio 2.21: 选择菜单Debug→Reset CPU。 4.打开工程文件:
工程目录: C:\\ICETEK-VC5509-EDULab\\Lab0308-uart 5.编译、下载程序。 6.打开串口调试助手:
C:\\ICETEK-VC5509-EDULab\\Lab0308-uart 目录中的程序“串口调试助手V2.0B.exe”;设置“串口调试助手”的串行端口为实际连接的计算机COM 端口,设置波特率为9600,设置传输方式为8 位、无校验、1 个停止位。 7.运行程序观察结果:
运行程序后,切换窗口到“串口调试助手”;在“串口调试助手”的接收窗口中可看到DSP 通过SCI 发送来的“Hello PC!,Over|”字样;在“发送的字符/数据”栏中输入一些要发送到 DSP 的字符串,以“.”字符结尾;然后单击“手动发送”按钮;DSP 在接收到PC 机的信息后会自动进行回答。
8.结束程序运行,退出CCS。
三.部分程序代码
void TMCR_reset( void ); void CLK_init( void ); void EMIF_init(void); void wait(int nWait);
char cString[17]={ \say\
int bReceive,nLen; main() {
unsigned int uWork; int i,k; bReceive=0; TMCR_reset(); CLK_init(); EMIF_init();
LCR = 0x80; DLL = 0x18; DLM = 0x00; LCR = 0x03; FCR = 0x01; MCR = 0x20;
IER = 0x00;
for(;;) {
if ( bReceive==0 ) {
for ( i=0;i<16;i++ ) {
do {
uWork=LSR;
} while ( uWork&0x040 != 0x040 ); THR=cString[i]; wait(128); } } else {
for ( i=0;i<10;i++ )
{
do {
uWork=LSR;
} while ( uWork&0x040 != 0x040 ); THR=cAnswer[i]; wait(128); } do {
uWork=LSR;
} while ( uWork&0x040 != 0x040 ); THR='\\\
for ( i=0;i do { uWork=LSR; } while ( uWork&0x040 != 0x040 ); THR=cBuffer[i]; wait(128); } do { uWork=LSR; } while ( uWork&0x040 != 0x040 ); THR='\\\ wait(128); for ( i=9;i<16;i++ ) { do { uWork=LSR; } while ( uWork&0x040 != 0x040 ); THR=cString[i]; wait(128); } } k=0; bReceive=0; while ( 1 ) { do { uWork=LSR; } while ( (uWork&1)==0 ); cReceive=RBR; cBuffer[k]=cReceive&0x0ff; if ( cReceive=='.' ) { cBuffer[k+1]='\\0'; nLen=k+1; bReceive=1; break; } k++; k%=16; } } } void EMIF_init(void) { ioport unsigned int *ce21 =(unsigned int *)0x809; *ce21 = 0x1fff; } void CLK_init( void ) { ioport unsigned int *clkmd; clkmd=(unsigned int *)0x1c00; *clkmd = 0x21f3; } void TMCR_reset( void ) { ioport unsigned int *TMCR_MGS3=(unsigned int *)0x07FE; ioport unsigned int *TMCR_MM =(unsigned int *)0x07FF; *TMCR_MGS3 =0x510; *TMCR_MM =0x000; } void wait(int nWait) { int i,j,k=0; for ( i=0;i 四. 实验结果 通过 DSP 传送到PC 机上的信息,可以看出:串口正确工作。 五. 实验体会 了解ICETEK-VC5509-A 评估板上扩展标准RS-232 串行通信接口的原理和方法。 学会对串行通信芯片的配置编程。 学习设计异步通信程序。 七. 综合设计1 音乐产生 一.实验要求概述 通过实验学习使用 5509DSP 的扩展端口控制外围设备信息的方法,掌握使用5509DSP 通用计时器的控制原理及中断服务程序的编程方法;了解蜂鸣器发声原理和音乐发生方法。 二.实验原理 1.EMIF 接口: TMS320C5509DSP 的扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如 连接片外扩展存储器等。这一接口提供地址连线、数据连线和一组控制线。ICETEK-VC5509-A 将这些扩展线引到了板上的扩展插座上供扩展使用。 2.蜂鸣器由DSP 通用I/O 管脚输出控制,可将此管脚上的频率输出转换成声音输出。5509A 的通用I/O 口S13 控制蜂鸣器的输出频率。 控制的方法是使用DSP 通用定时器设置S13 以一定的频率改变高低状态,输出方波。对于 通用定时器周期寄存器的设置,计数值为所需频率计数值的二分之一。 音乐的频率(C 调): C D E F G A B ^C 1 2 3 4 5 6 7 ^1 C: 264, 297, 330,352, 396, 440,495, 528 3.蜂鸣器的连接:由于选用的蜂鸣器所需电流较小,所以采用将DSP 通用I/O 引脚直接驱动的方式。 4.实验程序流程图: 三. 部分程序代码 #include \ #include \#include \ // :-- Define Timer 0 's Registers ---// ioport unsigned int *tim0; ioport unsigned int *prd0; ioport unsigned int *tcr0; ioport unsigned int *prsc0; // :-- End of Define -----------------// // :-- Define Timer 1 's Registers ---// ioport unsigned int *tim1; ioport unsigned int *prd1; ioport unsigned int *tcr1; ioport unsigned int *prsc1; // :-- End of Define -----------------// //声明TIMER1相关的寄存器 void InitMcBSP(); main() { int nMusicCount; unsigned char dbScanCode; int nWork; CLK_init(); SDRAM_init(); InitCTR(); InitMcBSP(); CTRGR=8; // BUZZE=1 打开蜂鸣器, 见ICETEK-CTR的全局控制寄存器描述 // 设置合适的音长和音高 for ( nWork=0;nWork music[nWork][0]*=10; music[nWork][1]*=3; music[nWork][1]/=12; } // 设置DX0管脚为通用输出管脚以驱动蜂鸣器 // SPCR0&=0x0fffeffff; // /XRST=0 // PCR0|=0x2000; // RIOEN=1 InitInterrupt(); TIME_init(); nMusicCount=0; while ( 1 ) { nMusicCount++; nMusicCount%=nMusicNumber; if ( music[nMusicCount][0]==0 ) //*tcr0&=0x0fffffcff; // 静音 *tcr1&=0x0fffffcff; // 静音 else { //*prd0=music[nMusicCount][0]; // 切换音符 //*tcr0=0xe0; *prd1=music[nMusicCount][0]; // 切换音符 *tcr1=0xe0; } dbScanCode=GetKey(); if ( dbScanCode==SCANCODE_Enter ) { break; } 四.实验体会 通过实验学习使用 5509DSP 的扩展端口控制外围设备信息的方法,掌握使用5509DSP 通用计时器的控制原理及中断服务程序的编程方法;了解了运用发光二极管阵列显示字母的程序。实验的主要问题集中在通过用计时器中断中取得延时,改变显示内容。这主要考验了我们对定时器的灵活运用和对不同程序的调和,叠加,配合的使用上。这次实验为期3个星期,虽然在这之间给我们带来了很多没有遇到过的困难,但是幸运的是在老师的精心指导和我们自己的不懈努力下还是完成了实验任务。同时,也巩固了我们对DSP器件的使用,提高了我们的设计,运用和动手能力,使我们受益匪浅。 八. 综合设计2 发光二级管阵列显示姓名 一.实验要求概述 通过实验学习使用 5509A DSP 的扩展端口控制外围设备的方法,了解发光二极管阵列的控制编程方法。利用发光二极管阵列显示姓名的汉语拼音。为了控制时间间隔的准确性,要求采用定时器中断的方式进行调控。 二.实验原理 1.EMIF 接口: TMS320C5509DSP 的扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如 连接片外扩展存储器等。这一接口提供地址连线、数据连线和一组控制线。ICETEK-VC5509-A将这些扩展线引到了板上的扩展插座上供扩展使用。 2.发光二极管显示阵列的显示是由扩展端口控制,扩展在EMIF 接口的两个寄存器提供具体 控制。原理图如下: 3.显示原理: DSP 须将显示的图形按列的顺序存储起来(8×8 点阵,8 个字节,高位在下方,低位在上方),然后定时刷新控制显示。具体方法是,将以下控制字按先后顺序、每两个为一组发送到端口0x602802,发送完毕后,隔不太长的时间(以人眼观察不闪烁的时间间隔)再发送一遍。由于位值为“0”时点亮,所以需要将显示的数据取反。 0x01,第8 列数据取反,0x02,第7 列数据取反, 0x04,第6 列数据取反,0x08,第5 列数据取反, 0x10,第4 列数据取反,0x20,第3 列数据取反, 0x40,第2 列数据取反,0x80,第1 列数据取反, 4.实验程序流程图: 送相应点阵刷新显示 开 始 初始化:DSP时钟,EMIF 初始化ICETEK-CTR 选通发光二极管显示阵列 由Z,O,N,G,J,I,E,循环 送相应点阵刷新显示 三. 部分程序代码 在 ICETEK-VC5509-EDU.h 文件中定义所要显示的姓名汉语拼音的字母代码: unsigned char ledbuf[8],ledx[8]; unsigned char ledkey[80]= { 0x00,0x42,0x85,0x89,0x91,0xB1,0x42,0x00,//高bit在低位s 0x00,0x7f,0x80,0x80,0x80,0x40,0xff,0x00,//'u' 0x00,0xff,0x02,0x0C,0x30,0x40,0xff,0x00,//'n' 0x00,0xff,0x09,0x09,0x09,0x09,0x01,0x00,//'f' 0x00,0x81,0xff,0x89,0x89,0x89,0x81,0x00,//'e' 0x00,0xFF,0x03,0x0c,0x30,0xc0,0xff,0x00,//'n' 0x00,0x3e,0x41,0x41,0x51,0x71,0xf0,0x00,//'g' 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空白 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; #include \ #include \#include \void INTR_init( void ); void TIMER_init(void); int nCount; int Count; main() { // unsigned char dbScanCode; nCount=0; Count=0; CLK_init(); SDRAM_init(); InitCTR(); CTRLR=0x0c1; // 打开发光二极管阵列 INTR_init(); TIMER_init(); while ( 1 ) { } } void interrupt Timer() { nCount++; nCount%=8;//0.06s SetLEDArray(nCount); Delay1(25); } void INTR_init( void ) { IVPD=0x80; IVPH=0x80; IER0=0x10; //开定时器0中断 DBIER0 =0x10;//debug定时器中断 IFR0=0xffff;//置位标志位 asm(\ } void TIMER_init(void) { ioport unsigned int *tim0; ioport unsigned int *prd0; ioport unsigned int *tcr0; ioport unsigned int *prsc0; tim0 = (unsigned int *)0x1000; prd0 = (unsigned int *)0x1001; tcr0 = (unsigned int *)0x1002; prsc0 = (unsigned int *)0x1003; *tcr0 = 0x04f0;//bit4 TSS置为1,表示停止计数,bit10 TLB置为1,表示重装载 *tim0 = 0; *prd0 = 0x0ffff; *prsc0 = 2;//TDDR置为2 *tcr0 = 0x00e0;//bit4 TSS置为0,表示开始计数,bit10 TLB置为0,表示重装载关闭 } 四. 实验问题及解决办法 在初步设计实验的时候,我们第一步成功的解决了显示自己姓名的汉语拼音这一步,根据我们希望显示的字母写出十六进制的代码。而第二步在程序中加入定时器进行中断控制时,不断报错,程序无法运行。为了检验是什么地方出现错误的时候,我们用delay延迟函数代替定时器,表现出能够初步按照我们的要求显示姓名的汉语拼音。那么问题就归结于定时器的运用上。这花费了我们相当多的时间设计定时器对阵列显示的控制。最后还是基本完成了实验要求,在LED上显示了我们的姓名。 五.实验体会 通过实验学习使用 5509DSP 的扩展端口控制外围设备信息的方法,掌握使用5509DSP 通用计时器的控制原理及中断服务程序的编程方法;了解了运用发光二极管阵列显示字母的程序。实验的主要问题集中在通过用计时器中断中取得延时,改变显示内容。这主要考验了 我们对定时器的灵活运用和对不同程序的调和,叠加,配合的使用上。这次实验为期3个星期,虽然在这之间给我们带来了很多没有遇到过的困难,但是幸运的是在老师的精心指导和我们自己的不懈努力下还是完成了实验任务。同时,也巩固了我们对DSP器件的使用,提高了我们的设计,运用和动手能力,使我们受益匪浅。
正在阅读:
南邮大四课程设计04-04
行政介绍信08-22
口腔生物学第二章练习题04-17
个性发展特长及成果06-02
知心姐姐的回信08-09
西方文化概论复习资料08-11
苏教版八年级数学上册知识点详细全面精华09-20
广西银行招聘考试管理基础知识组织文化与环境:约束力量考试试题03-13
乡村夏夜作文600字07-05
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 大四
- 课程
- 设计
- 美国文学史概述及选读复习资料
- LK600说明书 - 图文
- 选 票- 南通大学商学院
- 第2章%20金属切削原理
- 河南移动郑州分公司XXXXGSM+TD室内分布系统设计方案(模板)2012
- 维修电工高级理论知识试卷(含答案)
- 《昆虫记》名著阅读选段专项练习(匹配部编版)(附标准答案)
- 国际商务谈判实训报告
- JCL
- 《石油建设安装工程概算指标》(2005版)编制说明解释 - 图文
- 软件体系结构课后习题第三章作业
- 2018-2019年小学数学人教版《四年级下》《4 小数的意义和性质》
- 基于DSP的SPWM程序
- 31标试验路段施工方案改
- 动力气象学复习题
- 社会变迁背景下藏族传统体育与现代体育的融合与发展
- 工程招投标论文
- 宝鸡市工伤保险经办规程
- 浅谈形式主义的几种表现
- 军事理论考试题及答案