* 例程功能:利用中断定时器每隔一秒钟,从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寄存器,对其全
部清除,不接受其它中断
}