DSP28335 ADC程序 中文说明

  • 格式:docx
  • 大小:16.90 KB
  • 文档页数:3

* 例程功能:利用中断定时器每隔一秒钟,从DSP28335的A0、A1口接收模拟信号,并转换为数字信号存放在SampleTable1,SampleTable2中。

*

*/

#include "DSP2833x_Device.h" // DSP2833x头文件

#include "DSP2833x_Examples.h" // DSP2833x Examples Include File

// ADC启动参数

#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT

#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 =

150/(2*3) = 25.0 MHz

#endif

#if (CPU_FRQ_100MHZ)

#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 =

100/(2*2) = 25.0 MHz

#endif

#define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS =

25.0MHz/(1*2) = 12.5MHz

#define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC

clocks

#define PIEACK_GROUP1 0x0001

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; // HSPCLK =

SYSCLKOUT/ADC_MODCLK,ADC工作的标准频率

EDIS;

// 步骤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; // 设置采集窗的大小。该控制位控制SOC脉冲的宽度,SOC脉冲信号的宽度等于 ADCLK周期 *(ADC_SHCLK+1)

AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; // 核心时钟分频。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; // 设置ADCINA1作为第一个变换

AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x1; // 最大采集通道

// 第5步。用户特定的代码,启用中断:

EINT; // 启用全局中断INTM

ERTM; // 启用全局实时中断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组中断ACKnowlwdge寄存器,对其全部清除,不接受其它中断

CpuTimer0Regs.TCR.bit.TIF=1; //定时到了指定时间,标志位置位,清除标志

CpuTimer0Regs.TCR.bit.TRB=1; //重载Timer0的定时数据

}