logo资料库

DSP28335-ADC程序-中文说明.docx

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
* 例程功能:利用中断定时器每隔一秒钟,从DSP28335的A0、A1口接收模拟信号,并转 换为数字信号存放在SampleTable1,SampleTable2中。 * */ #include "DSP2833x_Device.h" #include "DSP2833x_Examples.h" // DSP2833x头文件 // DSP2833x Examples Include File #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) // Default - 150 MHz SYSCLKOUT // ADC启动参数 #if (CPU_FRQ_150MHZ) #endif #if (CPU_FRQ_100MHZ) = 25.0 MHz = 25.0 MHz #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) #endif #define ADC_CKPS 0x1 #define ADC_SHCLK 0xf #define PIEACK_GROUP1 0x0001 // ADC module clock = HSPCLK/2*ADC_CKPS 25.0MHz/(1*2) = 12.5MHz = // S/H width in ADC module periods = 16 ADC clocks interrupt void ISRTimer0(void); int SampleTable1=0,SampleTable2=0; int count,count1,count2; main() { // 步骤1.初始化系统控制:PLL,WatchDog,启用外设时钟该示例函数可在 DSP2833x_SysCtrl.c文件中找到。 InitSysCtrl(); // ADC工作时钟设置: EALLOW; SysCtrlRegs.HISPCP.all = ADC_MODCLK; EDIS; // HSPCLK = SYSCLKOUT/ADC_MODCLK,ADC工作的 标准频率 // 步骤2.初始化GPIO:该示例函数位于DSP2833x_Gpio.c文件中,并说明如何将GPIO设 置为默认状态。 // InitGpio(); // 在这个例子中被跳过 // 第3步。清除所有中断并初始化PIE矢量表:禁用CPU中断
DINT; // 初始化PIE控制寄存器为默认状态。默认状态是禁止所有的PIE中断并清除标志。 // 这个函数可以在DSP2833x_PieCtrl.c文件中找到。 InitPieCtrl(); // 禁用CPU中断并清除所有CPU中断标志: IER = 0x0000; IFR = 0x0000; // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // 这将填充整个表,即使在这个例子中没有使用中断。 这对于调试目的很有用。 // The shell ISR routines are found in DSP2833x_DefaultIsr.c. // 该函数在DSP2833x_PieVect.c中找到。 InitPieVectTable(); EALLOW; PieVectTable.TINT0=&ISRTimer0; // 告诉定时器0的中断地址为中断向量表的 INT0 EDIS; InitCpuTimers(); ConfigCpuTimer(&CpuTimer0,150,1000000); StartCpuTimer0(); //CPU第一组中断将会产生,并使能第一组中断的第七个小中断 IER|=M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7=1; // 步骤4.初始化所有器件外设:此功能可在DSP2833x_InitPeripherals.c中找到 InitAdc(); //ADC初始化设置 // ADC工作方式设置: AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; // 设置采集窗的大小。该控制位 控制SOC脉冲的宽度,SOC脉冲信 号的宽度等于 ADCLK周期 * (ADC_SHCLK+1) // 核心时钟分频。ADC模块时钟 = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; AdcRegs.ADCTRL1.bit.CONT_RUN = 1; AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 建立级联序列方式 // 读取完转换序列后停止 // 使能排序覆盖 // 设置ADCINA0作为第一个变换
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x1; // 最大采集通道 // 设置ADCINA1作为第一个变换 // 第5步。用户特定的代码,启用中断: EINT; ERTM; // 启用全局中断INTM // 启用全局实时中断DBGM AdcRegs.ADCTRL2.all = 0x2000; // 启动SEQ1 } interrupt void ISRTimer0(void) { while (AdcRegs.ADCST.bit.INT_SEQ1==0) {} // 等待中断 AdcRegs.ADCTRL3.bit.SMODE_SEL = 1; AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //向该位写1,清除SEQ1中断标志 //设置同步采样模式 位 SampleTable1=((AdcRegs.ADCRESULT0>>4)); //取A0数据并记录在 SampleTable1数组中 SampleTable2=((AdcRegs.ADCRESULT1>>4)); //取A1数据并记录在 SampleTable2数组中 PieCtrlRegs.PIEACK.all=PIEACK_GROUP1; //0x0001赋给12组中断 CpuTimer0Regs.TCR.bit.TIF=1; //定时到了指定时间,标志位置位,清除标 CpuTimer0Regs.TCR.bit.TRB=1; //重载Timer0的定时数据 志 ACKnowlwdge寄存器,对其全 部清除,不接受其它中断 }
分享到:
收藏