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
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