找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1453|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32單片機外部中斷失效?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:833967 發(fā)表于 2023-3-26 16:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大佬們幫忙看看,外部中斷初始化后按鍵按下沒有作用,不知道是什么問題呀?大佬們看看下面單片機源碼:
exit.c
#include "exti.h"
#include "oled.h"
#include "key.h"
#include "risk.h"
#include "delay.h"
#include "usart.h"

extern int oledSwitchFlag;        //oledSwitchFlag實現(xiàn)外部中斷切換頁面
extern int valueMode;                //valueMode實現(xiàn)閾值上限下限的切換  0-上限 1-下限

extern int temp_up, temp_low;                                                //溫度閾值, up上限,low下限
extern int humi_up, humi_low;                                                //濕度閾值, up上限,low下限
extern int hydr_up;                                                                        //氫氣閾值, up上限,氣體只設(shè)置上限閾值
extern int carbon_up;                                                                //一氧化碳閾值, up上限,氣體只設(shè)置上限閾值
extern int natgas_up;                                                                //天然氣閾值, up上限,氣體只設(shè)置上限閾值
extern int Timer3_Switch;                                                        //定時器TIM3的開關(guān)標記位
extern int riskFlag;

void EXTIX_Init(void)
{

           EXTI_InitTypeDef EXTI_InitStructure;
         NVIC_InitTypeDef NVIC_InitStructure;
        
        KEYInit();                                                                                //按鍵模塊初始化

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

   //GPIOB12          //KEY_Mode
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);
          EXTI_InitStructure.EXTI_Line=EXTI_Line12;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
          EXTI_Init(&EXTI_InitStructure);

   //GPIOB13          //KEY_Add
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
          EXTI_InitStructure.EXTI_Line=EXTI_Line13;
          EXTI_Init(&EXTI_InitStructure);
        
        //GPIOB14          //KEY_Reduce
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
          EXTI_InitStructure.EXTI_Line=EXTI_Line14;
          EXTI_Init(&EXTI_InitStructure);
        
        //GPIOB15          //KEY_Control
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15);
          EXTI_InitStructure.EXTI_Line=EXTI_Line15;
          EXTI_Init(&EXTI_InitStructure);


   //GPIOA.0           PA0  WK_UP
         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

          EXTI_InitStructure.EXTI_Line=EXTI_Line0;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_Init(&EXTI_InitStructure);        


          NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);

          NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        
          NVIC_Init(&NVIC_InitStructure);

}


void EXTI0_IRQHandler(void)
{
        delay_ms(10);
        if(WK_UP == 1){
                Risk != Risk;
        }
        EXTI_ClearITPendingBit(EXTI_Line0);
}

void EXTI15_10_IRQHandler(void)
{
        delay_ms(10);
        if(KEY_Mode == 0){                        //模式按鍵
                oledSwitchFlag++;
                OLED_Clear();
                UsartPrintf(USART_DEBUG,"oledSwitchFlag=%d\r\n",oledSwitchFlag);
                if(valueMode != 0)
                        valueMode = 0;
                if(oledSwitchFlag == 6)        
                        oledSwitchFlag = 0;        
                EXTI_ClearITPendingBit(EXTI_Line12);
        }
        
        if(KEY_Add == 0){                        //數(shù)值加
                if(oledSwitchFlag == 0)        //控制警報
                        riskFlag = 0;
               
                if(oledSwitchFlag == 1){
                        if(valueMode == 0){
                                temp_up++;
                                if(temp_up > 99)
                                        temp_up = 0;
                        }else{
                                temp_low++;
                                if(temp_low > 99)
                                        temp_low = 0;
                        }
                }else if(oledSwitchFlag == 2){
                        if(valueMode == 0){
                                humi_up++;
                                if(humi_up > 99)
                                        humi_up = 0;
                        }else{
                                humi_low++;
                                if(humi_low > 99)
                                        humi_low = 0;
                        }
                }else if(oledSwitchFlag == 3){
                        hydr_up++;
                        if(hydr_up > 99)
                                hydr_up = 0;
                }else if(oledSwitchFlag == 4){
                        carbon_up++;
                        if(carbon_up > 99)
                                carbon_up = 0;
                }else if(oledSwitchFlag == 5){
                        natgas_up++;
                        if(natgas_up > 99)
                                natgas_up = 0;
                }               
                EXTI_ClearITPendingBit(EXTI_Line13);
        }
        
        if(KEY_Reduce == 0){                //數(shù)值減
                if(oledSwitchFlag == 1){
                        if(valueMode == 0){
                                temp_up--;
                                if(temp_up < 0)
                                        temp_up = 99;
                        }else{
                                temp_low--;
                                if(temp_low < 0)
                                        temp_low = 99;
                        }
                }else if(oledSwitchFlag == 2){
                        if(valueMode == 0){
                                humi_up--;
                                if(humi_up < 0)
                                        humi_up = 99;
                        }else{
                                humi_low--;
                                if(humi_low < 0)
                                        humi_low = 99;
                        }
                }else if(oledSwitchFlag == 3){
                        hydr_up--;
                        if(hydr_up < 0)
                                hydr_up = 99;
                }else if(oledSwitchFlag == 4){
                        carbon_up--;
                        if(carbon_up < 0)
                                carbon_up = 99;
                }else if(oledSwitchFlag == 5){
                        natgas_up--;
                        if(natgas_up < 0)
                                natgas_up = 99;
                }
                EXTI_ClearITPendingBit(EXTI_Line14);
        }
        
        if(KEY_Control == 0){                //控制光標和數(shù)據(jù)動態(tài)切屏
                if(oledSwitchFlag == 0){
                        if(Timer3_Switch == 1){
                                TIM_Cmd(TIM3, DISABLE);        //關(guān)閉定時器TIM3
                                Timer3_Switch = 0;
                        }else if(Timer3_Switch ==0){
                                TIM_Cmd(TIM3, ENABLE);        //打開定時器TIM3
                                Timer3_Switch = 1;
                        }
                }else if(oledSwitchFlag == 1 || oledSwitchFlag == 2){
                        valueMode++;
                        OLED_Clear();
                        if(valueMode > 1)
                                valueMode = 0;
                }
                EXTI_ClearITPendingBit(EXTI_Line15);
        }
}

key.c
#include "key.h"

void KEYInit(void){
        GPIO_InitTypeDef GPIO_InitStructure;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(GPIOB ,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表