找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5473|回復(fù): 1
收起左側(cè)

[零基礎(chǔ)學(xué)習(xí)STM32]第三講:EXTI中斷輸入實(shí)驗(yàn)—讀取ARM按鍵狀態(tài)

[復(fù)制鏈接]
ID:278743 發(fā)表于 2018-2-2 22:07 | 顯示全部樓層 |閱讀模式
本帖最后由 kkhkbb 于 2018-3-3 09:53 編輯

一、概述
1、中斷簡(jiǎn)介
   中斷是指計(jì)算機(jī)運(yùn)行過(guò)程中,出現(xiàn)某些意外情況需主機(jī)干預(yù)時(shí),機(jī)器能自動(dòng)停止正在運(yùn)行的程序并轉(zhuǎn)入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續(xù)運(yùn)行。
   中斷的分類:
(1)硬件中斷
  • 可屏蔽中斷:硬件中斷的一類,可通過(guò)在中斷屏蔽寄存器中設(shè)定位掩碼來(lái)關(guān)閉。
  • 非可屏蔽中斷:硬件中斷的一類,無(wú)法通過(guò)在中斷屏蔽寄存器中設(shè)定位掩碼來(lái)關(guān)閉。典型例子是時(shí)鐘中斷(一個(gè)硬件時(shí)鐘以恒定頻率50Hz—發(fā)出的中斷)。
  • 處理器中斷:一種特殊的硬件中斷。由處理器發(fā)出,被其它處理器接收。僅見(jiàn)于多處理器系統(tǒng),以便于處理器間通信或同步。
  • 偽中斷:一類不希望被產(chǎn)生的硬件中斷。發(fā)生的原因有很多種,如中斷線路上電氣信號(hào)異常,或是中斷請(qǐng)求設(shè)備本身有問(wèn)題。
(2)軟件中斷:是一條CPU指令,用以自陷一個(gè)中斷。由于軟中斷指令通常運(yùn)行一個(gè)切換CPU至內(nèi)核態(tài)的子例程,它常被用作實(shí)現(xiàn)系統(tǒng)調(diào)用。
   中斷優(yōu)先權(quán):
   在某一時(shí)刻有幾個(gè)中斷源同時(shí)發(fā)出中斷請(qǐng)求時(shí),處理器只響應(yīng)其中優(yōu)先權(quán)最高的中斷源。當(dāng)處理機(jī)正在運(yùn)行某個(gè)中斷服務(wù)程序期間出現(xiàn)另一個(gè)中斷源的請(qǐng)求時(shí),如果后者的優(yōu)先權(quán)低于前者,處理機(jī)不予理睬,反之,處理機(jī)立即響應(yīng)后者,進(jìn)入所謂的“嵌套中斷”。中斷優(yōu)先權(quán)的排序按其性質(zhì)、重要性以及處理的方便性決定,由硬件的優(yōu)先權(quán)仲裁邏輯或軟件的順序詢問(wèn)程序來(lái)實(shí)現(xiàn)。
   中斷過(guò)程:
(1)中斷源發(fā)出中斷請(qǐng)求;
(2)判斷當(dāng)前處理機(jī)是否允許中斷和該中斷源是否被屏蔽;
(3)優(yōu)先權(quán)排隊(duì);
(4)處理機(jī)執(zhí)行完當(dāng)前指令或當(dāng)前指令無(wú)法執(zhí)行完,則立即停止當(dāng)前程序保護(hù)斷點(diǎn)地址和處理機(jī)當(dāng)前狀態(tài),轉(zhuǎn)入相應(yīng)的中斷服務(wù)程序。
(5)執(zhí)行中斷服務(wù)程序;
(6)恢復(fù)被保護(hù)的狀態(tài),執(zhí)行“中斷返回”指令回到被中斷的程序或轉(zhuǎn)入其他程序。
  2、外部中斷/事件控制器(EXTI)
    EXTI主要特性:
(1)每個(gè)中斷/事件線上都具有獨(dú)立的觸發(fā)和屏蔽。
(2)每個(gè)中斷線都具有專用的狀態(tài)位。
(3)支持多達(dá)23個(gè)軟件事件/中斷請(qǐng)求。
190602dqqlrddvbdxw2lpw.png
       圖3_0外部中斷/事件控制器框圖
   外部中斷/事件線映射:
    多達(dá)140個(gè)的GPIO通過(guò)以下方式連接到16個(gè)外部中斷/事件線:
190722vixljcjclinnl5tp.png
       圖3_1外部中斷/事件線映射圖
     另外七根EXTI線連接方式如下:
  • EXTI16連接到PVD輸出。
  • EXTI17連接到RTC鬧鐘事件
  • EXTI18連接到USB OTG FS 喚醒事件。
  • EXTI19連接到以太網(wǎng)喚醒事件。
  • EXTI20連接到USB OTG HS (在FS中配置)喚醒事件
  • EXTI21連接到RTC入侵和時(shí)間戳事件。
  • EXTI22連接到RTC喚醒事件。
3、STM32中斷優(yōu)先級(jí)的判斷
       STM32 目前支持的中斷共為 84 個(gè)(16 個(gè)內(nèi)核+68 個(gè)外部), 16 級(jí)可編程中斷優(yōu)先級(jí)的設(shè)置(僅使用中斷優(yōu)先級(jí)設(shè)置 8bit 中的高 4 位)和16個(gè)搶占優(yōu)先級(jí)(因?yàn)閾屨純?yōu)先級(jí)最多可以有四位數(shù))。
       STM32(Cortex-M3)中有兩個(gè)優(yōu)先級(jí)的概念——搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí),有人把響應(yīng)優(yōu)先級(jí)稱作'亞優(yōu)先級(jí)'或'副優(yōu)先級(jí)',每個(gè)中斷源都需要被指定這兩種優(yōu)先級(jí)。  具有高搶占式優(yōu)先級(jí)的中斷可以在具有低搶占式優(yōu)先級(jí)的中斷處理過(guò)程中被響應(yīng),即中斷嵌套,或者說(shuō)高搶占式優(yōu)先級(jí)的中斷可以嵌套低搶占式優(yōu)先級(jí)的中斷。
      當(dāng)兩個(gè)中斷源的搶占式優(yōu)先級(jí)相同時(shí),這兩個(gè)中斷將沒(méi)有嵌套關(guān)系,當(dāng)一個(gè)中斷到來(lái)后,如果正在處理另一個(gè)中斷,這個(gè)后到來(lái)的中斷就要等到前一個(gè)中斷處理完之后才能被處理。如果這兩個(gè)中斷同時(shí)到達(dá),則中斷控制器根據(jù)他們的響應(yīng)優(yōu)先級(jí)高低來(lái)決定先處理哪一個(gè);如果他們的搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)都相等,則根據(jù)他們?cè)谥袛啾碇械呐盼豁樞驔Q定先處理哪一個(gè)。
  優(yōu)先級(jí)分組:
  中斷優(yōu)先級(jí)分組域中,可以有8種分配方式,如下:
  所有8位用于指定響應(yīng)優(yōu)先級(jí)。
  最高1位用于指定搶占式優(yōu)先級(jí)。
  最低7位用于指定響應(yīng)優(yōu)先級(jí)。
  最高2位用于指定搶占式優(yōu)先級(jí)。
  最低6位用于指定響應(yīng)優(yōu)先級(jí)。
  最高3位用于指定搶占式優(yōu)先級(jí)。
  最低5位用于指定響應(yīng)優(yōu)先級(jí)。
  最高4位用于指定搶占式優(yōu)先級(jí)。
  最低4位用于指定響應(yīng)優(yōu)先級(jí)。
  最高5位用于指定搶占式優(yōu)先級(jí)。
  最低3位用于指定響應(yīng)優(yōu)先級(jí)。
  最高6位用于指定搶占式優(yōu)先級(jí)。
  最低2位用于指定響應(yīng)優(yōu)先級(jí)。
  最高7位用于指定搶占式優(yōu)先級(jí)。
  最低1位用于指定響應(yīng)優(yōu)先級(jí)。
二、硬件電路
190943vssx673d1npdcscs.png
             圖3_2引腳分布圖
191002w4fhc7nx4cueaex2.png
             圖3_3電路原理圖
   在iCore3雙核心開(kāi)發(fā)板中,采用一個(gè)獨(dú)立的按鍵與STM32F407的GPIO相連,另一端接地,且PH15外接一個(gè)1k電阻大小的上拉電阻。
三、實(shí)驗(yàn)原理
      按鍵的一端與SMT32的GPIO(PH15)相連,另一端接地,且PH15外接一個(gè)1K電流大小的上拉電阻。初始化時(shí)把PH15設(shè)置成輸入模式。當(dāng)按鍵彈起時(shí)候,PH15由于上拉電阻的作用呈高電平(3.3V);當(dāng)按鍵按下時(shí)候,PH15直接被按鍵短接到GND,呈低電平。因此PH15的電平變化產(chǎn)生下降沿,從而進(jìn)入中斷函數(shù),可得到按鍵狀態(tài)。原理圖如下:
191055werhcrtzc7amy6ae.png
             圖3_4實(shí)驗(yàn)原理圖
四、源代碼
1、主函數(shù)
  1. /*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. int main(void)
  15. {
  16.         led.initialize();
  17.         exti.initialize();
  18.         LED_RED_ON;
  19.         LED_GREEN_OFF;
  20.         LED_BLUE_OFF;

  21.         while(1);
復(fù)制代碼
2、GPIO初始化
  1. /*
  2. * Name               : initialize
  3. * Description        : ---
  4. * Author             : ysloveivy.
  5. *
  6. * History
  7. * -------------------
  8. * Rev                : 0.00
  9. * Date               : 11/21/2015
  10. *
  11. * create.
  12. * -------------------
  13. */
  14. static int initialize(void)
  15. {
  16.         EXTI_InitTypeDef   EXTI_InitStructure;
  17.         GPIO_InitTypeDef   GPIO_InitStructure;
  18.         NVIC_InitTypeDef   NVIC_InitStructure;

  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);                    //使能GPIOH時(shí)鐘
  20.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);                  //使能SYSCFG時(shí)鐘

  21.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  23.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  24.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  25.         GPIO_Init(GPIOH, &GPIO_InitStructure);

  26.         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOH, EXTI_PinSource15);          //PH15與EXTI15連接

  27.         EXTI_InitStructure.EXTI_Line = EXTI_Line15;                             //設(shè)置連接中斷線15
  28.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                     //設(shè)置中斷模式為中斷
  29.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                 //下降沿觸發(fā)
  30.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  31.         EXTI_Init(&EXTI_InitStructure);

  32.         //設(shè)置中斷優(yōu)先級(jí)分組
  33.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  34.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  35.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
  36.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  37.         NVIC_Init(&NVIC_InitStructure);

  38.         return 0;
  39. }

  40. /*
  41. * Name               : EXTI15_10_IRQHandler
  42. * Description        : ---
  43. * Author             : ysloveivy.
  44. *
  45. * History
  46. * -------------------
  47. * Rev                : 0.00
  48. * Date               : 11/21/2015
  49. *
  50. * create.
  51. * -------------------
  52. */
  53. void EXTI15_10_IRQHandler(void)
  54. {
  55.         int i;
  56.         static int work_status = 0;

  57.         if(EXTI_GetITStatus(EXTI_Line15) != RESET)
  58.         {
  59.                 for(i = 0;i < 1000;i++);
  60.                 if(!KEY_INPUT){
  61.                         work_status += 1;
  62.                         if(work_status > 2)work_status = 0;
  63.                 }
  64.                 switch(work_status){
  65.                         case 0:
  66.                                 LED_RED_ON;
  67.                                 LED_GREEN_OFF;
  68.                                 LED_BLUE_OFF;
  69.                                 break;
  70.                         case 1:
  71.                                 LED_RED_OFF;
  72.                                 LED_GREEN_ON;
  73.                                 LED_BLUE_OFF;
  74.                                 break;
  75.                         case 2:
  76.                                 LED_RED_OFF;
  77.                                 LED_GREEN_OFF;
  78.                                 LED_BLUE_ON;
  79.                                 break;
  80.                         default:

  81.                                 break;
  82.                 }
  83.                 EXTI_ClearITPendingBit(EXTI_Line15);
  84.         }
  85. }
復(fù)制代碼
3、小知識(shí):
設(shè)置中斷和優(yōu)先級(jí)主要用到以下兩個(gè)結(jié)構(gòu)體:
中斷設(shè)置結(jié)構(gòu)體:
  1. typedef struct
  2. {
  3.   uint32_t EXTI_Line;                        //設(shè)置連接中斷線
  4.   EXTIMode_TypeDef EXTI_Mode;              //設(shè)置中斷模式
  5.   EXTITrigger_TypeDef EXTI_Trigger;      //觸發(fā)方式                                 
  6.   FunctionalState EXTI_LineCmd;           //使能與否

  7. }EXTI_InitTypeDef;
復(fù)制代碼
優(yōu)先級(jí)設(shè)置結(jié)構(gòu)體:
  1. typedef struct
  2. {
  3.   uint8_t NVIC_IRQChannel;                       //嵌套向量中斷控制器通道

  4.   uint8_t NVIC_IRQChannelPreemptionPriority; //搶占優(yōu)先級(jí)

  5.   uint8_t NVIC_IRQChannelSubPriority;         //相應(yīng)優(yōu)先級(jí)

  6.   FunctionalState NVIC_IRQChannelCmd;         //使能與否
  7. } NVIC_InitTypeDef;
復(fù)制代碼
  可以通過(guò)以上兩個(gè)結(jié)構(gòu)體來(lái)配置中斷和優(yōu)先級(jí)。
五、實(shí)驗(yàn)現(xiàn)象
  按鍵每按下一次,三色LED燈變換(紅色、綠色、藍(lán)色輪流變換)一次。
六、代碼包下載
  網(wǎng)盤(pán):http://pan.baidu.com/s/1o6xToN4


iCore3_3_EXTI.zip

3.1 MB, 下載次數(shù): 13, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:233200 發(fā)表于 2018-4-6 12:16 | 顯示全部樓層
非常感謝,最近就是在學(xué)習(xí)中斷
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表