標(biāo)題: STM32單片機(jī)一進(jìn)外部中斷就卡死,大佬幫我看下什么原因 [打印本頁]

作者: sssssda    時間: 2021-10-25 10:00
標(biāo)題: STM32單片機(jī)一進(jìn)外部中斷就卡死,大佬幫我看下什么原因
主程序 time,time2,time3由TIM1定時器提供時鐘,Sys提供延時函數(shù),TIM3提供PWM(兩路)



void EXTI4_IRQHandler(void)
{   
    if(EXTI_GetITStatus(EXTI_Line4)!=RESET)//不等于低電平就是1,按下的時候就不為1了
        {
            Delay_ms(10);
            if(Menu==1)
            {
                Menu=2;
            }else if(Menu==2)
            {
                Menu=1;
            }
            EXTI_ClearITPendingBit(EXTI_Line4);  //清理標(biāo)志位
        }
}

void EXTI9_5_IRQHandler(void)
{
    char keytemp=0x55;
    /*keytemp&0X0F 表示只取末尾四位為有效值*/
    /*0x0F 表示采樣四次IO為高電平  表示IO狀態(tài)穩(wěn)定在高電平*/
    /*0x00 表示采樣四次IO為低電平  表示IO狀態(tài)穩(wěn)定在低電平*/
    while(((keytemp&0X0F)!=0x0F)&&((keytemp&0X0F)!=0x00))
    {
        /*間隔1us后采集*/
         Delay_us(1);
        /*按鍵緩存器左移一位*/
        keytemp<<=1;
        /*當(dāng)脈沖腳為高時 或稱為A相*/
        if(knob1_clk== 1)
        {
            /*按鍵緩存器末尾補(bǔ)1*/
            keytemp |= 0x01;
        }
    }
        if(Menu==2)
    {
    if(knob1_clk==1)
    {
        if(knob1_dt==1)
        {
            Mode_Sv=Mode_Sv+5;    /*A上升沿時 B為高 順時針*/
        }
        else
        {
            Mode_Sv=Mode_Sv-5;    /*A上升沿時 B為低 逆時針*/
        }
    }else{
        if(knob1_dt==0)
        {
            Mode_Sv=Mode_Sv+5;    /*A下降沿時 B為低 順時針*/
        }
        else
        {
            Mode_Sv=Mode_Sv-5;    /*A下降沿時 B為高 逆時針*/
        }        
    }
    }   
    EXTI_ClearITPendingBit(EXTI_Line6);  //清除LINE6上的中斷標(biāo)志位
}







作者: sssssda    時間: 2021-10-25 10:01
下面是主程序
        while(1)       
        {               
                if ( time >= 300 ) /* 10 * 1 ms = 10ms ʱ¼äµ½ */
                {
                        d=Get_Max31855();
                        TM1=d;
                        if(TM1>=92.5)
                        {
                                TM2=TM1+(TM1-92.3)*0.026;//²ÉÑù¾«¶È²¹³¥       
                        }else
                        {
                        TM2=TM1;
                        }
                        time = 0;
                }
                if ( time2 >= 1000 ) /* 1000 * 1 ms = 1s ʱ¼äµ½ */
                {
                       
                        pid.Pv=TM2;//µ±Ç°Î¶Ƞ      
                        PID_Calc(); //pid¼ÆËã       
                        Mode();//ʱ¿Ì²ì¾õÉèÖÃζȵı仯
                        time2 = 0;
                }
                if ( time3 >= 200 ) /* 10 * 1 ms = 10ms ʱ¼äµ½ */
                {
                        time3 = 0;  
                        OLED_Temp();
                }
        }         
作者: Hephaestus    時間: 2021-10-25 13:40
EXTI4_IRQHandler里面Delay_ms(10)是用systick中斷實現(xiàn)的吧???systick中斷優(yōu)先級低于exti4,所以執(zhí)行到這一句永遠(yuǎn)無法進(jìn)一步執(zhí)行下去了。

千萬不要在中斷處理函數(shù)里面用delay,這是個基本原則問題。
作者: yzwzfyz    時間: 2021-10-25 16:10
如果你說的是真實的,則外中斷后,跳入中斷服務(wù)程序執(zhí)行,外中斷服務(wù)程序在下列情況下會死機(jī):
1、沒有寫外中斷服務(wù)程序,即中斷后,程序就【飛】了。
2、有死等的條件語句,因條件不成立,死等出不來。
3、修改的主程序的重要參數(shù),造成主程序發(fā)生未預(yù)期的結(jié)果。例如,主程序在等某一事件的結(jié)果,突然被外中斷打斷,中斷服務(wù)程序又將這個事件清除了,造成中斷返回后,主程序等不到事件的結(jié)果。
作者: 黃youhui    時間: 2021-10-26 08:46
在中斷處理函數(shù)里面放while(),你不死機(jī)天理難容啊。人家中斷處理函數(shù)要么打個標(biāo)記,要么幾十微秒內(nèi)退出,畢竟中斷要輪詢,要嵌套。你直接while住,函數(shù)怎么跑。

51hei截圖20211026084256.png (40.79 KB, 下載次數(shù): 60)

51hei截圖20211026084256.png

作者: 黃youhui    時間: 2021-10-26 08:47
yzwzfyz 發(fā)表于 2021-10-25 16:10
如果你說的是真實的,則外中斷后,跳入中斷服務(wù)程序執(zhí)行,外中斷服務(wù)程序在下列情況下會死機(jī):
1、沒有寫 ...

他在中斷處理函數(shù)里面放了while
作者: bigbigcong    時間: 2021-10-26 09:06
在中斷里延時,,真有你的哦




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1