急!来贵吧问一个F2812ADC中断的问题,希望高手现身指导!
dsp吧
全部回复
仅看楼主
level 1
戈24 楼主
我们这学期做了一个AD转换的实验,程序如下:
#include <math.h>
#include "DSP28_Device.h"
#include "comm.h"
///////////////////////////////////////////////////////////////////
#define SAMPLERATE 2
unsigned int SampleRate;
unsigned int SampleLong=1024;
///////////////////
unsigned int i,j;
unsigned int Ad_data[1536]={0};
//////////////////
unsigned int convcount = 0;
volatile unsigned int adconvover =0;
// Prototype statements for functions found within this file.
interrupt void ISRTimer2(void);
interrupt void ad(void);
/*****************************************************************************/
void main(void){
/*初始化系统*/
InitSysCtrl();
#if SAMPLERATE==1
SampleRate =ADSAMPL8K;
#endif
#if SAMPLERATE==2
SampleRate =ADSAMPL44K;
#endif
#if SAMPLERATE==3
SampleRate =ADSAMPL96K;
#endif
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
//初始化cputimer
InitCpuTimers();
/*设置中断服务程序入口地址*/
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT2=&ISRTimer2;
PieVectTable.ADCINT=&ad; //补充语句,设置中断服务程序入口地址
EDIS; // This is needed to disable write to EALLOW protected registers
/*开中断*/
IER |= M_INT1;//ADC中断
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
/*启动AD采样*/
/*AD采样率*/
adconvover=0;
switch( SampleRate){
case ADSAMPL8K: //采样率为8k
DINT;
/*设置CPU*/
ConfigCpuTimer(&CpuTimer2, 150, 125);
StartCpuTimer2();
/*开中断*/
IER |= M_INT14;
EINT;
InitAdc();
SampleRate = 0;
break;
case ADSAMPL44K: //采样率为44k
DINT;
/*设置CPU*/
ConfigCpuTimer(&CpuTimer2, 150, 22);
StartCpuTimer2();
/*开中断*/
IER |= M_INT14;
EINT;
InitAdc();
SampleRate = 0;
break;
case ADSAMPL96K: //采样率为96k
DINT;
/*设置CPU*/
ConfigCpuTimer(&CpuTimer2, 150, 10);
StartCpuTimer2();
/*开中断*/
IER |= M_INT14;
EINT;
InitAdc96k();
SampleRate = 0;
break;
default:
break;
}
for(;;){
if (adconvover==1){
adconvover=0;
}
}
}
interrupt void ad(void)
{
IFR=0x0000; //设置中断标志寄存器值
PieCtrl.PIEACK.all=0xffff; //设定PIE级中断应答寄存器值
if(adconvover==0){
Ad_data[convcount]=AdcRegs.RESULT0;
convcount++; //补充语句,读取AD转换结果
}
if (convcount==(SampleLong))
{
convcount=0;
adconvover=1; //补充语句,完成停止计数操作并设置接满标志
}
}
interrupt void ISRTimer2(void)
{
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
}
//===========================================================================
// No more.
//===================
我的问题来了,请问interrupt void ad(void)这个AD中断是怎么触发的?
2014年06月21日 14点06分 1
level 11
ad采样的中断一般是序列发生器启动一次转换就进去中断
2014年06月23日 00点06分 2
level 10
cputimer2中断里的AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;这句话就是启动转换序列,ad采样完成就产生ad中断信号。
2014年06月23日 02点06分 3
1