请教一下CH573为什么ADC中断用不了
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部分的代码,如果不用中断是可以正常的,用中断的话经过调试发现会卡在如图所示地方

10.png

但是不用中断的话,测量时有时AD值会突然变成4095,麻烦帮忙看一下

用volatile修饰adclen试试看呢,

关于不用中断测量时突然变成4095可以把你的现象描述的更具体一点,是在外部输入电压没变时,突然变成4095嘛,可以加上测试结果和说明看看。


我用volatile修饰了adclen中断还是用不了,

是ADC通道1外接的是一个热敏温度传感器,就是比如正常温度AD值是2000多,有时AD值会突然变成4095,然后就恢复正常了,不知道是没用ADC中断的问题还是线路的问题,我已经先做了均值滤波,然后12个数据升序排列,去中间四组数再取平均值还是会出现这种情况。


加上volatile应该就可以了,这边我只看你写了一个函数,主函数里面具体是如何写的,跟我们的例程保持一致就是可以用的,

emobile_2022-04-07_10-40-35.png

如果依然不可以,那么就加点打印,看看有没有进中断,如果进了中断,又使用volatile修饰,那么程序就不会卡在那个while。


您好,经过测试我这边程序好像确实没有进中断,请问这可能是什么原因造成的呢


icon_rar.gif573_adc_interrupt_1.7.hex.zip

可以尝试使用这个固件是否可以,

如果的确进去不了中断,可以查看是否打开了dma,如果打开了,将其关闭,仍无法进入可将工程发到hy@wch.cn,帮你看下。


while循环有问题,我把while( adclen < 12 )换成delay延时中断就可以正常进了


只有登录才能回复,可以选择微信账号登录