⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f2812adc_double.c

📁 TMS320F281X DSP ADC程序设计
💻 C
字号:
//###########################################################################
//
// 文件名称:	F2812ADC_double.c
//
// 功能描述:	DSP28 ADC - 测量两个模拟输入电压, 
//			    每个0.1sec由通用定时器1出发一次ADC转换;
//			    看门狗使能,在主函数循环以及ADC的中断服务程序中处理
//
//###########################################################################

#include "DSP281x_Device.h"
// 函数原型声明.

void Gpio_select(void);
void InitSystem(void);    
interrupt void adc_isr(void);	// ADC结果读取中断服务程序
 
// 全局变量:

int Voltage_A0;
int Voltage_B0;
int ADresult_num = 0;
int ADC_buffer1[512]={0};    
int ADC_buffer2[512]={0};  
void main(void)
{
	unsigned long i;
	InitSystem();		// 初始化DSP内核寄存器
	
	Gpio_select();		// 配置GPIO复用寄存器      
	
    InitPieCtrl();		// 调用外设中断扩展初始化单元 PIE-unit ( 代码 : DSP281x_PieCtrl.c)
	
	InitPieVectTable(); // 初始化 PIE vector向量表  ( 代码 : DSP281x_PieVect.c )
	 
	InitAdc();			// Function call for basic ADC initialisation

	// 重新映射 PIE -  Timer 1的比较中断 
	EALLOW;  // 解除寄存器保护
   	PieVectTable.ADCINT = &adc_isr;
   	EDIS;    // 使能寄存器保护
	   
    // 使能ADC中断: PIE-Group1 , interrupt 6
	PieCtrlRegs.PIEIER1.bit.INTx6 = 1;	                    
	
	// 使能 CPU INT1 (连接到CPU-Timer 0中断) 
    IER = 1;
    
    // 全局中断使能和更高优先级的实时调试事件
   	EINT;   // 全局中断使能INTM
   	ERTM;   // 使能实时调试中断DBGM
   	 
   	// 配置 ADC
   	AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;	   // 双排序器模式
   	AdcRegs.ADCTRL1.bit.CONT_RUN = 0;	   // 非连续运行
   	AdcRegs.ADCTRL1.bit.CPS = 0;		   // 预定标系数 = 1	
   	AdcRegs.ADCMAXCONV.all = 0x0001;       // SEQ1中设置2个转换
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 设置ADCINA0作为第一个SEQ1变换// 假定在系统初始化中EVA的时钟已经被使能
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8; // 设置ADCINB0作为第二个SEQ1变换.//由T1/T2逻辑驱动 T1PWM / T2PWM
   	AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;  // 使能EVASOC启动SEQ1 // GP Timer 1 比较的输出的有效
	AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // 使能SEQ1中断(每次 EOEvaRegs.GPTCONA.bit.T1PIN = 1);
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 2;	   // HSPCLK进行4分频

  	// 配置事件管理器 EVA
    // Assumes EVA Clock is already enabled in InitSysCtrl();
    // 禁止 T1PWM / T2PWM 输出
    EvaRegs.GPTCONA.bit.TCMPOE = 0;
   	// GP Timer 1 比较输出强制为低
	EvaRegs.GPTCONA.bit.T1PIN = 0;
	EvaRegs.GPTCONA.bit.T1TOADC = 2;       // 使能事件管理器A的EVASOC
	
	
	EvaRegs.T1CON.bit.FREE = 0;				// 仿真器连接处理器时模块处于挂起状态
    EvaRegs.T1CON.bit.SOFT = 0;				// 仿真器连接处理器时模块处于挂起状态
    EvaRegs.T1CON.bit.TMODE = 2;			// 连续递增模式
    EvaRegs.T1CON.bit.TPS = 7;				// 预定标系数 = 128
    EvaRegs.T1CON.bit.TENABLE = 1;			// 使能 GP Timer 1 
   	EvaRegs.T1CON.bit.TCLKS10 = 0;			// 内部时钟
   	EvaRegs.T1CON.bit.TCLD10 = 0;			// 当等于0时比较重新装载
   	EvaRegs.T1CON.bit.TECMPR = 0;			// 禁止比较操作
                                         	
   	EvaRegs.T1PR = 58594;     

   	while(1)
	{    
  	    for(i=0;i<1500000;i++)
  	    {
  	    EALLOW;
    	SysCtrlRegs.WDKEY = 0xAA;				
	    EDIS;
    	}
     }
} 		
   


   
void Gpio_select(void)
{
	EALLOW;
	GpioMuxRegs.GPAMUX.all = 0x0;	// 所有 GPIO 端口配置为I/O
    GpioMuxRegs.GPBMUX.all = 0x0;   
    GpioMuxRegs.GPDMUX.all = 0x0;
    GpioMuxRegs.GPFMUX.all = 0x0;		 
    GpioMuxRegs.GPEMUX.all = 0x0; 
    GpioMuxRegs.GPGMUX.all = 0x0;			
										
    GpioMuxRegs.GPADIR.all = 0x0;	  // GPIO PORT   配置为输入
    GpioMuxRegs.GPBDIR.all = 0x00;    // GPIO PORT   配置为输入
    GpioMuxRegs.GPDDIR.all = 0x0;	  // GPIO PORT   配置为输入
    GpioMuxRegs.GPEDIR.all = 0x0;	  // GPIO PORT   配置为输入
    GpioMuxRegs.GPFDIR.all = 0x0;	  // GPIO PORT   配置为输入
    GpioMuxRegs.GPGDIR.all = 0x0;	  // GPIO PORT   配置为输入

    GpioMuxRegs.GPAQUAL.all = 0x0;	  // 设置所有 GPIO 输入的量化值等于0
    GpioMuxRegs.GPBQUAL.all = 0x0;
    GpioMuxRegs.GPDQUAL.all = 0x0;
    GpioMuxRegs.GPEQUAL.all = 0x0;
    EDIS;
}     


