嵌入式02 STM32 外部中斷實驗

来源:https://www.cnblogs.com/ksht-wdyx/archive/2019/10/05/11625786.html
-Advertisement-
Play Games

一、中斷 由於某個事件的發生,CPU暫停當前正在執行的程式,轉而執行處理事件的一個程式。該程式執行完成後,CPU接著執行被暫停的程式。這個過程稱為中斷。(我正在捉泥鰍,但是我媽喊我回家吃飯,我必須回家吃飯,回家途中,發現泥鰍沒帶,回去把泥鰍帶回家,然後吃完飯繼續捉泥鰍!!!) 中斷是CPU處理外部突 ...


 一、中斷

  由於某個事件的發生,CPU暫停當前正在執行的程式,轉而執行處理事件的一個程式。該程式執行完成後,CPU接著執行被暫停的程式。這個過程稱為中斷。(我正在捉泥鰍,但是我媽喊我回家吃飯,我必須回家吃飯,回家途中,發現泥鰍沒帶,回去把泥鰍帶回家,然後吃完飯繼續捉泥鰍!!!)

  中斷是CPU處理外部突發事件的一個重要技術。引起中斷的原因或者說發出中斷請求的來源叫做中斷源。根據中斷源的不同,可以分為硬體中斷和軟體中斷兩大類,有了中斷,系統可以更好更快的利用有限的系統資源解決系統響應速度和運行效率的一種控制技術。它的作用就是可以使你的電腦系統運行更快更平穩。

  一方面,有了中斷功能,系統就可以使CPU和外設同時工作,使系統可以及時的響應外部事件。而且有了中斷功能,CPU可以允許多個外設同時工作。這樣就大大提高了CPU的利用率,也提高了數據輸入、輸出速度。另一方面,有了中斷功能,就可以使CPU及時處理各種軟硬體故障。電腦在運行過程中,往往會出現事先預料不到的情況或出現一些故障,如電源掉電,存儲出錯,運算溢出等等。電腦可以利用中斷處理系統自行處理,而不必停機或報告工作人員。

  1、硬體中斷根據來源的位置分為:

    內部中斷(不可屏蔽中斷):少數,中斷源在CPU的內部,如突然掉電,奇偶校驗錯、除數為0、運算溢出、單步中斷(軟體調試時可以使用,每執行一條指令,就中斷一次)等

    外部中斷(可屏蔽中斷):多數,中斷源在CPU的外部,一般是指由電腦外設發出的中斷請求,如鍵盤中斷、印表機中斷、定時器中斷。可以使用中斷控制器屏蔽外部設備的中斷。

  2、是否可屏蔽分為:

    可屏蔽中斷

    不可屏蔽中斷

  3、中斷來源:

    軟體中斷

    硬體中斷

二、中斷與事件

 概念:

  事件:是表示檢測到某一動作(電平邊緣)觸發事件發生了,由硬體自動完成的觸發到產生結果的通道解決(響應速度快)。

  中斷:有某個事件發生並產生中斷,並跳轉到對應的中斷處理程式中,需要CPU接入(響應速度慢)。

 區別:

  中斷有可能被更優先的中斷屏蔽,事件不會;事件本質上就是一個觸發信號,是用來觸發特定的外設模塊或核心本身(喚醒);事件只是一個觸發信號(脈衝),而中斷則是一個固定的電平信號;事件是中斷的觸發源,事件可以觸發中斷,也可以不觸發,開放了對應的中斷屏蔽位,則事件可以觸發相應的中斷。事件還是其它一些操作的觸發源,比如DMA(Direct Memory Access,直接存儲器存取),還有TIM中影子寄存器的傳遞與更新。

  簡言之,中斷一定要有中斷服務函數,中斷必須要CPU介入,但是事件卻沒有對應的函數。事件可以在不需要CPU干預的情況下,執行某些操作,事件機制提供了一個完全由硬體自動完成的觸發到產生結果的通道,不要軟體的參與,降低了CPU的負荷,節省了中斷資源,提高了響應速度(硬體總快於軟體),是利用硬體來提升CPU晶元處理事件能力的一個有效方法;

三、實驗內容

  實驗中按下按鍵0觸發中斷線4,搶占優先順序2,子優先順序為2,中斷反應函數EXTI4_IRQHandler(),控制LED0和LED1的狀態取反

  1、初始化IO口為輸入                                              KEY_Init();           

  2、開啟AFIO時鐘                                                    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

  3、設置IO口與中斷線的映射關係                                 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);

  4、初始化線上中斷,設置觸發條件等                          EXTI_Init(&KST_EXTI_Structure);

  5、配置中斷分組(NVIC),並使能中斷                     NVIC_Init(&KST_NVIC_Structure);

  6、編寫中斷服務函數              EXTI4_IRQHandler();

  7、清除中斷服務函數              EXTI_ClearITPendingBit(EXTI_Line4);

 1 #include "exti.h"
 2 #include "key.h"
 3 #include "led.h"
 4 #include "beep.h"
 5 #include "delay.h"
 6 #include "usart.h"
 7 
 8 
 9 void EXTIX_Init(void)
