课程设计报告(2)

2018-11-28 18:13

IRQ_setVecs((Uint32)(&VECSTART)); /*修改寄存器IVPH,IVPD,重新定义中断向量表*/ old_intm = IRQ_globalDisable(); /*禁止所有可屏蔽的中断源*/ mhTimer0 = TIMER_open(TIMER_DEV0, TIMER_OPEN_RESET);/*打开定时器0,设置其为上电的的默认值,并返回其句柄*/

eventId0 = TIMER_getEventId(mhTimer0);/*获取定时器0的中断ID号*/ IRQ_clear(eventId0); /*清除定时器0的中断状态位*/

IRQ_plug(eventId0,&timer0Isr); /*为定时器0设置中断服务程序*/ TIMER_config(mhTimer0, &timCfg0);/*设置定时器0的控制与周期寄存器*/ IRQ_enable(eventId0); /*使能定时器的中断*/ IRQ_globalEnable(); /*设置寄存器ST1的INTM位,使能所有的中断*/ /*启动定时器0*/ TIMER_start(mhTimer0); for(;;) { if(xfchange == 0) {

CHIP_FSET(ST1_55,XF,1); /*点亮XF的LED*/

} else { CHIP_FSET(ST1_55,XF,0); /*关掉XF的LED*/ } }

IRQ_globalRestore(old_intm); /*恢复INTM旧的值*/ TIMER_close(mhTimer0); /*关掉定时器0*/

}

interrupt void timer0Isr(void) /*定时器0的中断程序*/ {

++timer0_cnt;

if(timer0_cnt == 2000)//为了避免视觉暂留,把周期设定的大一些 { xfchange = 1; }

if(timer0_cnt == 4000) { timer0_cnt = 0; xfchange = 0; } }

实验现象:LED灯间断亮灭 4、实时时钟实验

RTC为运行在DSP上的应用程序提供了一个时间基准。当前的日期和时间由一组时间寄存器提供,每秒更新一次。RTC时钟来源于一个外部频率为32768Hz的晶振,连接在

RTCINX1和RTCINX2信号之间,或一个同频率的外部时钟源。RTC有单独电源,与DSP的其他部分分开。所以,即使DSP没有上电,RTC也能保存当前的时间和日期信息。只要RTC供电,闹钟寄存器的配置就得以保持。在器件的封装上,有RTC单独的供电引脚。为保证该寄存器所存储的时间的准确性,RTC为访问该寄存器提供了1个读缓冲区和1个写缓冲区

RTCINTEN中的SET位用来控制读写缓冲区与时间日期寄存器的隔离。SET=0,读写缓冲区直接连接到时间日期寄存器; SET=1,时间日期寄存器复制到读缓冲区,此时读缓冲区与时间日期寄存器隔离

主要程序为(重要语句已作注释): #include #include #include #include

void myPeriodicIsr(void); void myUpdateIsr(void);

extern Uint32 VECSTART(); //声明中断向量表 volatile Uint16 rtc_cnt = 0;

volatile Uint16 counterPer = 0, counterUp = 0, sec; int min0, min1 = 0; int stop = 0;//标志 int old_intm; int eventId;

RTC_Date myDate = { 0x03, /* Year */ 0x02, /* Month */ 0x28, /* Daym */ 0x05 /* Dayw */ };

RTC_Time myTime = {

0x1, /* Hour */ 0x4, /* Minutes */ 0x59, /* Seconds */ };

