STM32-外部中斷,沒有硬件干擾就是快樂

一:觸發方式函數

STM32 的外部中斷是經過邊沿來觸發的,不支持電平觸發;spa

二:外部中斷分組ip

STM32 的每個GPIO都能配置成一個外部中斷觸發源,STM32 經過根據引腳的序號不一樣將衆多中斷觸發源分紅不一樣的組,好比:PA0,PB0,PC0,PD0,PE0,PF0,PG0爲第一組,那麼依此類推,咱們能得出一共有16 組,STM32 規定,每一組中同時只能有一箇中斷觸發源工做,那麼,最多工做的也就是16個外部中斷。it

STM32 分組和對應中斷處理函數分配:io

管腳table

中斷標誌配置

中斷處理函數分配map

PA0~PG0top

EXTI0tab

EXTI0_IRQHandler

PA1~PG1

EXTI1

EXTI1_IRQHandler

PA2~PG2

EXTI2

EXTI2_IRQHandler

PA3~PG3

EXTI3

EXTI3_IRQHandler

PA4~PG4

EXTI4

EXTI4_IRQHandler

PA5~PG5

EXTI5

 EXTI9_5_IRQHandler

PA6~PG6

EXTI6

PA7~PG7

EXTI7

PA8~PG8

EXTI8

PA9~PG9

EXTI9

PA10~PG10

EXTI10

EXTI15_10_IRQHandler

PA11~PG11

EXTI11

PA12~PG12

EXTI12

PA13~PG13

EXTI13

PA14~PG14

EXTI14

PA15~PG15

EXTI15

三:外部中斷的配置過程

l 配置觸發源 -GPIO

觸發源爲經過GPIO端口輸入,因此,要配置GPIO的模式,輸入方式,輸入方式有如下幾種:

1.GPIO_Mode_AIN ,模擬輸入(ADC模擬輸入,或者低功耗下省電)

2.GPIO_Mode_IN_FLOATING ,浮空輸入

3.GPIO_Mode_IPD = 0x28,帶下拉輸入 

4.GPIO_Mode_IPU = 0x48,帶上拉輸
 
-----------------------具體配置例子-----------------------
參考STM32的庫函數版自帶例程 PB5對應的 EXTI9_5_IRQHandler,及5號中斷線,這個不能亂設,不然不工做
void EXTIX_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
     EXTI_InitTypeDef EXTI_InitStructure;
     NVIC_InitTypeDef NVIC_InitStructure;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);     //關閉jtag
 
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
 
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
       GPIO_Init(GPIOB, &GPIO_InitStructure);
 
       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);

       EXTI_InitStructure.EXTI_Line= EXTI_Line5;
       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    
       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
       EXTI_InitStructure.EXTI_LineCmd = ENABLE;
       EXTI_Init(&EXTI_InitStructure);
 
     NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;               //使能按鍵所在的外部中斷通道
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;     //先佔優先級4位,共16級
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                         //先佔優先級0位,從優先級4位
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能外部中斷通道
       NVIC_Init(&NVIC_InitStructure); 
}
處理函數,要清除中斷標誌位,否則一秒M次的中斷均可能
void EXTI9_5_IRQHandler(void)
{
       delay_ms(10);    // 消抖,是按鍵的話這裏就須要,不然就不用延遲               
printf("delay_ms\r\n");

      if (EXTI_GetITStatus( EXTI_Line5) != RESET)
     {
      //本身要實現的動做
          printf("EXTI0_IRQHandler\r\n");
     }
     EXTI_ClearITPendingBit( EXTI_Line5);  //清除EXTI13線路掛起位      }
相關文章
相關標籤/搜索