UINT16 abcBuff[12] = {0}; UINT8 adclen = 0; GPIOA_ModeCfg(GPIO_Pin_4,GPIO_ModeIN_Floating); int16_t ADC_Key(void) { UINT8 i = 0; UINT16 AdcValue=0; ADC_ExtSingleChSampInit(SampleFreq_3_2,ADC_PGA_0); ADC_ChannelCfg( 0 ); adclen = 0; // for( i = 0; i < 12; i++ ) // { // abcBuff[i] = ADC_ExcutSingleConver(); // 连续采样20次 // } ADC_ClearITFlag(); PFIC_EnableIRQ( ADC_IRQn ); ADC_StartUp(); while( adclen < 12 ) ; PFIC_DisableIRQ( ADC_IRQn ); for( i = 2; i < 12; i++ ) AdcValue += abcBuff[i]; AdcValue /= 10; return AdcValue; } __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void ADC_IRQHandler( void ) //adc中断服务程序 { if( ADC_GetITStatus() ) { ADC_ClearITFlag(); if( adclen < 12 ) { abcBuff[adclen] = ADC_ReadConverValue(); ADC_StartUp(); // 作用清除中断标志并开启新一轮采样 } adclen++; } }
这是ADC部分的代码,如果不用中断是可以正常的,用中断的话经过调试发现会卡在如图所示地方
但是不用中断的话,测量时有时AD值会突然变成4095,麻烦帮忙看一下