請教一下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();??????//?連續(xù)采樣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中斷服務(wù)程序
{
??if(?ADC_GetITStatus()?)
??{
????ADC_ClearITFlag();
????if(?adclen?<?12?)
????{
??????abcBuff[adclen]?=?ADC_ReadConverValue();
??????ADC_StartUp();????????????????//?作用清除中斷標志并開啟新一輪采樣
????}
????adclen++;
??}
}

這是ADC部分的代碼,如果不用中斷是可以正常的,用中斷的話經(jīng)過調(diào)試發(fā)現(xiàn)會卡在如圖所示地方

10.png

但是不用中斷的話,測量時有時AD值會突然變成4095,麻煩幫忙看一下

用volatile修飾adclen試試看呢,

關(guān)于不用中斷測量時突然變成4095可以把你的現(xiàn)象描述的更具體一點,是在外部輸入電壓沒變時,突然變成4095嘛,可以加上測試結(jié)果和說明看看。


我用volatile修飾了adclen中斷還是用不了,

是ADC通道1外接的是一個熱敏溫度傳感器,就是比如正常溫度AD值是2000多,有時AD值會突然變成4095,然后就恢復(fù)正常了,不知道是沒用ADC中斷的問題還是線路的問題,我已經(jīng)先做了均值濾波,然后12個數(shù)據(jù)升序排列,去中間四組數(shù)再取平均值還是會出現(xiàn)這種情況。


加上volatile應(yīng)該就可以了,這邊我只看你寫了一個函數(shù),主函數(shù)里面具體是如何寫的,跟我們的例程保持一致就是可以用的,

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

如果依然不可以,那么就加點打印,看看有沒有進中斷,如果進了中斷,又使用volatile修飾,那么程序就不會卡在那個while。


您好,經(jīng)過測試我這邊程序好像確實沒有進中斷,請問這可能是什么原因造成的呢


icon_rar.gif573_adc_interrupt_1.7.hex.zip

可以嘗試使用這個固件是否可以,

如果的確進去不了中斷,可以查看是否打開了dma,如果打開了,將其關(guān)閉,仍無法進入可將工程發(fā)到hy@wch.cn,幫你看下。


while循環(huán)有問題,我把while(?adclen?<?12?)換成delay延時中斷就可以正常進了


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频