乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      零死角玩轉(zhuǎn)stm32

       weikong66 2013-08-06
      零死角玩轉(zhuǎn)stm32-初級(jí)篇之EXTI之按鍵中斷實(shí)驗(yàn)
      2013年07月22日 ? 教程 ? 評(píng)論數(shù) 3 ? 被圍觀 331+

          8、EXTI之按鍵中斷實(shí)驗(yàn)

         EXTI (External interrupt) 就是指外部中斷,通過(guò)GPIO檢測(cè)輸入脈沖,引起中斷事件,打斷原來(lái)的代碼執(zhí)行流程,進(jìn)入到中斷服務(wù)函數(shù)中進(jìn)行處理,處理完后,再返回到中斷之前的代碼中執(zhí)行。

      前面提到,STM32的所有GPIO都可以用作外部中斷源的輸入端,利用這個(gè)特性,我們可以把按鍵輪詢(xún)檢測(cè) 改為由中斷 來(lái)處理,大大提高軟件執(zhí)行的效率。

      8.1 STM32的中斷和異常

      Cortex內(nèi)核具有強(qiáng)大的異常響應(yīng)系統(tǒng),它把能夠打斷當(dāng)前代碼執(zhí)行流程的事件分為異常(exception)中斷(interrupt),并把它們用一個(gè)表管理起來(lái),編號(hào)為0~15的稱(chēng)為內(nèi)核異常,而16以上的則稱(chēng)為外部中斷(外,相對(duì)內(nèi)核而言),這個(gè)表就稱(chēng)為中斷向量表。

      而STM32對(duì)這個(gè)表重新進(jìn)行了編排,把編號(hào)從-3至6的中斷向量定義為系統(tǒng)異常,編號(hào)為負(fù) 的內(nèi)核異常不能被設(shè)置優(yōu)先級(jí),如復(fù)位(Reset)、不可屏蔽中斷 (NMI)、硬錯(cuò)誤(Hardfault)。從編號(hào)7開(kāi)始的為外部中斷,這些中斷的優(yōu)先級(jí)都是可以自行設(shè)置的。詳細(xì)的STM32中斷向量表見(jiàn)圖 81,STM32中斷向量表。

      圖 81中斷向量表

         這個(gè)表可以從《STM32中文參考手冊(cè)》找到,但野火一般是從啟動(dòng)文件startup_stm32f10x_hd.s中查找的,因?yàn)椴煌吞?hào)的STM32芯片,中斷向量表稍微有點(diǎn)區(qū)別,在啟動(dòng)文件中,已經(jīng)有相應(yīng)芯片可用的全部中斷向量。而且在編寫(xiě)中斷服務(wù)函數(shù)時(shí),需要從啟動(dòng)文件中定義的中斷向量表查找中斷服務(wù)函數(shù)名。

        8.2 NVIC中斷控制器

      STM32的中斷如此之多,配置起來(lái)并不容易,因此,我們需要一個(gè)強(qiáng)大而方便的中斷控制器NVIC (Nested Vectored Interrupt Controller)。NVIC是屬于Cortex內(nèi)核的器件,不可屏蔽中斷 (NMI)和外部中斷都由它來(lái)處理,而SYSTICK不是由NVIC來(lái)控制的。

        

      圖82 NVIC在內(nèi)核中的位置

         8.2.1 NVIC結(jié)構(gòu)體成員

      當(dāng)我們要使用NVIC來(lái)配置中斷時(shí),自然想到ST庫(kù)肯定也已經(jīng)把它封裝成庫(kù)函數(shù)了。查找?guī)鞄椭臋n,發(fā)現(xiàn)在Modules->STM32F10x_StdPeriph_Driver->misc 查找到一個(gè)NVIC_Init() 函數(shù),對(duì)NVIC初始化,首先要定義并填充一個(gè)NVIC_InitTypeDef 類(lèi)型的結(jié)構(gòu)體。

      這個(gè)結(jié)構(gòu)體有四個(gè)成員

      前面兩個(gè)結(jié)構(gòu)體成員都很好理解,首先要用NVIC_IRQChannel參數(shù)來(lái)選擇將要配置的中斷向量,用NVIC_IRQChannelCmd參數(shù)來(lái)進(jìn)行使能(ENABLE)關(guān)閉(DISABLE)該中斷。在NVIC_IRQChannelPreemptionPriority成員要配置中斷向量的搶占優(yōu)先級(jí),在NVIC_IRQChannelSubPriority需要配置中斷向量的響應(yīng)優(yōu)先級(jí)。對(duì)于中斷的配置,最重要的便是配置其優(yōu)先級(jí),但STM32的同一個(gè)中斷向量為什么需要設(shè)置兩種優(yōu)先級(jí)?這兩種優(yōu)先級(jí)有什么區(qū)別?

       8.2.2 搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)

      STM32的中斷向量具有兩個(gè)屬性,一個(gè)為搶占屬性,另一個(gè)為響應(yīng)屬性,其屬性編號(hào)越小,表明它的優(yōu)先級(jí)別越高。

      搶占,是指打斷其它中斷的屬性,即因?yàn)榫哂羞@個(gè)屬性,會(huì)出現(xiàn)嵌套中斷(在執(zhí)行中斷服務(wù)函數(shù)A的過(guò)程中被中斷B打斷,執(zhí)行完中斷服務(wù)函數(shù)B再繼續(xù)執(zhí)行中斷服務(wù)函數(shù)A),搶占屬性由NVIC_IRQChannelPreemptionPriority的參數(shù)配置。

      而響應(yīng)屬性則應(yīng)用在搶占屬性相同的情況下,當(dāng)兩個(gè)中斷向量的搶占優(yōu)先級(jí)相同時(shí),如果兩個(gè)中斷同時(shí)到達(dá),則先處理響應(yīng)優(yōu)先級(jí)高的中斷,響應(yīng)屬性由NVIC_IRQChannelSubPriority的參數(shù)配置。

      例如,現(xiàn)在有三個(gè)中斷向量:

      若內(nèi)核正在執(zhí)行C的中斷服務(wù)函數(shù),則它能被搶占優(yōu)先級(jí)更高的中斷A打斷,由于B和C的搶占優(yōu)先級(jí)相同,所以C不能被B打斷。但如果B和C中斷是同時(shí)到達(dá)的,內(nèi)核就會(huì)首先響應(yīng)響應(yīng)優(yōu)先級(jí)別更高的B中斷。

       8.2.3 NVIC的優(yōu)先級(jí)組

      在配置優(yōu)先級(jí)的時(shí)候,還要注意一個(gè)很重要的問(wèn)題,中斷種類(lèi)的數(shù)量。NVIC只可以配置16種 中斷向量的優(yōu)先級(jí),也就是說(shuō),搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)的數(shù)量由一個(gè)4位的數(shù)字來(lái)決定,把這個(gè)4位數(shù)字的位數(shù) 分配成搶占優(yōu)先級(jí)部分和響應(yīng)優(yōu)先級(jí)部分。有5組分配方式:

      第0組: 所有4位用來(lái)配置搶占優(yōu)先級(jí),即NVIC配置的24 =16種中斷向量都是只有搶占屬性,沒(méi)有響應(yīng)屬性。

      第1組:最高1位用來(lái)配置搶占優(yōu)先級(jí),低3位用來(lái)配置響應(yīng)優(yōu)先級(jí)。表示有21=2種級(jí)別的搶占優(yōu)先級(jí)(0級(jí),1級(jí)),有23=8種響應(yīng)優(yōu)先級(jí),即在16種中斷向量之中,有8種中斷,其搶占優(yōu)先級(jí)都為0級(jí),而它們的響應(yīng)優(yōu)先級(jí)分別為0~7,其余8種中斷向量的搶占優(yōu)先級(jí)則都為1級(jí),響應(yīng)優(yōu)先級(jí)別分別為0~7。

      第2組:2位用來(lái)配置搶占優(yōu)先級(jí),2位用來(lái)配置響應(yīng)優(yōu)先級(jí)。即22=4種搶占優(yōu)先級(jí),22=4種響應(yīng)優(yōu)先級(jí)。

      第3組:高3位用來(lái)配置搶占優(yōu)先級(jí),最低1位用來(lái)配置響應(yīng)優(yōu)先級(jí)。即有8種搶占優(yōu)先級(jí),2種響應(yīng)2優(yōu)先級(jí)。

      第4組:所有4位用來(lái)配置響應(yīng)優(yōu)先級(jí)。即16種中斷向量具有都不相同的響應(yīng)優(yōu)先級(jí)。

      要配置這些優(yōu)先級(jí)組,可以采用庫(kù)函數(shù)NVIC_PriorityGroupConfig(),可輸入的參數(shù)為NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分別為以上介紹的5種分配組。

      于是,有讀者覺(jué)得疑惑了,如此強(qiáng)大的STM32,所有GPIO都能夠配置成外部中斷,USART、ADC等外設(shè)也有中斷,而NVIC只能配置16種中斷向量,那在某個(gè)工程中使用了超過(guò)16個(gè)的中斷怎么辦呢?注意NVIC能配置的是16種 中斷向量,而不是16個(gè),當(dāng)工程之中有超過(guò)16個(gè)中斷向量時(shí),必然有2個(gè)以上的中斷向量是使用相同的中斷種類(lèi),而具有相同中斷種類(lèi)的中斷向量不能互相嵌套。

      STM2 單片機(jī)的所有I/O端口都可以配置為EXTI中斷模式,用來(lái)捕捉外部信號(hào),可以配置為下降沿中斷,上升沿中斷和上升下降沿中斷這三種模式。它們以下圖的方式連接到16個(gè)外部中斷/事件線上

       8.3 EXTI外部中斷

      STM32的所有GPIO都引入到EXTI外部中斷線上,使得所有的GPIO都能作為外部中斷的輸入源。GPIO與EXTI的連接方式見(jiàn)圖 03

      圖 03 EXTI與GPIO連接圖

         觀察這個(gè)圖知道,PA0~PG0 連接到EXTI0 、PA1~PG1連接到EXTI1、 ……、 PA15~PG15連接到EXTI15。這里大家要注意的是:PAx~PGx端口的中斷事件都連接到了EXTIx,即同一時(shí)刻EXTx只能相應(yīng)一個(gè)端口的事件觸發(fā),不能夠同一時(shí)間響應(yīng)所有GPIO端口的事件,但可以分時(shí)復(fù)用。它可以配置為上升沿觸發(fā),下降沿觸發(fā)或雙邊沿觸發(fā)。EXTI 最普通的應(yīng)用就是接上一個(gè)按鍵,設(shè)置為下降沿觸發(fā),用中斷來(lái)檢測(cè)按鍵。

       8.4 中斷檢測(cè)按鍵實(shí)驗(yàn)分析

      8.4.1實(shí)驗(yàn)描述及工程文件清單

      8.4.2 配置工程環(huán)境

      本中斷檢測(cè)按鍵實(shí)驗(yàn)照例使用了GPIO和RCC片上外設(shè),由于還使用到了中斷,所以比上一個(gè)按鍵實(shí)驗(yàn)要多使用兩個(gè)庫(kù)文件,分別為FWlib/stm32f10x_exti.cFWlib/misc.c,必須把這兩個(gè)文件也添加到工程之中。其中stm32f10x_exti.c文件包含了支持exti配置和操作的相關(guān)庫(kù)函數(shù);而misc.c文件則包含了NVIC的配置函數(shù)。本實(shí)驗(yàn)中我們還會(huì)在stm32f10x_it.c文件中編寫(xiě)中斷服務(wù)函數(shù)。

      添加了所需要的庫(kù)文件、用戶(hù)文件之后,要在stm32f10x_conf.h文件中配置使用到的頭文件。

      /**

      **********************************************************

      * @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_conf.h

      * @author  MCD Application Team

      * @version V3.5.0

      * @date    08-April-2011

      * @brief   Library configuration file.

      *************************************************/

      #include "stm32f10x_exti.h"

      #include "stm32f10x_gpio.h"

      #include "stm32f10x_rcc.h"

      #include "misc.h" /

         8.4.5 main文件

      我們從main函數(shù)開(kāi)始分析:

      /*

      * 函數(shù)名:main

      * 描述  :主函數(shù)

      * 輸入  :無(wú)

      * 輸出  :無(wú)

      */

      int main(void)

      {

      /* config the led */

      LED_GPIO_Config();

      LED1( ON );

      /* exti line config */

      EXTI_PE5_Config();

      /* wait interrupt */

      while(1)

      {

      }

      }

      使用LED_GPIO_Config() 配置好LED用到的I/O后,調(diào)用LED1()點(diǎn)亮一盞LED燈。這兩個(gè)函數(shù)的具體講解可參考前面的教程。

        8.4.6 配置外部中斷

      現(xiàn)在我們重點(diǎn)分析下EXTI_PE5_Config() 這個(gè)函數(shù),這是一個(gè)在用戶(hù)文件exti.c中實(shí)現(xiàn)的函數(shù),它完成了一般配置一個(gè)I/O為EXTI中斷的步驟,主要為功能:

      1、使能EXTIx線的時(shí)鐘和第二功能AFIO時(shí)鐘

      2、配置EXTIx線的中斷優(yōu)先級(jí)

      3、配置EXTI 中斷線I/O

      4、選定要配置為EXTI的I/O口線和I/O口的工作模式

      5、EXTI 中斷線工作模式配置

      EXTI_PE5_Config()代碼:

      /*

      * 函數(shù)名:EXTI_PE5_Config

      * 描述  :配置 PE5 為線中斷口,并設(shè)置中斷優(yōu)先級(jí)

      * 輸入  :無(wú)

      * 輸出  :無(wú)

      * 調(diào)用  :外部調(diào)用

      */

      void EXTI_PE5_Config(void)

      {

      GPIO_InitTypeDef GPIO_InitStructure;

      EXTI_InitTypeDef EXTI_InitStructure;

      /* config the extiline(PE5) clock and AFIO clock */

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);

      /* config the NVIC(PE5) */

      NVIC_Configuration();

      /* EXTI line gpio config(PE5) */

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  // 上拉輸入

      GPIO_Init(GPIOE, &GPIO_InitStructure);

      /* EXTI line(PE5) mode config */

      GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, 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);

      }

         8.4.7 AFIO時(shí)鐘

      EXTI_PE5_Config()代碼的第14行,調(diào)用RCC_APB2PeriphClockCmd() 時(shí)還輸入了參數(shù)RCC_APB2Periph_AFIO,表示開(kāi)啟AFIO的時(shí)鐘。見(jiàn)圖 04。

       AFIO (alternate-function I/O),指GPIO端口的復(fù)用功能,GPIO除了用作普通的輸入輸出(主功能),還可以作為片上外設(shè)的復(fù)用輸入輸出,如串口,ADC,這些就是復(fù)用功能。大多數(shù)GPIO都有一個(gè)默認(rèn)復(fù)用功能,有的GPIO還有重映射功能, 重映射功能是指把原來(lái)屬于A引腳的默認(rèn)復(fù)用功能,轉(zhuǎn)移到了B引腳進(jìn)行使用,前提是B引腳具有這個(gè)重映射功能

      當(dāng)把GPIO用作EXTI外部中斷 或使用重映射功能的時(shí)候,必須開(kāi)啟AFIO時(shí)鐘,而在使用默認(rèn)復(fù)用功能的時(shí)候,就不必開(kāi)啟AFIO時(shí)鐘了。

      圖 04 GPIO引腳功能說(shuō)明

         8.4.8 NVIC初始化配置

      在EXTI_PE5_Config()代碼的第17行調(diào)用了NVIC_Configuration(),這是用戶(hù)編寫(xiě)的用來(lái)配置NVIC控制器的函數(shù)。其實(shí)現(xiàn)如下:

      /*

      * 函數(shù)名:NVIC_Configuration

      * 描述  :配置嵌套向量中斷控制器NVIC

      * 輸入  :無(wú)

      * 輸出  :無(wú)

      * 調(diào)用  :內(nèi)部調(diào)用

      */

      static void NVIC_Configuration(void)

      {

      NVIC_InitTypeDef NVIC_InitStructure;

      /* Configure one bit for preemption priority */

      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

      /* 配置P[A|B|C|D|E]5為中斷源 */

      NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;

      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

      NVIC_Init(&NVIC_InitStructure);

      }

      本代碼的第13行調(diào)用了 NVIC_PriorityGroupConfig()庫(kù)函數(shù),把NVIC中斷優(yōu)先級(jí)分組設(shè)置為第1組。接下來(lái)開(kāi)始向NVIC初始化結(jié)構(gòu)體寫(xiě)入?yún)?shù) .NVIC_IRQChannel = EXTI9_5_IRQn,表示要配置的為EXTI第5~9線的中斷向量。因?yàn)榘存IPE5對(duì)應(yīng)的EXTI線為EXTI5,而從EXTI5~EXTI9線,由于它們是使用同一個(gè)中斷向量的,所以只能寫(xiě)入EXTI9_5_IRQn這個(gè)參數(shù)。這些可寫(xiě)入的參數(shù)可以在stm32f10x.h文件的IRQn類(lèi)型定義中查找到。

      然后配置搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí),因?yàn)檫@個(gè)工程簡(jiǎn)單,就直接把它設(shè)置為最高級(jí)中斷。填充完結(jié)構(gòu)體,別忘記最后要調(diào)用NVIC_Init() 函數(shù)來(lái)向寄存器寫(xiě)入?yún)?shù)。

      8.4.9 EXTI初始化配置

      回到EXTI_PE5_Config()代碼中,配置好NVIC后,還要對(duì)GPIOE進(jìn)行初始化,這部分和按鍵輪詢(xún)的設(shè)置類(lèi)似。

      接下來(lái),調(diào)用GPIO_EXTILineConfig()函數(shù)把GPIOE,Pin5設(shè)置為EXTI輸入線。

      圖 05 EXTI中斷源配置函數(shù)

         選擇好了GPIO,開(kāi)始填寫(xiě)EXTI的初始化結(jié)構(gòu)體。從這些參數(shù)的名字,讀者就已經(jīng)可以知道野火是如何把它應(yīng)用到按鍵檢測(cè)中了吧?

      .EXTI_Line = EXTI_Line5;

      給EXTI_Line成員賦值。選擇EXTI_Line5線進(jìn)行配置,因?yàn)榘存I的PE5連接到了EXTI_Line5。

      .EXTI_Mode = EXTI_Mode_Interrupt;

      給EXTI_Mode成員賦值。把EXTI_Line5的模式設(shè)置為為中斷模式EXTI_Mode_Interrupt。這個(gè)結(jié)構(gòu)體成員也可以賦值為事件模式EXTI_Mode_Event ,這個(gè)模式不會(huì)立刻觸發(fā)中斷,而只是在寄存器上把相應(yīng)的事件標(biāo)置位置1,應(yīng)用這個(gè)模式要不停地查詢(xún)相應(yīng)的寄存器。

      .EXTI_Trigger = EXTI_Trigger_Falling;

      EXTI_Trigger成員賦值。把觸發(fā)方式(EXTI_Trigger)設(shè)置為下降沿觸發(fā)(EXTI_Trigger_Falling)。

      .EXTI_LineCmd = ENABLE;

      EXTI_LineCmd成員賦值。把EXTI_LineCmd設(shè)置為使能。

      最后調(diào)用EXTI_Init()EXTI初始化結(jié)構(gòu)體的參數(shù)寫(xiě)入寄存器。

       8.4.10 編寫(xiě)中斷服務(wù)函數(shù)

      在這個(gè)EXTI設(shè)置中我們把PE5連接到內(nèi)部的EXTI5,GPIO配置為上拉輸入,工作在下降沿中斷。在外圍電路上我們將PE5接到了key1上。當(dāng)按鍵沒(méi)有按下時(shí),PE5始終為高,當(dāng)按鍵按下時(shí)PE5變?yōu)榈?,從?span style="COLOR: #008080">PE5上產(chǎn)生一個(gè)下降沿跳變,EXTI5會(huì)捕捉到這一跳變,并產(chǎn)生相應(yīng)的中斷,中斷服務(wù)程序在stm32f10x_it.c中實(shí)現(xiàn)。

       stm32f10x_it.c文件是專(zhuān)門(mén)用來(lái)存放中斷服務(wù)函數(shù)的。文件中默認(rèn)只有幾個(gè)關(guān)于系統(tǒng)異常的中斷服務(wù)函數(shù),而且都是空函數(shù),在需要的時(shí)候自已進(jìn)行編寫(xiě)。那么中斷服務(wù)函數(shù)名是不是可以自己定義呢?不可以。中斷服務(wù)函數(shù)的名字必須要跟啟動(dòng)文件startup_stm32f10x_hd.s中的中斷向量表定義一致。以下為啟動(dòng)文件中定義的部分向量表:

      DCD     EXTI0_IRQHandler          ; EXTI Line 0

      DCD     EXTI1_IRQHandler          ; EXTI Line 1

      DCD     EXTI2_IRQHandler          ; EXTI Line 2

      DCD     EXTI3_IRQHandler          ; EXTI Line 3

      DCD     EXTI4_IRQHandler          ; EXTI Line 4

      DCD     DMA1_Channel1_IRQHandler  ; DMA1 Channel 1

      DCD     DMA1_Channel2_IRQHandler  ; DMA1 Channel 2

      DCD     DMA1_Channel3_IRQHandler  ; DMA1 Channel 3

      DCD     DMA1_Channel4_IRQHandler  ; DMA1 Channel 4

      DCD     DMA1_Channel5_IRQHandler  ; DMA1 Channel 5

      DCD     DMA1_Channel6_IRQHandler  ; DMA1 Channel 6

      DCD     DMA1_Channel7_IRQHandler  ; DMA1 Channel 7

      DCD     ADC1_2_IRQHandler         ; ADC1 & ADC2

      DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX

      DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0

      DCD     CAN1_RX1_IRQHandler       ; CAN1 RX1

      DCD     CAN1_SCE_IRQHandler       ; CAN1 SCE

      DCD     EXTI9_5_IRQHandler        ; EXTI Line 9..5

      DCD     TIM1_BRK_IRQHandler       ; TIM1 Break

      DCD     TIM1_UP_IRQHandler        ; TIM1 Update

      DCD     TIM1_TRG_COM_IRQHandler   ; TIM1 Trigger and Commutation

      DCD     TIM1_CC_IRQHandler        ; TIM1 Capture Compare

      DCD     TIM2_IRQHandler           ; TIM2

      DCD     TIM3_IRQHandler           ; TIM3

      DCD     TIM4_IRQHandler           ; TIM4

      DCD     I2C1_EV_IRQHandler        ; I2C1 Event

      DCD     I2C1_ER_IRQHandler        ; I2C1 Error

      DCD     I2C2_EV_IRQHandler        ; I2C2 Event

      DCD     I2C2_ER_IRQHandler        ; I2C2 Error

      DCD     SPI1_IRQHandler           ; SPI1

      DCD     SPI2_IRQHandler           ; SPI2

      DCD     USART1_IRQHandler         ; USART1

      DCD     USART2_IRQHandler         ; USART2

      DCD     USART3_IRQHandler         ; USART3

      DCD     EXTI15_10_IRQHandler      ; EXTI Line 15..10

      第18行,為EXTI9_5IRQHandler,表示為EXTI9~EXTI5中斷向量的服務(wù)函數(shù)名。

      于是,我們就可以在stm32f10x_it.c文件中加入名為EXTI9_5_IRQHandler()的函數(shù):

      /* I/O線中斷,中斷線為PE5 */

      void EXTI9_5_IRQHandler(void)

      {

      if(EXTI_GetITStatus(EXTI_Line5) != RESET) //確保是否產(chǎn)生了EXTI Line中斷

      {

      // LED1 取反

      GPIO_WriteBit(GPIOC, GPIO_Pin_3,

      (BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3))));

      EXTI_ClearITPendingBit(EXTI_Line5);     //清除中斷標(biāo)志位

      }

      }

      其內(nèi)容比較容易理解,進(jìn)入中斷后,調(diào)用庫(kù)函數(shù)EXTI_GetITStatus() 來(lái)重新檢查是否產(chǎn)生了EXTI_Line中斷,接下來(lái)把LED取反,操作完畢后,調(diào)用EXTI_ClearITPendingBit() 清除中斷標(biāo)置位再退出中斷服務(wù)函數(shù)。這兩個(gè)函數(shù)的解釋見(jiàn)圖 06及圖 07。

         

      圖 06EXTI狀態(tài)檢查函數(shù)

       

      圖 07 EXTI清除標(biāo)志位函數(shù)

         這兩種函數(shù)在ST庫(kù)函數(shù)非常見(jiàn),當(dāng)我們要讀取某外設(shè)的狀態(tài)時(shí),可調(diào)用該外設(shè)的XXX_GetFlagStatus()函數(shù)來(lái)獲取該狀態(tài)。一般也有XXX_ClearFlag()庫(kù)函數(shù)可供調(diào)用,進(jìn)行相應(yīng)的標(biāo)志位清除。

      中斷服務(wù)程序比較簡(jiǎn)單,很容易讀懂,但我們?cè)趯?xiě)中斷函數(shù)入口的時(shí)候要注意函數(shù)名的寫(xiě)法,函數(shù)名只有兩種命名方法:

      1-> EXTI0_IRQHandler          ; EXTI Line 0

      EXTI1_IRQHandler          ; EXTI Line 1

      EXTI2_IRQHandler          ; EXTI Line 2

      EXTI3_IRQHandler          ; EXTI Line 3

      EXTI4_IRQHandler          ; EXTI Line 4

      2-> EXTI9_5_IRQHandler        ; EXTI Line 9..5

      EXTI15_10_IRQHandler      ; EXTI Line 15..10

      只要是中斷線在5之后的就不能像0~4那樣單獨(dú)一個(gè)函數(shù)名,都必須寫(xiě)成EXTI9_5_IRQHandlerEXTI15_10_IRQHandler。假如寫(xiě)成EXTI5_IRQHandlerEXTI6_IRQHandler……EXTI15_IRQHandler這樣子的話(huà)編譯器是不會(huì)報(bào)錯(cuò)的,只是中斷服務(wù)程序不能工作罷了。如果你不知道的話(huà),會(huì)讓你搞半天也不知問(wèn)題出現(xiàn)在哪。

       8.4.11實(shí)驗(yàn)現(xiàn)象

      將野火STM32開(kāi)發(fā)板供電(DC5V),插上JLINK,將編譯好的程序下載到開(kāi)發(fā)板,LED1亮,按下按鍵時(shí)LED1滅,再按下按鍵時(shí)LED1亮,如此循環(huán)。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多