void InitSystem(void)
{
   	EALLOW;
   	SysCtrlRegs.WDCR= 0x00AF;		// 配置看门狗 
   									// 0x00E8  禁止看门狗,预定标系数Prescaler = 1
   									// 0x00AF  不禁止看门狗, 预定标系数Prescaler = 64
   	SysCtrlRegs.SCSR = 0; 			// 看门狗产生复位	
   	SysCtrlRegs.PLLCR.bit.DIV = 10;	// 配置处理器锁相环,倍频系数为5
    
   	SysCtrlRegs.HISPCP.all = 0x1;   // 配置高速外设时钟分频系数: 2
   	SysCtrlRegs.LOSPCP.all = 0x2;   // 配置低速外设时钟分频系数: 4
      	
   	// 使用的外设时钟时钟设置:
   	// 一般不使用的外设的时钟禁止,降低系统功耗   
   	SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
   	SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; // 使能SCI模块的时钟
   	SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
   	EDIS;
}

       
interrupt void adc_isr(void)  
{
   	// 每次定时器中断处理看门狗
   	EALLOW;
	SysCtrlRegs.WDKEY = 0x55;	
	EDIS;  
  //采样结果保存  
  Voltage_A0 = AdcRegs.ADCRESULT0>>4;
  Voltage_B0 = AdcRegs.ADCRESULT1>>4;
  if(ADresult_num<512)
  {
      ADresult_num++;
      ADC_buffer1[ADresult_num] = Voltage_A0;
      ADC_buffer2[ADresult_num] = Voltage_B0; 
  }
  else{ADresult_num = 0; }
  // 为下一个ADC排序重新初始化
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // 复位 SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;		// 清除 INT SEQ1 位
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // 中断响应位置位
  }          
//===========================================================================
// 代码结束
//===========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -