自己已经写出来,如下,给后来者参考,如有不对,请指出!
//中断程序
void __irq IRQ_AD(void)
{
// while( ( ADDR & 0x80000000 ) == 0 );
ADC_Data1 = ADDR; // 读取ADC结果
ADC_Data2 = ( ADC_Data1>>6 ) & 0x3FF; // 提取AD转换值//
ADC_Data_Use=ADC_Data2;
/*if(ADC_Data_Use<50)
LED1_LOW_P020;
else
LED1_HIGHT_P020;*/
Uint8_AD_finish=1;
//ADC_Data_Use=ADC_Data2;
/*Max5306_Output(CH1,(ADC_Data_Use<<1));
{
if(uint8_flag==1)
{
LED3_HIGHT_P018;
uint8_flag=0;
}
else
{
uint8_flag=1;
LED3_LOW_P018;
}
AD_Time=0;
}
*/
ADCR |=(1<<24)| 0x01 ; //重新开开始转换
VICVectAddr = 0;// 中断结束
}
//初始化函数
void IntADInitialization(void)
{
//uint32 tmp1;
#if 0 // 复位即AD态
PINSEL1 = ( PINSEL1 & 0xFF3FFFFF ) | ( 0x01 << AD0 ); // P0.27 设为AD0口
PINSEL2 = ( PINSEL2 & 0xFFFFFFCF ) | ( 0x03 << 4); // 设置PINSEL[5:4]为11
PINSEL2 = ( PINSEL2 & 0xFF9FFF3F ) | ( 0x01 << AD4 ) | ( 0x01 << AD5 ) | ( 0x01 << AD6 ) |( 0x01 << AD7 );
#endif
PINSEL1 |= (1<<22) | (1<<24) | (1<<26) |(1<<28); //
/* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */
ADCR = (1<<0) | // SEL = 1 ,选择通道0
(((Fpclk /500000 - 1)) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
(0 << 16) | // BURST = 0 ,软件控制转换操作
(0 << 17) | // CLKS = 0 ,使用11clock转换
(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)
(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)
(1 << 24) | // START = 1 ,直接启动ADC转换
(0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
DelayNS(10);
ADDataA = ADDR; // 读取ADC结果,并清除DONE标志位
}
int main(void)
{
uint8 i;
uint8 data_buf[10],data_buf1[10];
// 中断分配与使能设置
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl1= (0x20|4); // // 定时器0
VICVectAddr1 = (uint32)IRQ_Time0; // 设置定时器0向量地址
VICVectCntl0 = (0x20|6); // 将UART0放到VICVectCntl0里面将其中断设置为最高。
VICVectAddr0 = (uint32)UART0_Exception; // 设置UART0向量地址
VICVectCntl2 = (0x20|7); // UART1
VICVectAddr2 = (uint32)UART1_Exception; // 设置UART1向量地址
VICVectCntl3 = (0x20|18);
VICVectAddr3 = (uint32)IRQ_AD;
/*
VICVectCntl3 = (0x20|17); // EINT3
VICVectAddr3 = (uint32)IRQ_Eint3; // 设置外部中断3 int
*/
EXTMODE = 0x00; // 设置EINT3中断为电平触发模式
EXTPOLAR = 0x0f; // EINT3高电平触发
EXTINT = 1<<3; // 清除EINT3中断标志
VICIntEnable = (/*(1<<4)|(1<<6)|(1<<7)|(1<<9)|*/(1<<18)/*|(1<<17)*/); // 使能Timer0 使能UART0,UART1,T0中断 EINT3
//-------------------------------------------------------------------------------------------------//
/****************************************系统相关初始化***************************************/
IntADInitialization(); // AD Initialize
ADCR = ( ADCR & 0x003EFF00 ) | CH1 | ( 1 << 24 ); // 设置第Channel通道,并进行第一次转换
while(1)
{
/*
adi++;
if(adi <=6)
{
Pos_ad = IntADSimple(AD0);
Pos_Sum+= Pos_ad;
}
else
{
/////////////////////////////
adi=0;
// Pos_Avg= Pos_Sum/12;
Pos_Avg=Pos_Sum<<1;//(6240=12*520)
Max5306_Output(CH2,Pos_Avg);//平均值滤波
Pos_Sum=0;
}*/
// Max5306_Output(CH1,(ADC_Data_Use<<1));
ADC_Data_Use=ADC_Data2;
if(Uint8_AD_finish==1)
{
Max5306_Output(CH1,(ADC_Data_Use<<2));
Uint8_AD_finish=0;
}
|