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

📄 adc.c

📁 在LPC2368上实现的FFT程序
💻 C
字号:
/*****************************************************************************
 *   adc.c:  ADC module file for NXP LPC23xx Family Microprocessors
 *
 *   Copyright(C) 2006, NXP Semiconductor
 *   All rights reserved.
 *
 *   History
 *   2006.08.15  ver 1.00    Prelimnary version, first Release
 *
******************************************************************************/
#include "LPC23xx.h"                        /* LPC23xx definitions */
#include "irq.h"
#include "adc.h"
#include "GPIO.h"
#include "Hardware.h"

unsigned short ADC0IntDone = 0;
unsigned long ADC0VAL_H=0;
unsigned long ADC0VAL_L=0;

unsigned long regVal=0;
unsigned long Cap_Done=0;
unsigned char time_1S=0;
unsigned long Cap_Count=0;
unsigned short ADC_Count=0;
unsigned short x_Input[2050];


void GPIOHandler (void) __irq
{
   //IENABLE;			//handles nested interrupt 
   if(IO0_INT_STAT_F&P0_0_INTRRUPT)
   {
      	IO0_INT_CLR=P0_0_INTRRUPT;
	 	//读取AD数据
		FIO_Clr(PORT1,AD_CS_P1_8 );   
		FIO_Set(PORT1,AD_CE_P1_9 );
		FIO_Set(PORT1,AD_RC_P1_1 );

		ADC0VAL_L=((FIO1PIN>>14)&0x000F);	 //低4位
		ADC0VAL_H=(FIO0PINL&0x00000FF0);    //高8位
	   	x_Input[ADC_Count++]=(ADC0VAL_H|ADC0VAL_L);

		if(ADC_Count>=2048)
		{
			ADC_Count=0;
			T0TCR=0;
		   	ADC0IntDone =1; 
		}
		 		FIO_Set(PORT1,AD_CS_P1_8 );  
		FIO_Clr(PORT1,AD_CE_P1_9 ); 

   }
   //IDISABLE;
   VICVectAddr = 0;		// Acknowledge Interrupt 
} 
void Gpio_Interrupt_Init()
{
   IO0_INT_EN_F = P0_0_INTRRUPT;
   install_irq( EINT3_INT, (void *)GPIOHandler, 1) ;
}


void Timer0Handler (void) __irq 
{  

    T0IR = 1;			// clear interrupt flag
	
	//启动一次AD转换
	FIO_Clr(PORT1,AD_CS_P1_8 ); 
	FIO_Clr(PORT1,AD_RC_P1_1 );  
	FIO_Clr(PORT1,AD_A0_P1_4 );  
	FIO_Set(PORT1,AD_CE_P1_9 );
	FIO_Set(PORT1,AD_RC_P1_1 ); 
	FIO_Set(PORT1,AD_CS_P1_8 );  
	FIO_Clr(PORT1,AD_CE_P1_9 );

    VICVectAddr = 0;		// Acknowledge Interrupt 
}
void init_Time0()
{
	PINSEL3|=0x0f000000;  //P1.28,P1_29 
	//PCLKSEL0=0x00000004;//使得PCLK=CCLK=72M
	T0CTCR=0;		//工作在定时器模式
	T0PR=0x0;      //把PCLK六分频
	T0MCR=0x00000003;  //选择Mat0。0 和Mat0。1工作在复位方式
	T0MR0=0x0000036F;    
	T0EMR=0x000000f0; //发生反转
	install_irq( TIMER0_INT, (void *)Timer0Handler, 0 ) ;
	T0TCR=0;
}
void Start_Time0()
{
	 T0TCR=1;
}
void Stop_Time0()
{
	T0TCR=0;
}

void Timer1_Handler(void) __irq
{
	//IENABLE;
	regVal=T1IR;							// 清除CAP1.0中断标志
	if(regVal&CAP1_1_INT)
	{
		T1IR|=CAP1_1_INT;
		if (!Cap_Done)
		{
			T1TC = 0;
			Cap_Done = 1;
		}
		else
		{
			Cap_Count = T1TC;
			Cap_Done = 2;
		}
	}
	
	if(regVal&MCR_INT)
	{
		time_1S=1;
		T1IR|=MCR_INT;	
	}	 
	//IDISABLE;
    VICVectAddr = 0x00;						// 向量中断处理结束
}

void init_Timer1()
{
	time_1S=0;
	Cap_Done=0;
   	T1TCR=0;  					//定时器1禁能
	T1PR=0x05;      			//把PCLK六分频,f=3M
  	T1MR0 = 3000000/2;			//0.5s
	T1MCR = 3;

   	T1CTCR=0; 					
   	T1CCR=0x0030;			    //zaiCAP1_1产生一个下降沿的装载中断
   	install_irq( TIMER1_INT, (void *)Timer1_Handler, 3 );
	T1TC=0;
}

void Start_Time1()
{
	Cap_Count=0;
	time_1S=0;
	VICIntEnable = 1 <<TIMER1_INT;	/* Enable Interrupt */
	T1TC=0;
	T1TCR=1;
}
void Stop_Time1()
{
	VICIntEnClr = 1 << TIMER1_INT;
	T1TCR=0;
	time_1S=1;
}

⌨️ 快捷键说明

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