圖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燈的狀態 } } }