10 {
11     EXTI_InitTypeDef KST_EXTI_Structure;
12     NVIC_InitTypeDef KST_NVIC_Structure;
13     
14     KEY_Init();           //按鍵初始化
15     
16     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);             //使能IO口復用時鐘
17     
18     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);      //設置IO口與中斷線的映射關係
19     
20     KST_EXTI_Structure.EXTI_Line = EXTI_Line4;        //配置中斷線4
21     KST_EXTI_Structure.EXTI_LineCmd = ENABLE;            //使能
22     KST_EXTI_Structure.EXTI_Mode = EXTI_Mode_Interrupt;         //外部中斷
23     KST_EXTI_Structure.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿觸發
24     EXTI_Init(&KST_EXTI_Structure);            //初始化線上中斷,設置觸發條件
25     
26     KST_NVIC_Structure.NVIC_IRQChannel = EXTI4_IRQn;                
27     KST_NVIC_Structure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
28     KST_NVIC_Structure.NVIC_IRQChannelPreemptionPriority = 2;//搶占優先順序2
29     KST_NVIC_Structure.NVIC_IRQChannelSubPriority = 2;    //子優先順序2
30     NVIC_Init(&KST_NVIC_Structure);            //中斷優先順序初始化
31     
32 }
33 
34 void EXTI4_IRQHandler(void)
35 {
36     delay_ms(10);
37     if(KEY0==0)
38     {
39         LED0 = !LED0;
40         LED1 = !LED1;
41     }
42     EXTI_ClearITPendingBit(EXTI_Line4);           //手動清除中斷線4的標誌位
43 }

 主函數

 

 1 #include "sys.h"
 2 #include "exti.h"
 3 #include "beep.h"
 4 #include "key.h"
 5 #include "delay.h"
 6 #include "led.h"
 7 #include "usart.h"
 8 
 9 int main()
10 {
11     delay_init();
12     LED_Init();                    //LED初始化
13     KEY_Init();                    //按鍵初始化
14     BEEP_Init();                //蜂鳴器初始化
15     EXTIX_Init();                //外部中斷初始化
16     uart_init(115200);            //串口初始化
17     LED0 = 0;
18     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //設置NVIC中斷分組2:2位搶占優先順序,2位響應優先順序
19     while(1)
20     {
21         printf("OK\r\n");
22         delay_ms(1000);
23     }
24     
25 }
26 
27     

 

 

 

  

  

    


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #include<stdio.h>#include<stdlib.h>#define MAX 100 typedef struct bNode{ double no; char name[MAX]; double price; struct bNode * next;}bNode,*bLnode; ...
  • 將數字以字元串輸出函數repr(): temp = 42 print = "Hello," + repr(temp) 註:在python3.0以前可使用反引號``實現,但之後便不再支持,如: 註:還可以使用str()實現,原理就是數值類型轉換。函數str() 用於將值轉化為適於人閱讀的形式,而rep ...
  • java當中JDBC當中請給出一個SQLServer DataSource and SingleTon例子 ...
  • 前言 上一章介紹了Docker通過多條命令創建啟動運行Docker容器,由此可見這樣一個個去創建單獨的容器也是相當麻煩的,比如要在某個複雜項目中用DB、緩存、消息等等,這樣我們還要去一個個再創建,為此這時候需要用上我們三劍客中的一員大將自動擋的( DockerCompose ). Compose 是 ...
  • SignalR是為了提供更方便的web交互響應式到推送式的解決方案。有了它之後可以實現客戶端直接調用服務端的方法並且獲得返回值 (客戶端可以是各種平臺,目前SignalR支持的語言版本有C#、java、javaScript、nodejs等),服務端也是可以調用客戶端的方法,通過這樣的方式實現了由原來 ...
  • 點這裡進入ABP開發手記目錄 效果預覽 至此,基於ABP的CURD(增刪改查)示例已完成,效果如下 登錄 首頁 查詢課程 新增課程 修改課程 刪除課程 階段總結 關鍵步驟: 領域層創建實體基礎設施層更新資料庫應用層創建應用服務展示層實現增刪改查 迴圈往複此步驟即可創建多個CURD頁面. ...
  • 背景 By 魯迅 By 高爾基 說明: 1. Kernel版本:4.14 2. ARM64處理器,Contex A53,雙核 3. 使用工具:Source Insight 3.5, Visio 1. 介紹 之前的系列記憶體管理文章基本上描述的是物理頁面的初始化過程,以及虛擬頁面到物理頁面的映射建立過程 ...
  • Elasticsearch 集群搭建 環境及軟體 centos7 elasticsearch 7.4.0 因為ES7已經內置了所需的java的JDK版本,因此在此不再介紹java安裝 ES7安裝方式使用RPM安裝方式。 es節點列表 | ip | 節點名 | | | | |192.168.1.100 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...