你(们)好
我已经从piccolo示例文件复制了adcOffsetSelfCal()及其相关函数。 我已将代码转换为使用驱动程序类型HAL而不是结构,并使用代码对单个引脚进行ping抽样。 这在设备设置(包括ADC初始化和校准)后直接调用。
但是,有一个问题:代码在空的while循环中等待ADCINTFLG寄存器的ADCINT1和INT2位的行上,以指示相关中断已被触发。 至少就编译的代码而言,问题的位似乎从未被清除(即执行永远处于while循环中)。
在原始示例中,这些行的编码为:
//等待ADCINT1触发,然后将ADCRESULT0-7寄存器添加到SUM while (AdcRegs.ADCINTFLG.bit.ADCINT1 ==0){}
和:
//等待ADCINT2触发,然后将ADCRESULT8-15寄存器添加到SUM while (AdcRegs.ADCINTFLG.bit.ADCINT2 ==0){}
在我转换的代码中,完整函数如下所示:
UINT_least8_t getValueFromPingPong (无效)
{ uint16_t地址= 0U,I = 0U; ADC_HANDLE adc_init((void *)ADC_base_ADDR, sizeof(SOC_Obj); ADC_Obj * ADC =(ADC_Obj *)adcHandle; ADC_SockNumber_e SoC = ADC_SockNumber_0; 用于(SOC_Obj)<15) ADC= ADC_选择所有ADC* */ ADC_setSocChanNumber (adcHandle,SoC,SENSE ADC_CHANNEL); }/* 选择所有SOC的样本窗口大小。 * 用于(SoC = ADC_SockNumber_0;SoC <= ADC_SockNumber_15;+SoC) { ADC_setSocSampleWindow (adcHandle,SoC,ADC_SockSampleWindow ow_7_Cycles); } /*对乒乓球采样的设置。 */ adc_enableInt (adcHandle,adc_IntNumber_1); adc_enableInt (adcHandle,adc_IntNumber_2); adc_setIntMode (adcHandle, ADC_IntNumber_1,ADC_IntMode_ClearFlag); ADC_setIntMode (adcHandle,ADC_IntNumber_2,ADC_IntMode_ClearFlag); ADC_setIntPulseGenMode (adcHandle,ADC_IntPulseGenMode_Prior); ADC_setIntSrc (adcHandle,ADC_IntNumber_1,ADC_IntSrc_EOC6); ADC_setIntSrc (adcHandle,ADC_IntNumber_2,ADC_IntSrc_EOC14); enable_protected_register_write_mode; ADC->ADCINTSOCSEL1 = 0xAAAU; /*将ADCINT1设置为启动SOC8-15。 */ ADC->ADCINTSOCSEL2 = 0x5555U;/*将ADCINT2设置为启动SOC0-7。 */ disable_protected_register_write_mode; delay_US (ADC_usDELAY); ADC->ADCSOCFRC1 = 0x00FFU;/*强制启动SOC0-7以开始ping-pong采样。 */ UINT32_t SUM = 0U;/*采样。 */ For (I = 0U; I < sense _sample_size; I += 16U){ while ((ADC->ADCINTFLG & 0x01U)== 0U){}//此条件仅在通过For循环 ADC->ADCINTFLGCLR = 0x01U; SUM += ADC->ADCRULT;ESADCULT=<sum->ESADC=ADC=[ADCULT;ESULT>ESADCULT=0;ESADCULT>ADC=<UT>ESADC=+ESADCULT>ESADCULT=<UMP_0; ESADCULT>ADCULT>ADCULT=< SUM += ADC->ADCRESULT[4]; SUM += ADC->ADCRESULT[5]; SUM += ADC->ADCRESULT[6]; /*等待SOC9转换开始,这为SOC7 *转换结果提供了时间。 */ while (ADC->ADCSOCFLG1 & 0x200U){} SUM += ADC->ADCRESULT[7]; while (ADC->ADCINTFLG & 0x02U)== 0U){}//此条件似乎永远不是真 ADC->ADCINTFLGCLR = 0x02U; SUM +=ADCULADC=10>ESULADC;[ADC=ADC10>ESULADC=ADC=ADC=ADC;[SUM=ADC=ADS10>ESULADC;[ADC=ADC=ADCULT]ADC=ADC=ADC=ADCULADC=ADC=ADCULADCULT>ESULADCULT SUM += ADC->ADCRESULT[12]; SUM += ADC->ADCRESULT[13]; SUM += ADC->ADCRESULT[14]; /*等待SOC1转换开始,这为SOC15 *转换结果提供了时间。 */ while (ADC->ADCSOCFLG1 & 0x02U){} SUM += ADC->ADCRESULT[15];} ADC_DisableInt (adcHandle, ADC_IntNumber_1);/* 停止对号采样。 */ ADC_DisableInt (adcHandle,ADC_IntNumber_2); /*计算样本数据的平均值。 */ uint16_t adcConvMEAN =(uint16_t)(sum / sense _sample_size); 返回adcConvMEAN; }
为什么会发生这种情况,我可以采取什么措施来解决这种情况?
意识到我的adcOffsetSelfCal()函数在该函数的前面被调用,并且使用非常相似的代码,但它仍然有效。 主要区别在于SelfCal函数使用ADC B5,B5连接到VREFFLO。
谢谢,T