STM32中斷觸發


使用PB1作為外部中斷觸發,按一次按鍵燈處於亮狀態,在按一次燈滅。

1、先配置GPIO端口、復用管腳外設時鍾使能GPIO_Config();

void GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//PB1復用管腳時鍾使能
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//配置推挽輸出,燈太亮,刺眼,故意把配置OD門,亮度暗一點
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//由於配置OD輸出,顧這要上拉
    GPIO_Init(GPIOD,&GPIO_InitStructure);
    
    //配置PB1管腳作為觸發輸入,因為PB1管腳直接接開關按鈕到地,所以內部上拉讓其管腳處於高電平狀態,當開關按下時,PB1管腳被拉低,通過下降沿進行觸發
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
}

2、配置嵌套向量中斷控制NVIC_Config(void),使用不同通道時得注意,EXTI0~EXTI4對應的是EXTI0_IRQn、EXTI1_IRQn、EXTI2_IRQn、EXTI3_IRQn和EXTI4_IRQn,EXTI5~EXTI9都用EXTI9_5_IRQn這個通道,EXTI10~EXTI15都用EXTI15_10_IRQn這個通道。

void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    
    #ifdef  VECT_TAB_RAM  
    /* Set the Vector Table base location at 0x20000000 */ 
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
    #else  /* VECT_TAB_FLASH  */
    /* Set the Vector Table base location at 0x08000000 */ 
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
    #endif
    
    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //由於使用的是PB1,對應的是EXTI1通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中斷使能
    NVIC_Init(&NVIC_InitStructure);    
}

3、中斷管腳配置EXTI_Config(void)

void EXTI_Config(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    
    //PB1作為外部中斷,得相連接
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource1);
    
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;//通道
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
    EXTI_InitStructure.EXTI_LineCmd    = ENABLE;//使能
    EXTI_Init(&EXTI_InitStructure);
}

5、主函數調用上面幾個函數

int main(void)
{
    Clock_Config();
    GPIO_Config();
    NVIC_Config();
    EXTI_Config();
        
  while (1)
  {
        
  }
}

6、找中斷函數名,函數名都已固定好,可以到startup_stm32f2xx.s中查找相關中斷函數名,這里用的是EXTI1_IRQHandler()

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler                   ; Window WatchDog                                        
                DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection                        
                DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
                DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
                DCD     FLASH_IRQHandler                  ; FLASH                                           
                DCD     RCC_IRQHandler                    ; RCC                                             
                DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             
                DCD     EXTI1_IRQHandler                  ; EXTI Line1     //這里有,把EXTI1_IRQHandler 拷貝下來                                
                DCD     EXTI2_IRQHandler                  ; EXTI Line2                                             
                DCD     EXTI3_IRQHandler                  ; EXTI Line3                                             
                DCD     EXTI4_IRQHandler                  ; EXTI Line4   

7、寫中斷函數,把拷貝的函數名copy到stm32f2xx_it.c文件中的任意位置

int flag = 0;//定義全局變量
void EXTI1_IRQHandler()
{
    EXTI_ClearITPendingBit(EXTI_Line1); //清除中斷掛起位,方便下次中斷進入,因中斷產生,該位會自動置位,所以這里得手動清除
    if(!flag)
    {
        flag = ~flag;
        GPIO_SetBits(GPIOD,GPIO_Pin_12);
        GPIO_SetBits(GPIOD,GPIO_Pin_13);
        GPIO_SetBits(GPIOD,GPIO_Pin_14);
        GPIO_SetBits(GPIOD,GPIO_Pin_15);
    }
    else
    {
        flag = ~flag;
        GPIO_ResetBits(GPIOD, GPIO_Pin_12);
        GPIO_ResetBits(GPIOD, GPIO_Pin_13);
        GPIO_ResetBits(GPIOD, GPIO_Pin_14);
        GPIO_ResetBits(GPIOD, GPIO_Pin_15);
    }    
}

 

OK,到此,中斷處理函數就寫好了,按一次按鍵燈處於亮狀態,在按一次燈滅

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM