GPIO外部中斷

来源:https://www.cnblogs.com/vinccc/archive/2018/01/12/8273559.html
-Advertisement-
Play Games

STM32的“中斷”機制很複雜,看了PM(Cortex-m4)和RM,對它只瞭解了一個大概。首先,與“中斷”相關的術語就有 exception, interrupt, event 三個。Cortex-m4核中包含一個NVIC控制器,用於處理 exception。而 interrupt 是屬於 exc ...


STM32的“中斷”機制很複雜,看了PM(Cortex-m4)和RM,對它只瞭解了一個大概。首先,與“中斷”相關的術語就有 exception, interrupt, event 三個。Cortex-m4核中包含一個NVIC控制器,用於處理 exception。而 interrupt 是屬於 exception 之一種,其它 exception 類型包括 SysTick等。interrupt 又叫作IRQ。

STM32之中、Cortex-m4核之外的“中斷”,即為 interrupt/IRQ。STM32通過 IRQ Channel 向 NVIC 請求處理 IRQ,而 NVIC 處理包括 IRQ 在內的各種 exception,例如:優先順序...等等。對於 IRQ,NVIC 將調用其“中斷處理程式” ISR。

有些 STM32 外圍介面直接通過 IRQ Channel 與 NVIC 介面,而 GPIO 外部中斷則要通過另一個控制器--EXTI--與NVIC介面。GPIO與 EXTI 之間的介面稱為 EXTI line;而 EXTI 與 NVIC之間則為 IRQ Channel。GPIO pin與EXTI line之間是n:1的關係,而EXTI line與 IRQ Channel之間也是n:1的關係。基本上,PXn 對應 EXTI line n,這裡X=A, B, ... H,n=0, 1, 2 ... 15。例如,PX2(PA2, PB2 ...)都對應於 EXTI line 2。

EXTI line與 IRQ Channel之間的對應關係則稍微複雜,16個 EXTI line 占用7個 IRQ:

  • EXTI line 0 - 4 分別對應一個IRQ,因此,共有5個 IRQ
  • EXTI line 5 - 9 共用一個IRQ
  • EXTI line 10 - 15 共用一個IRQ

此外,EXTI line 上除了支持 interrupt 之外,還支持 event。event 被觸發之後,並不傳遞給 NVIC 去處理(像 IRQ 那樣),而是發送一個脈衝給電源管理模塊,似乎是用來實現喚醒功能的。

GPIO、EXTI 與 NVIC 之間的關係,用下圖簡單表示:

 

因此,對於編程而言,需要對GPIO、EXTI、NVIC 3個模塊分別進行配置和操作。所幸,Cube HAL 以及 CubeMX 工具大大地降低了開發的複雜度。

Nucleo 開發板上有一個用戶按鈕B1和一個用戶LED LD2,可以用它們來實現一個簡單的 GPIO 外部中斷 Demo。Nucleo 原理圖顯示,B1 進行了 RC de-bouncing,因此可以作為外部中斷源。未經 de-bouncing 的按鈕,是不應該觸發中斷的。B1接在 PC13 口,已經設計了上拉電阻

 

 

 

使用CubeMX,將B1口模式設置為 GPIO_EXIT13。可見,PC13 使用了 EXTI line 13。另外,由於使用了上拉電阻,選擇中斷為下降沿觸發:

 

 

這樣,GPIO和 EXTI 就配置好了。別忘了還需要配置 NVIC。這裡只需要簡單地啟用它對應的 IRQ即可,其餘保持預設:

 

簡要分析一下 CubeMX 生成的代碼。首先,中斷向量表定義在啟動代碼 startup_stm32f303xe.s 中,在這個文件中可以看到所有 exception 處理程式(函數名),包括 EXTI ISR:

g_pfnVectors:
	.word	_estack
	.word	Reset_Handler
	.word	NMI_Handler
	...
	.word	SysTick_Handler
	...
	.word	EXTI0_IRQHandler
	.word	EXTI1_IRQHandler
	.word	EXTI2_TSC_IRQHandler
	.word	EXTI3_IRQHandler
	.word	EXTI4_IRQHandler
	...
	.word	EXTI9_5_IRQHandler
	....
	.word	EXTI15_10_IRQHandler
	....

  

