📄 adc.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 + -