天天看點

STM32學習筆記——外部中斷EXTI

一、EXTI 中斷

      PA0,PB0,......PG0  共用一個中斷标志 EXT0

      PA1,PB1,......PG1  共用一個中斷标志 EXT1

      ...................................

      ...................................

      PA15,PA15,......PG15  共用一個中斷标志 EXT15

      疑問:官方庫函數有19條EXTI_Line,EXTI_Line0 -- EXTI_Line18,多出來的3條在哪裡?

               祥見 EXTI_InitTypeDef.EXTI_Line 段落

二、在NVIC中:

      EXTI0--EXTI4各自有獨立的IRQ_Channel,對應的中斷服務函數是 void EXTI(n)_IRQHandler(void),(n)=0--4。

      EXTI5--EXTI9共用一個IRQ_Channel,對應的中斷服務函數是 void EXTI9_5_IRQHandler(void)。

      EXTI10--EXTI15共用一個IRQ_Channel,對應的中斷服務函數是 void EXTI15_10_IRQHandler(void)。

三、如何啟用EXTI中斷

      1 .啟動所需GPIOn_Pin及AFIO的RCC時鐘:

           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,RCC_APB2Periph_AFIO,ENABLE);

          !!!千萬别忘記啟動RCC_APB2Periph_AFIO!!!,否則管腳隻能做普通高低電平來用。

      2 .用GPIO_InitStructure(用GPIO_InitTypeDef預先定義一下)設定所需GPIO口的Pin,Speed,Mode,

          然後用GPIO_Init(GPIOn,&GPIO_InitStructure)來啟用這些GPIO的Pin。

      3 .用GPIO的中斷線控制函數啟動指定GPIO的某個Pin

          GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource7);

      4 .初始化中斷,類似初始化GPIO

          a)定義一個初始化的結構變量 EXTI_InitTypeDef  EXTI_InitStructure;

             !!!這步應該在函數外預先聲明名!!!

          b)輸入該結構的成員值:EXTI_Line,EXTI_Mode,EXTI_Trigger,EXTI_LineCmd

          c)用EXTI_Init(&EXTI_InitStructure);完成初始化

          例:

             RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO , ENABLE );

            GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource7);

            EXTI_InitStructure.EXTI_Line = EXTI_Line7;

            EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

            EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

            EXTI_InitStructure.EXTI_LineCmd = ENABLE;

            EXTI_Init(&EXTI_InitStructure);

四、可以用軟體模拟一個EXTI中斷的産生,指令如下:

          EXTI_GenerateSWInterrupt(EXTI_Line7);//産生EXTI_Line7的中斷。

五、對應的中斷服務函數在 "stm32f10x_it.c" 中

六、需用的 ".c" 檔案有:

         stm32f10x_rcc.c

         stm32f10x_nvic.c

         stm32f10x_gpio.c

         stm32f10x_exti.c

         stm32f10x_it.c

繼續閱讀