19,502
社区成员
发帖
与我相关
我的任务
分享
v_pADCPregs->ADCCON|=0x1;
,这一位的作用是有一次,意思是说每次中断一次来临后都要去开启它。DWORD WINAPI AdcThread (PVOID hdcMain)
{
DWORD hstatus;
//int preScaler = S3C6410_PCLK/ADC_FREQ -1;
//Delay(10);
RETAILMSG(1,(TEXT("adcchoose = %d\n"), adc_flag));
//v_pADCPregs->ADCCLRINT=1;//清除ADC中断
//g_pVIC1Reg->VICINTENABLE=0<<30;//屏蔽触摸屏中断
//RETAILMSG(1,(TEXT("is Interrupt = %o\n"), g_pVIC1Reg->VICIRQSTATUS));
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &ADCIRQ, sizeof ADCIRQ, &ADCSysIntr, sizeof ADCSysIntr, NULL))
{
RETAILMSG(1, (TEXT("ADC: Error! Failed to request sysintr value for ADC interrupt.\r\n")));
}
//关联SYSINTR和之前创建的事件
if (!(InterruptInitialize(ADCSysIntr, hAdcReadEvent, 0, 0)))
{
RETAILMSG(1, (TEXT("ERROR: ADC: Interrupt initialize failed.\r\n")));
}
while(g_ExitThread)
{
hstatus=WaitForSingleObject(hAdcReadEvent, INFINITE);
if (hstatus == WAIT_OBJECT_0)
{
switch (adc_flag)//adc_flag是从应用层传过来的
{
RETAILMSG(1,(TEXT("In the thread adcchoose = %d\n"), adc_flag));
case 1:
{
//v_pADCPregs->ADCDAT0=0;
////v_pADCPregs->ADCCON = (1<<14)|(preScaler<<6)|(1<<3); //channel 1
//v_pADCPregs->ADCCON|=0x1; //start ADC
//while(v_pADCPregs->ADCCON & 0x1); //check if Enable_start is low
if (i<1000)
{
buff[i] = (int)v_pADCPregs->ADCDAT0 & 0x3ff;//低十位有效
i++;
}
else
{
i=0;
SetEvent(hAdcEvent);
// Sleep(1);
}
/* i=0;
SetEvent(hAdcEvent);
Sleep(1);*/
//while(!(v_pADCPregs->ADCCON & 0x8000)); //check if EC(End of Conversion) flag is high
//g_convertervalue = (int)v_pADCPregs->ADCDAT0 & 0x3ff;//低十位有效
//RETAILMSG(1,(TEXT("TransAD1 = %d\n"), g_convertervalue));
//SetEvent(hAdcEvent);//通知应用层.AD转换已经就绪
break;
}
case 2:
{
v_pADCPregs->ADCDAT0=0;
//v_pADCPregs->ADCCON = (1<<14)|(preScaler<<6)|(1<<4); //channel 1
v_pADCPregs->ADCCON|=0x1; //start ADC
while(v_pADCPregs->ADCCON & 0x1); //check if Enable_start is low
if (i<1000)
{
buff[i] = (int)v_pADCPregs->ADCDAT0 & 0x3ff;//低十位有效
i++;
}
else
{
i=0;
SetEvent(hAdcEvent);
// Sleep(1);
}
//while(!(v_pADCPregs->ADCCON & 0x8000)); //check if EC(End of Conversion) flag is high
//g_convertervalue = (int)v_pADCPregs->ADCDAT0 & 0x3ff;//低十位有效
//RETAILMSG(1,(TEXT("TransAD2 = %d\n"), g_convertervalue));
//SetEvent(hAdcEvent);//通知应用层.AD转换已经就绪
break;
}
}//switch
InterruptDone(ADCSysIntr);
//SetEvent(hAdcEvent);
}//if status
}//while
InterruptDisable(ADCSysIntr); //取消Event与ADCSysIntr之间的关联
KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&ADCSysIntr,sizeof(UINT32),NULL,0, NULL);
return 0;
}