其中,EXTI15_10_IRQHandler 就是按鈕B1的中斷處理程式。這個函數的實現在 stm32f3xx_it.c 中,它實際上僅僅調用了 Cube 庫的 HAL_GPIO_EXTI_IRQHandler() 函數,將埠號作為參數傳遞進去:

/**
* @brief This function handles EXTI line[15:10] interrupts.
*/
void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */

  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}

  

檢查 HAL_GPIO_EXTI_IRQHandler() 函數的實現,發現它位於 GPIO HAL 模塊內,它又調用了一個回調函數 HAL_GPIO_EXTI_Callback(),而該回調函數的預設實現聲明為 __weak 屬性,我們可以覆蓋:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
   ...

  

因此,我們在 stm32f3xx_it.c 增加 HAL_GPIO_EXTI_Callback() 的實現,每當B1按下,開/關LD2:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}

  

另外,在gpio.c 中的 MX_GPIO_Init() 函數中,看到了 NVIC 的配置,但並沒有看到與 EXTI 有關的配置。其實,EXTI 配置已由 HAL_GPIO_Init() 函數處理,不勞我們費心。也就是說,對 GPIO 的外部中斷的處理,要使用 GPIO 和 NVIC 2個Cube 模塊:

  ...
  HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
  ...
  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

  

 


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

-Advertisement-
Play Games
更多相關文章
  • 一. 準備工作 1. 點擊此下載支持.Net4.0的 iBatis.Net,工程中引用release文件夾下的dll 最新版(目前已不再更新),有稍作修改使其支持.NET4.0 2. 點擊此可查看 iBatis.Net 的幫助文檔 3. 點擊此下載 iBatis in Action 的中文版電子書, ...
  • 前言 經過前面幾章,我們的網站已經最基本的功能,接下來就是繼續拓展其他的功能,這期一起來實現一個該網站流量分析的工具,統計出這個網站每天用戶相關數據,不僅要滿足了我們對流量統計數字的基本要求,並且用更簡單的圖形顯示方式,讓我們一目瞭然地獲取頁面熱度、點擊率信息等等。有了這個想法以後,那怎麼實現呢,跟 ...
  • 本篇文章適合有一定的基礎的人去查看 ,最好學習過一定net 編程基礎在來查看此文章。 1.概念 DataSet是ADO.NET的中心概念。可以把DataSet當成記憶體中的資料庫,DataSet是不依賴於資料庫的獨立數據集合。所謂獨立,就是說,即使斷開數據鏈路,或者關閉資料庫,DataSet依然是可用 ...
  • 首先,建立一個GridView,放入DataTable如圖: 打開欄目設計器的話,是對數據進行操作: 我對aa bb兩行數據,進行了隱藏操作: 這樣可以看到,aa bb在GridView中是隱藏了的,但是如果沒有對新數據進行操作的話,導出的Excel是包含了aa bb兩列的,所以,對新數據進行保存操 ...
  • 網站發佈後經常遇到 字體文件請求不到的問題 配置webConfig可解決該問題 ...
  • 一. 開發環境 1. 此開發平臺主要用來開發基於.NET 4.0及以上版本的應用 2. 點擊此下載 Visual Studio 2012 Ultimate 中文版開發工具 3. 點擊此下載 DXperience-13.2.6 及破解文件 4. 點擊此下載 軟媒虛擬光碟機 5. 點擊此下載需要的 MyS ...
  • 最近公司要遷移.net 2.0的框架到.net core上,先搭建一個簡單環境,利用 IIS +Kestrel 運行了下,經過一下午折騰,成功了,記錄下。 放在有道雲筆記了,這裡是連接. https://note.youdao.com/share/?id=c28de2285dfa746b801656 ...
  • 執行表達式樹 本節主要展示如何去執行表達式樹。運行一個可能含有返回值或只是執行一個操作,比如方法調用的表達式樹。 只有表示lambda表達式的表達式樹能夠被執行。它是一個 "LambdaExpression" 或 "Expression" 類型。為了執行這些表達式樹,調用 "Compile" 方法來 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...