RTC_IsrAddr addr = {

myPeriodicIsr,//函数名,地址 NULL,

myUpdateIsr }; main() {

CSL_init();

RTC_setTime(&myTime); RTC_setDate(&myDate);

old_intm = IRQ_globalDisable(); //暂时关闭所有可屏蔽中断

IRQ_setVecs((Uint32)(&VECSTART)); //set IVPD,重新定义中断向量表 eventId = RTC_getEventId();//类似于句柄,获取中断向量号 IRQ_clear(eventId);//清除未完成的RTC中断

RTC_setCallback(&addr); // 关联中断事件函数,而不是中断函数

RTC_setPeriodicInterval(RTC_RATE_500ms);//设定周期间断的间隔,每500ms响应一次

IRQ_globalEnable(); //全局使能

RTC_start(); //将rtcinten中的set位清零 sec = RTC_RGET(RTCSEC);//读秒针 while (sec != 0)

{sec = RTC_RGET(RTCSEC);}//从0s开始

RTC_eventEnable(RTC_EVT_PERIODIC);

RTC_eventEnable(RTC_EVT_UPDATE); //中断事件使能

min0 = RTC_RGET(RTCMIN);//读分钟

while (!stop) //让中断发生一分钟/* 等待中断的发生 */ {

while (RTC_FGET(RTCPINTR,UIP) != 0);//UIP位是更新位,为0时,至少244us不会更新,防止发生错误;为1时,再uip位变高后,在244us内会发生更新

min1 = RTC_RGET(RTCMIN);//实时更新的分钟数

if ((min1 - min0) >= 1) {

RTC_eventDisable(RTC_EVT_PERIODIC); //一分钟后禁止中断 RTC_eventDisable(RTC_EVT_UPDATE); stop = 1; } }

printf(\ RTC_stop();

for(;;) {} }

void myPeriodicIsr()//注意,这个地方不是中断,不能用interupt关键字 {

++counterPer;

printf(\interrupt at: %x::%x::%x\\n\HR), min1, RTC_RGET(RTCSEC));

}

void myUpdateIsr() {

++counterUp;

sec = RTC_RGET(RTCSEC);

printf(\ }

实验现象:

5、AD转换实验

本开发板将AD的高基准电压接+3.3V,低基准电压接地。VC5509A所提供的模数转换器一次转换可以再多路输入中任选一路进行采样,采样结果为十位,最高采样速率为21.5kHz.在具体应用中往往需要采集一些模拟信号量,如电池电压和面板旋钮输入值等,AD转换器就是用来将这些模拟量转换为数字量使用。

主要程序为(重要语句已作注释): #include \#include \#include \void InitADC();

void wait( unsigned int cycles ); void EnableAPLL( );

unsigned int nADC0[256],nADC1[256]; main() { int i; unsigned int uWork; EnableAPLL(); SDRAM_init(); InitADC(); PLL_Init(132); while ( 1 ) { for ( i=0;i<256;i++ ) { ADCCTL=0x8000; // 启动AD转换,通道0 1000 0000 0000 0000 do { uWork=ADCDATA;//ADC数据寄存器,首位可判断ADC是否转换结束 } while ( uWork&0x8000 );//按位与 nADC0[i]=uWork&0x0fff;//传送数据到通道0 } for ( i=0;i<256;i++ ) { ADCCTL=0x9000; // 启动AD转换,通道1 1001 0000 0000 0000 do { uWork=ADCDATA; } while ( uWork&0x8000 ); nADC1[i]=uWork&0x0fff; } asm( \ // break point//汇编中的空操作指令 } }

void InitADC()//设定AD时钟 { ADCCLKCTL=0x23; // 4MHz ADCLK,ADC时钟=CPU时钟/(35+1)=4MHz ADCCLKDIV=0x4f00;//ADC时钟分频寄存器0100 1111 0000 0000,决定抽样和保持周期

}

//延时程序

void wait( unsigned int cycles ) {

int i;

for ( i = 0 ; i < cycles ; i++ ){ } }

void EnableAPLL( )//使能时钟发生器 {

/* Enusre DPLL全数字锁相环 is running */

*( ioport volatile unsigned short* )0x1f00 = 4;//ioport //要在程序中访问IO空间地址,必须首先使用ioport关键字对访问的地址进行定义 wait( 25 );

*( ioport volatile unsigned short* )0x1f00 = 0; // MULITPLY

*( ioport volatile unsigned short* )0x1f00 = 0x3000; // COUNT

*( ioport volatile unsigned short* )0x1f00 |= 0x4F8; wait( 25 );

//*( ioport volatile unsigned short* )0x1f00 |= 0x800 // MODE

*( ioport volatile unsigned short* )0x1f00 |= 2; wait( 30000 ); // APLL Select

*( ioport volatile unsigned short* )0x1e80 = 1; // DELAY wait( 60000 ); }

实验结果为:

6、快速傅立叶变换(FFT)实验 本实验为纯软件仿真实验

FF即快速傅里叶变换,解决了DFT运算量太大,在实际使用中受限制的问题,FFT算法分为DIT和DIF两种。本实验中是按时间采样,即DIT。

主要程序为(重要语句已作注释): #include \#include \#include \#include #define PI 3.1415926


课程设计报告(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:首都经济贸易大学处级干部任前公示公告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: