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

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

作者: kkhkbb    時間: 2018-2-2 22:07
標題: [零基礎學習STM32]第三講:EXTI中斷輸入實驗—讀取ARM按鍵狀態
本帖最后由 kkhkbb 于 2018-3-3 09:53 編輯

一、概述
1、中斷簡介
   中斷是指計算機運行過程中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程序并轉入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續運行。
   中斷的分類:
(1)硬件中斷
(2)軟件中斷:是一條CPU指令,用以自陷一個中斷。由于軟中斷指令通常運行一個切換CPU至內核態的子例程,它常被用作實現系統調用。
   中斷優先權:
   在某一時刻有幾個中斷源同時發出中斷請求時,處理器只響應其中優先權最高的中斷源。當處理機正在運行某個中斷服務程序期間出現另一個中斷源的請求時,如果后者的優先權低于前者,處理機不予理睬,反之,處理機立即響應后者,進入所謂的“嵌套中斷”。中斷優先權的排序按其性質、重要性以及處理的方便性決定,由硬件的優先權仲裁邏輯或軟件的順序詢問程序來實現。
   中斷過程:
(1)中斷源發出中斷請求;
(2)判斷當前處理機是否允許中斷和該中斷源是否被屏蔽;
(3)優先權排隊;
(4)處理機執行完當前指令或當前指令無法執行完,則立即停止當前程序保護斷點地址和處理機當前狀態,轉入相應的中斷服務程序。
(5)執行中斷服務程序;
(6)恢復被保護的狀態,執行“中斷返回”指令回到被中斷的程序或轉入其他程序。
  2、外部中斷/事件控制器(EXTI)
    EXTI主要特性:
(1)每個中斷/事件線上都具有獨立的觸發和屏蔽。
(2)每個中斷線都具有專用的狀態位。
(3)支持多達23個軟件事件/中斷請求。
       圖3_0外部中斷/事件控制器框圖
   外部中斷/事件線映射:
    多達140個的GPIO通過以下方式連接到16個外部中斷/事件線:
       圖3_1外部中斷/事件線映射圖
     另外七根EXTI線連接方式如下:
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燈變換(紅色、綠色、藍色輪流變換)一次。
六、代碼包下載
  網盤:http://pan.baidu.com/s/1o6xToN4


iCore3_3_EXTI.zip

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


作者: 失心戀2015    時間: 2018-4-6 12:16
非常感謝,最近就是在學習中斷




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲国产成人精品久久 | 国产三级精品视频 | 午夜影院在线免费观看 | 久热久 | 国产剧情一区 | 国产精品毛片va一区二区三区 | 免费av观看 | 亚洲福利片 | 久久机热这里只有精品 | 国产三级黄色片 | 欧美日韩免费一区二区三区 | 国产成人精品网站 | 日韩欧美国产综合 | 手机看片在线 | 九九热在线视频观看 | 黄色一级免费看 | 超碰在线中文字幕 | 综合激情网站 | 热久久免费视频 | 天天看天天操 | 亚洲福利视频一区 | 日日操日日干 | 日韩视频在线观看 | 欧美成人一区二区 | 一区二区网站 | 午夜视频在线看 | 国产一区二区网站 | 一级特黄妇女高潮 | 日本成人黄色 | 亚洲一区二区久久 | av手机在线免费观看 | 国产精品久久久国产盗摄 | 久久er99热精品一区二区 | 亚洲精品色图 | 亚洲日本在线观看 | 色在线视频 | 亚洲午夜一区 | 成人永久免费视频 | 嫩草视频在线观看 | 色婷婷网| 日韩视频一区二区 |