STM32以外部中斷

 

圖1.0編程

圖1.1ide

 

中斷控制器支持23條中斷線,其中16條是IO管腳中斷線,分別是EXTI0~EXTI15:spa

 圖 1.23d

 

另外七根中斷線以下圖:code

 

中斷線和管腳的對應關係:EXTI0~EXTI15 和GPIOx0~15一一對應,x:A~G。blog

每條中斷線控制着7個管腳的中斷跳變沿的輸入,經過寄存器SYSCFG_EXTICRx(x:1~4)來進行多選1。it

  舉例:中斷線0,即EXTI0控制着7個管腳的中斷源輸入,分別是PA0,PB0,PC0,PD0,PE0,PF0,PG0。class

 

外部中斷寄存器配置SYSCFG共有四個寄存器,他們的做用是相似的,管理着某中斷下某引腳的選擇,下列只介紹第一個寄存器,其餘相似:配置

 

 

 

 

 

 

EXTI0[3:0] 用於選擇中斷線0的中斷源管腳 0000: PA0 引腳 0001: PB0 引腳 0010: PC0 引腳 0011: PD0 引腳 0100: PE0 引腳 0101: PF0 引腳 0110: PG0 引腳 0111: PH0 引腳 1000: PI0 引腳 舉例:中斷線0的中斷源管腳選擇爲PA0管腳,對應的代碼以下: SYSCRF->EXTICR1 &=~(0xF<<0); EXTI1[3:0] 用於選擇中斷線1的中斷源管腳 0000: PA1 引腳 0001: PB1 引腳 0010: PC1 引腳 0011: PD1 引腳 0100: PE1 引腳 0101: PF1 引腳 0110: PG1 引腳 0111: PH1 引腳 1000: PI1 引腳 舉例:中斷線1的中斷源管腳選擇爲PF1管腳,對應的代碼以下: SYSCRF->EXTICR1 |=(5<<4); EXTI2[3:0] 用於選擇中斷線2的中斷源管腳 0000: PA2 引腳 0001: PB2 引腳 0010: PC2 引腳 0011: PD2 引腳 0100: PE2 引腳 0101: PF2 引腳 0110: PG2 引腳 0111: PH2 引腳 1000: PI2 引腳 CR1 EXTI3[3:0] 用於選擇中斷線3的中斷源管腳 0000: PA3 引腳 0001: PB3 引腳 0010: PC3 引腳 0011: PD3 引腳 0100: PE3 引腳 0101: PF3 引腳 0110: PG3 引腳 0111: PH3 引腳 1000: PI3 引腳 CR1

四位爲一小組,四位控制一條中斷線,用於選擇中斷線的中斷源管腳。中斷線0~中斷線15 分別於EXTI0[3:0]~EXTI15[3:0]一一對應。請求

  編程時,SYSCFG_EXTICR1對應SYSCFG->EXTICR[0]

  SYSCFG_EXTICR2對應SYSCFG->EXTICR[1]

  SYSCFG_EXTICR3對應SYSCFG->EXTICR[2]

  SYSCFG_EXTICR4對應SYSCFG->EXTICR[3]

 

 下面工程文件是用外部中斷檢測四個按鍵:

 

#include "stm32f4xx.h" #include "delay.h"
void Key_Init(void) { RCC->AHB1ENR |= 1<<0;//使能GPIOA的時鐘
    GPIOA->MODER &=~(3<<0);//PA0配置爲輸入模式
    GPIOA->PUPDR &=~(3<<0);//PA0配置爲浮空模式 //GPIOA->PUPDR |=2<<0;//下拉 也能夠配置
 RCC->AHB1ENR |= 1<<4;//使能GPIOE時鐘
    GPIOE->MODER &=~(3<<4);//PE2配置爲輸入模式
    GPIOE->PUPDR &=~(3<<4);//PE2配置爲浮空模式 //GPIOA->PUPDR |=1<<4;//初始爲上拉
 GPIOE->MODER &=~(3<<6);//PE3配置爲輸入模式
    GPIOE->PUPDR &=~(3<<6);//PE3配置爲浮空模式 //GPIOA->PUPDR |=1<<6;
 GPIOE->MODER &=~(3<<8);//PE4配置爲輸入模式
    GPIOE->PUPDR &=~(3<<8);//PE4配置爲浮空模式 //GPIOA->PUPDR |=1<<8;
} void EXIT_Init(void) { RCC->APB2ENR |= 1<<14;//使能系統配置控制器時鐘 
    
    /*******初始化KEY1<-->PA0的中斷線0**********/ SYSCFG->EXTICR[0] &=~(0XF<<0);//配置SYSCFG 外部中斷配置寄存器,選擇中斷源管腳
    EXTI->RTSR |= 1<<0;//選擇中斷線0觸發邊沿爲上升沿
    EXTI->IMR  |= 1<<0;//開放中斷線0的中斷請求
    NVIC_EnableIRQ(EXTI0_IRQn);//使能中斷通道,NVIC_EnableIRQ(IRQn)
    
    /*******初始化KEY2<-->PE2的中斷線2**********/ SYSCFG->EXTICR[0] |= (4<<8);//配置SYSCFG 外部中斷配置寄存器,選擇中斷源管腳 //中斷線2,一條中斷線位爲4,第二位就是8了
 EXTI->FTSR |= 1<<2;//選擇中斷2觸發邊沿爲降低沿
    EXTI->IMR  |= 1<<2;//開放中斷線2的中斷請求
    NVIC_EnableIRQ(EXTI2_IRQn);//使能中斷通道,NVIC_EnableIRQ(IRQn)
    
    /*******初始化KEY3<-->PE3的中斷線3**********/ SYSCFG->EXTICR[0] |= (4<<12);//配置SYSCFG 外部中斷配置寄存器,選擇中斷源管腳
    EXTI->FTSR |= 1<<3;//選擇中斷線3觸發邊沿爲降低沿
    EXTI->IMR  |= 1<<3;//開放中斷線3的中斷請求
    NVIC_EnableIRQ(EXTI3_IRQn);//使能中斷通道,NVIC_EnableIRQ(IRQn)
    
    
    /*******初始化KEY4<-->PE4的中斷線4**********/ SYSCFG->EXTICR[1] |= (4<<0);//配置SYSCFG 外部中斷配置寄存器,選擇中斷源管腳
    EXTI->FTSR |= 1<<4;//選擇中斷線0觸發邊沿爲降低沿
    EXTI->IMR  |= 1<<4;//開放中斷線4的中斷請求
    NVIC_EnableIRQ(EXTI4_IRQn);//使能中斷通道,NVIC_EnableIRQ(IRQn)
} void EXTI0_IRQHandler(void) { //k1 PA0 led1 pf6
    if(EXTI->PR &(1<<0))  //判斷中斷線0是否觸發了中斷
 { EXTI->PR |= 1<<0;//置一清零
        Delay_ms(10);//延時10ms消抖
        if(GPIOA->IDR &(1<<0))//判斷KEY1是不穩定的按下了
 { GPIOF->ODR ^= 1<<6;//取反LED1燈的狀態
 } } } void EXTI2_IRQHandler(void) { //k2 PE2 led3 pf9
    if(EXTI->PR &(1<<2))  //判斷中斷線2是否觸發了中斷
 { EXTI->PR |= 1<<2;//置一清零
        Delay_ms(10);//延時10ms消抖
        if(!(GPIOE->IDR &(1<<2)))//判斷KEY2是不穩定的按下了
 { GPIOF->ODR ^= 1<<9;//取反LED2燈的狀態;
 } } } void EXTI3_IRQHandler(void) { //k3 PE3 led3 pf10
    if(EXTI->PR &(1<<3))  //判斷中斷線3是否觸發了中斷
 { EXTI->PR |= 1<<3;//置一清零
        Delay_ms(10);//延時10ms消抖
        if(!(GPIOE->IDR &(1<<3)))//判斷KEY3是不穩定的按下了
 { GPIOF->ODR ^= 1<<10;//取反LED3燈的狀態
 } } } void EXTI4_IRQHandler(void) { //k4 PE4 led4 pc0
    if(EXTI->PR &(1<<4))  //判斷中斷線4是否觸發了中斷
 { EXTI->PR |= 1<<4;//置一清零
        Delay_ms(10);//延時10ms消抖
        if(!(GPIOE->IDR &(1<<4)))//判斷KEY4是不穩定的按下了
 { GPIOC->ODR ^= 1<<0;//取反LED4燈的狀態
 } } }
View Code
相關文章
相關標籤/搜索