久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5455|回復: 1
打印 上一主題 下一主題
收起左側

[零基礎學習STM32]第三講:EXTI中斷輸入實驗—讀取ARM按鍵狀態

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 kkhkbb 于 2018-3-3 09:53 編輯

一、概述
1、中斷簡介
   中斷是指計算機運行過程中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程序并轉入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續運行。
   中斷的分類:
(1)硬件中斷
  • 可屏蔽中斷:硬件中斷的一類,可通過在中斷屏蔽寄存器中設定位掩碼來關閉。
  • 非可屏蔽中斷:硬件中斷的一類,無法通過在中斷屏蔽寄存器中設定位掩碼來關閉。典型例子是時鐘中斷(一個硬件時鐘以恒定頻率50Hz—發出的中斷)。
  • 處理器中斷:一種特殊的硬件中斷。由處理器發出,被其它處理器接收。僅見于多處理器系統,以便于處理器間通信或同步。
  • 偽中斷:一類不希望被產生的硬件中斷。發生的原因有很多種,如中斷線路上電氣信號異常,或是中斷請求設備本身有問題。
(2)軟件中斷:是一條CPU指令,用以自陷一個中斷。由于軟中斷指令通常運行一個切換CPU至內核態的子例程,它常被用作實現系統調用。
   中斷優先權:
   在某一時刻有幾個中斷源同時發出中斷請求時,處理器只響應其中優先權最高的中斷源。當處理機正在運行某個中斷服務程序期間出現另一個中斷源的請求時,如果后者的優先權低于前者,處理機不予理睬,反之,處理機立即響應后者,進入所謂的“嵌套中斷”。中斷優先權的排序按其性質、重要性以及處理的方便性決定,由硬件的優先權仲裁邏輯或軟件的順序詢問程序來實現。
   中斷過程:
(1)中斷源發出中斷請求;
(2)判斷當前處理機是否允許中斷和該中斷源是否被屏蔽;
(3)優先權排隊;
(4)處理機執行完當前指令或當前指令無法執行完,則立即停止當前程序保護斷點地址和處理機當前狀態,轉入相應的中斷服務程序。
(5)執行中斷服務程序;
(6)恢復被保護的狀態,執行“中斷返回”指令回到被中斷的程序或轉入其他程序。
  2、外部中斷/事件控制器(EXTI)
    EXTI主要特性:
(1)每個中斷/事件線上都具有獨立的觸發和屏蔽。
(2)每個中斷線都具有專用的狀態位。
(3)支持多達23個軟件事件/中斷請求。
       圖3_0外部中斷/事件控制器框圖
   外部中斷/事件線映射:
    多達140個的GPIO通過以下方式連接到16個外部中斷/事件線:
       圖3_1外部中斷/事件線映射圖
     另外七根EXTI線連接方式如下:
  • EXTI16連接到PVD輸出
  • EXTI17連接到RTC鬧鐘事件
  • EXTI18連接到USB OTG FS 喚醒事件
  • EXTI19連接到以太網喚醒事件
  • EXTI20連接到USB OTG HS (在FS中配置)喚醒事件
  • EXTI21連接到RTC入侵和時間戳事件
  • EXTI22連接到RTC喚醒事件
3、STM32中斷優先級的判斷
       STM32 目前支持的中斷共為 84 個(16 個內核+68 個外部), 16 級可編程中斷優先級的設置(僅使用中斷優先級設置 8bit 中的高 4 位)和16個搶占優先級(因為搶占優先級最多可以有四位數)。
       STM32(Cortex-M3)中有兩個優先級的概念——搶占式優先級和響應優先級,有人把響應優先級稱作'亞優先級'或'副優先級',每個中斷源都需要被指定這兩種優先級。  具有高搶占式優先級的中斷可以在具有低搶占式優先級的中斷處理過程中被響應,即中斷嵌套,或者說高搶占式優先級的中斷可以嵌套低搶占式優先級的中斷。
      當兩個中斷源的搶占式優先級相同時,這兩個中斷將沒有嵌套關系,當一個中斷到來后,如果正在處理另一個中斷,這個后到來的中斷就要等到前一個中斷處理完之后才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先級高低來決定先處理哪一個;如果他們的搶占式優先級和響應優先級都相等,則根據他們在中斷表中的排位順序決定先處理哪一個。
  優先級分組:
  中斷優先級分組域中,可以有8種分配方式,如下:
  所有8位用于指定響應優先級。
  最高1位用于指定搶占式優先級。
  最低7位用于指定響應優先級。
  最高2位用于指定搶占式優先級。
  最低6位用于指定響應優先級。
  最高3位用于指定搶占式優先級。
  最低5位用于指定響應優先級。
  最高4位用于指定搶占式優先級。
  最低4位用于指定響應優先級。
  最高5位用于指定搶占式優先級。
  最低3位用于指定響應優先級。
  最高6位用于指定搶占式優先級。
  最低2位用于指定響應優先級。
  最高7位用于指定搶占式優先級。
  最低1位用于指定響應優先級。
二、硬件電路
             圖3_2引腳分布圖
             圖3_3電路原理圖
   在iCore3雙核心開發板中,采用一個獨立的按鍵與STM32F407的GPIO相連,另一端接地,且PH15外接一個1k電阻大小的上拉電阻。
三、實驗原理
      按鍵的一端與SMT32的GPIO(PH15)相連,另一端接地,且PH15外接一個1K電流大小的上拉電阻。初始化時把PH15設置成輸入模式。當按鍵彈起時候,PH15由于上拉電阻的作用呈高電平(3.3V);當按鍵按下時候,PH15直接被按鍵短接到GND,呈低電平。因此PH15的電平變化產生下降沿,從而進入中斷函數,可得到按鍵狀態。原理圖如下:
             圖3_4實驗原理圖
四、源代碼
1、主函數
  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);
復制代碼
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時鐘
  20.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);                  //使能SYSCFG時鐘

  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;                             //設置連接中斷線15
  28.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                     //設置中斷模式為中斷
  29.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                 //下降沿觸發
  30.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  31.         EXTI_Init(&EXTI_InitStructure);

  32.         //設置中斷優先級分組
  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. }
復制代碼
3、小知識:
設置中斷和優先級主要用到以下兩個結構體:
中斷設置結構體:
  1. typedef struct
  2. {
  3.   uint32_t EXTI_Line;                        //設置連接中斷線
  4.   EXTIMode_TypeDef EXTI_Mode;              //設置中斷模式
  5.   EXTITrigger_TypeDef EXTI_Trigger;      //觸發方式                                 
  6.   FunctionalState EXTI_LineCmd;           //使能與否

  7. }EXTI_InitTypeDef;
復制代碼
優先級設置結構體:
  1. typedef struct
  2. {
  3.   uint8_t NVIC_IRQChannel;                       //嵌套向量中斷控制器通道

  4.   uint8_t NVIC_IRQChannelPreemptionPriority; //搶占優先級

  5.   uint8_t NVIC_IRQChannelSubPriority;         //相應優先級

  6.   FunctionalState NVIC_IRQChannelCmd;         //使能與否
  7. } NVIC_InitTypeDef;
復制代碼
  可以通過以上兩個結構體來配置中斷和優先級。
五、實驗現象
  按鍵每按下一次,三色LED燈變換(紅色、綠色、藍色輪流變換)一次。
六、代碼包下載


iCore3_3_EXTI.zip

3.1 MB, 下載次數: 13, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:233200 發表于 2018-4-6 12:16 | 只看該作者
非常感謝,最近就是在學習中斷
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区在线观看 | 欧产日产国产精品国产 | 色av一区二区三区 | 颜色网站在线观看 | www.youjizz.com日韩 | 欧美激情久久久 | 亚洲免费网 | 久久99精品久久久97夜夜嗨 | 日韩久久久久 | 欧美日韩中文字幕在线 | 激情伊人网 | 激情小视频 | 亚洲免费一区二区 | 亚洲天堂久久 | 97人人澡人人爽91综合色 | 美女福利视频网站 | www.伊人.com| 男人av的天堂 | 福利一区在线观看 | 精品视频一区二区三区四区 | 中文字幕人成人 | 精品伊人久久 | 一区二区免费在线观看 | 久久久久久久久久久高潮一区二区 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 性色av一区二区三区 | 国产精华一区 | 欧美日韩视频 | av黄色在线| 亚洲欧美中文日韩在线v日本 | 先锋资源亚洲 | 国产精品亚洲成在人线 | 可以免费观看的av片 | av国产精品毛片一区二区小说 | 久久大香| 91精品国产91久久久久久最新 | 国产日产久久高清欧美一区 | 精品欧美一区二区三区久久久 | 亚洲国产精品激情在线观看 | 午夜在线小视频 | 国产精品久久久久久久久大全 |