LP-MSPM0G3507學習--05中斷及管腳中斷

關鍵函數:

  • NVIC_EnableIRQ(IRQn_Type IRQn):使能中斷

例5-1:單按鍵中斷方式實現led燈的亮滅

在上一講LP-MSPM0G3507學習--04GPIO控制中實現了通過按鍵控制led燈的亮滅,可以看出程序效率不高,下面采用中斷的方式實現,其中的配置大部分相同,除了將管腳buttoninterrupts設置為中斷:

?需要注意的是觸發極性(triggler polarity),有4種:

  • ?diabled--可能是電平觸發(此時應該是低電平觸發,因為有上拉電阻了)
  • trigger on rising edge--上升沿觸發
  • trigger on falling edge--下降沿觸發
  • trigger on both Edg--雙邊沿觸發

從電路中可以看出,PB21應該上拉電阻,且采用邊沿觸發時,中斷觸發方式應該設為下降沿觸發

#include "ti_msp_dl_config.h"int main(void)
{SYSCFG_DL_init();NVIC_EnableIRQ(GPIOB_INT_IRQn);//開啟按鍵引腳的GPIOB端口中斷while (1) {}
}
void GROUP1_IRQHandler(void){//GPIO中斷服務函數DL_GPIO_togglePins(LED_PORT,LED_LED1_PIN);
}

分析:

這里涉及到兩個函數NVIC_EnableIRQ(),GROUP_IRQ_IRQHandler()

首先了解,NVIC,即嵌套矢量中斷控制器,用來管理外設中斷。有關的函數在ti\mspm0_sdk_2_05_01_00\source\third_party\CMSIS\Core\include\core_cm0plus.h中

另外,中斷號定義在i\mspm0_sdk_2_05_01_00\source\ti\devicws\msp\mspmog350x.h中

查閱數據手冊的時候,發現3507中只有兩個外設中斷組:INT_GROUP0、INT_GROUP1.本實驗要用到的只有按鍵和LED,所以只有GPIO這一部分的中斷,根據數據手冊,可以知道GPIO的中斷觸發后,都是通過GRP1線將中斷發布到總線,總線識別到之后就進入中斷服務函數中執行內容。

GPIO引腳的中斷服務函數(ISR)需在代碼中直接定義,其位置和聲明方式遵循以下核心規則:

1.?中斷服務函數的定義位置

  • 直接在C文件中實現:GPIO中斷屬于INT_GROUP1組,因此中斷服務函數必須命名為?GROUP1_IRQHandler,并在工程內的C文件(如main.c或自定義的ISR文件)中實現。
    示例代碼:

    ?void GROUP1_IRQHandler(void) { // 中斷處理邏輯 }


    -?無需頭文件聲明:此函數是ARM Cortex-M預定義的中斷向量之一,由鏈接腳本自動關聯到中斷向量表,無需在頭文件中顯式聲明9。


2.?函數內部處理邏輯

GROUP1_IRQHandler內,需通過以下步驟區分具體的中斷源(如不同GPIO引腳):

  1. 查詢中斷索引(IIDX)
    使用DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)獲取觸發中斷的外設索引。

  2. 判斷GPIO端口
    通過switch-case匹配GPIO端口的IIDX宏(如GPIOA_INT_IIDXGPIOB_INT_IIDX)。

  3. 檢查具體引腳狀態
    若同一端口有多個引腳使能中斷,需調用DL_GPIO_getEnabledInterruptStatus()并檢查引腳位掩碼

完整示例:

void GROUP1_IRQHandler(void) {switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)) {case DL_INTERRUPT_GROUP1_IIDX_GPIOA:  // GPIOA中斷uint32_t status = DL_GPIO_getEnabledInterruptStatus(GPIOA);if (status & GPIO_PIN_12) {       // 檢查PA12引腳DL_GPIO_togglePins(GPIO_LED_PORT, GPIO_LED_PIN);DL_GPIO_clearInterruptStatus(GPIOA, GPIO_PIN_12); // 清除標志}break;// 其他GPIO端口處理...}
}

3.?配置與使能中斷

  • SysConfig圖形化配置
    在CCS的SysConfig工具中需啟用GPIO中斷,設置觸發邊沿(如下降沿),并指定引腳。

  • 代碼使能中斷
    主函數中調用NVIC_EnableIRQ(GPIOx_INT_IRQN)(如GPIOA_INT_IRQn)激活NVIC中斷。


4.?關鍵注意事項

  • 中斷標志清除
    在ISR內必須清除中斷標志,否則會重復觸發。使用DL_GPIO_clearInterruptStatus()DL_Interrupt_clearFlag()

  • 變量聲明
    跨中斷共享的變量(如delay_time)需加volatile關鍵字防止優化錯誤。

  • 調試陷阱
    若未正確定義GROUP1_IRQHandler,程序可能跳轉至默認錯誤處理(如死循環)。建議添加調試斷點(__BKPT(0))輔助排查。

附:GPIO中斷相關宏定義示例

宏名稱作用示例值
GPIO_SWITCHES_GPIOA_INT_IRQNGPIOA中斷號GPIOA_INT_IRQn
DL_INTERRUPT_GROUP1_IIDX_GPIOAGPIOA在GROUP1中的索引由SDK頭文件定義
GPIO_SWITCHES_USER_SWITCH_1_PIN具體引腳宏DL_GPIO_PIN_12

附:其他的中斷名:?

其他的一些中斷名為(定義在C:\ti\mspm0_sdk_2_05_01_00\source\ti\devices\msp\m0p\startup_system_files\ticlang\startup_mspm0g350x_ticlang.c)中:

extern void GROUP0_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void GROUP1_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void TIMG8_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void UART3_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void ADC0_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void ADC1_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void CANFD0_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void DAC0_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void SPI0_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void SPI1_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void UART1_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void UART2_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void UART0_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void TIMG0_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void TIMG6_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void TIMA0_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void TIMA1_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void TIMG7_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void TIMG12_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void I2C0_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void I2C1_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void AES_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void RTC_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));
extern void DMA_IRQHandler(void)__attribute__((weak, alias("Default_Handler")));

中斷號定義在ti\mspm0_sdk_2_05_01_00\source\ti\devices\msp\m0p\mspm0g350x.h

typedef enum IRQn
{NonMaskableInt_IRQn         = -14,    /* 2  Non Maskable Interrupt */HardFault_IRQn              = -13,    /* 3  Hard Fault Interrupt */SVCall_IRQn                 = -5,     /* 11 SV Call Interrupt */PendSV_IRQn                 = -2,     /* 14 Pend SV Interrupt */SysTick_IRQn                = -1,     /* 15 System Tick Interrupt */SYSCTL_INT_IRQn             = 0,      /* 16 SYSCTL_INT Interrupt */WWDT1_INT_IRQn              = 0,      /* 16 WWDT1_INT Interrupt */WWDT0_INT_IRQn              = 0,      /* 16 WWDT0_INT Interrupt */FLASHCTL_INT_IRQn           = 0,      /* 16 FLASHCTL_INT Interrupt */DEBUGSS_INT_IRQn            = 0,      /* 16 DEBUGSS_INT Interrupt */GPIOB_INT_IRQn              = 1,      /* 17 GPIOB_INT Interrupt */GPIOA_INT_IRQn              = 1,      /* 17 GPIOA_INT Interrupt */TRNG_INT_IRQn               = 1,      /* 17 TRNG_INT Interrupt */COMP0_INT_IRQn              = 1,      /* 17 COMP0_INT Interrupt */COMP1_INT_IRQn              = 1,      /* 17 COMP1_INT Interrupt */COMP2_INT_IRQn              = 1,      /* 17 COMP2_INT Interrupt */TIMG8_INT_IRQn              = 2,      /* 18 TIMG8_INT Interrupt */UART3_INT_IRQn              = 3,      /* 19 UART3_INT Interrupt */ADC0_INT_IRQn               = 4,      /* 20 ADC0_INT Interrupt */ADC1_INT_IRQn               = 5,      /* 21 ADC1_INT Interrupt */CANFD0_INT_IRQn             = 6,      /* 22 CANFD0_INT Interrupt */DAC0_INT_IRQn               = 7,      /* 23 DAC0_INT Interrupt */SPI0_INT_IRQn               = 9,      /* 25 SPI0_INT Interrupt */SPI1_INT_IRQn               = 10,     /* 26 SPI1_INT Interrupt */UART1_INT_IRQn              = 13,     /* 29 UART1_INT Interrupt */UART2_INT_IRQn              = 14,     /* 30 UART2_INT Interrupt */UART0_INT_IRQn              = 15,     /* 31 UART0_INT Interrupt */TIMG0_INT_IRQn              = 16,     /* 32 TIMG0_INT Interrupt */TIMG6_INT_IRQn              = 17,     /* 33 TIMG6_INT Interrupt */TIMA0_INT_IRQn              = 18,     /* 34 TIMA0_INT Interrupt */TIMA1_INT_IRQn              = 19,     /* 35 TIMA1_INT Interrupt */TIMG7_INT_IRQn              = 20,     /* 36 TIMG7_INT Interrupt */TIMG12_INT_IRQn             = 21,     /* 37 TIMG12_INT Interrupt */I2C0_INT_IRQn               = 24,     /* 40 I2C0_INT Interrupt */I2C1_INT_IRQn               = 25,     /* 41 I2C1_INT Interrupt */AES_INT_IRQn                = 28,     /* 44 AES_INT Interrupt */RTC_INT_IRQn                = 30,     /* 46 RTC_INT Interrupt */DMA_INT_IRQn                = 31,     /* 47 DMA_INT Interrupt */
} IRQn_Type;

例5-2:雙按鍵中斷方式實現led燈的亮滅

實現按鍵S1按鍵點亮LED1,按鍵S2熄滅LED1

首先還是配置管腳,從電路原理圖中可以看出S1按下為高電平,釋放為低電平,所以S1即PA18設定為輸入,內部連接下拉電阻,中斷觸發方式為上升沿;S2按下為低電平,釋放為高電平,即PB21設定為輸入,內部連接上拉電阻,中斷觸發方式為下降沿;led1設定為輸出,初始值為高,即led初始為熄滅。

#include "ti_msp_dl_config.h"int main(void)
{SYSCFG_DL_init();NVIC_EnableIRQ(GPIOA_INT_IRQn);//開啟按鍵引腳的GPIOA端口中斷NVIC_EnableIRQ(GPIOB_INT_IRQn);//開啟按鍵引腳的GPIOB端口中斷while (1) {}
}
void GROUP1_IRQHandler(void) {uint32_t status=0; switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)) {case DL_INTERRUPT_GROUP1_IIDX_GPIOA:  // 處理GPIOA中斷status= DL_GPIO_getEnabledInterruptStatus(Buttons_S1_PORT,Buttons_S1_PIN);if (status & Buttons_S1_PIN) {        // 檢查PA18引腳DL_GPIO_clearPins(LED_PORT, LED_LED1_PIN);//亮燈DL_GPIO_clearInterruptStatus(Buttons_S1_PORT, Buttons_S1_PIN); // 清除標志}break;case DL_INTERRUPT_GROUP1_IIDX_GPIOB:  // 處理GPIOB中斷status= DL_GPIO_getEnabledInterruptStatus(Buttons_S2_PORT,Buttons_S2_PIN);if (status & Buttons_S2_PIN) {        // 檢查PB21引腳DL_GPIO_setPins(LED_PORT, LED_LED1_PIN);//熄燈DL_GPIO_clearInterruptStatus(Buttons_S2_PORT, Buttons_S2_PIN); // 清除標志}break;            default:    // 處理其他中斷// 完成處理break;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915027.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mac系統安裝、啟動Jenkins,創建pytest接口自動化任務

先安裝Homebrew:mac系統安裝brew-CSDN博客 1、安裝Jenkins # 可以安裝長期支持版本 brew install jenkins-lts# 或者最新版本(我安了這個) brew install jenkins 可查看Jenkins安裝位置: # 最新版本 brew --prefix jenkins 2、…

設置第三方窗口置頂(SetWindowPos方法,vb.net)

起源在日常辦公、游戲時,我們經常需要一些窗口處于置頂狀態,而這些窗口往往是網頁端(瀏覽器)、辦公軟件(wps、office等),這些需要置頂的窗口往往自身沒有明顯的置頂開關,因此&#x…

Docker-下載和安裝

一、Linux版 1.安裝docker (1)更新軟件包索引 sudo apt update (2)安裝必要的依賴 sudo apt install apt-transport-https ca-certificates curl software-properties-common (3)添加 Docker 官方 GP…

電腦DLL錯誤修復dll微軟運行庫工具修復dll缺失找不到dll等問題,dll免費修復工具

解決DLL文件缺失問題:我的使用體驗與建議 在使用電腦的過程中,我們常常會遇到軟件或系統報錯,例如“無法找到指定模塊”或“缺少某.dll文件”等提示。DLL(動態鏈接庫)是Windows系統中不可或缺的組件,為應用…

HTTPS的工作原理及DNS的工作過程

HTTPSHTTP協議安全上存在以下三個風險:完整性 可用性 保密性竊聽風險,比如通信鏈路上可以獲取通信內容,用戶號容易沒。篡改風險,比如強制植入垃圾廣告,視覺污染,用戶眼容易瞎。冒充風險,比如冒充…

VisualXML全新升級 | 新增BusLoad計算

VisualXML是一個功能強大的網絡總線設計工具,專注于簡化汽車電子系統中復雜的網絡數據設計操作。該軟件支持多種主流總線網絡格式的數據編輯(如DBC、LDF、ARXML、HEX等),并能夠基于Excel表格的方式生成和轉換多種數據庫文件。由此…

李天意考研數學精講課學習筆記(課堂版)

視頻鏈接:【考研數學精講課李天意】基礎強化真題,概念精講與解題技巧(適用數學一/二/三)_嗶哩嗶哩_bilibili 講義:夸克網盤分享 高數6 不定積分

閑庭信步使用圖像驗證平臺加速FPGA的開發:第二十三課——圖像直方圖和灰度圖像疊加的FPGA實現

(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程…

C++并發編程-14. 利用柵欄實現同步

前文我們通過原子操作實戰實現了無鎖隊列,今天完善一下無鎖的原子操作剩余的知識,包括Relaese和Acquire內存序在什么情況下是存在危險的,以及我們可以利用柵欄機制實現同步等等。 線程可見順序 我們提到過除了memory_order_seq_cst順序&#…

如何選擇旅游科技行業云ERP?Oracle NetSuite助力匯智國際數智化升級

2025年4月21日,匯智國際旅游發展有限公司(以下簡稱匯智國際)攜手 Oracle NetSuite與Hitpoint Cloud ,共同參與了匯智國際 Oracle NetSuite 云ERP 項目啟動會。 本次會議標志著匯智國際在數字化轉型道路上邁出了堅實而關鍵的一步&…

深度學習零基礎入門(3)-圖像與神經網絡

好久不見~我又回來了 這一節我們來講一講圖像在計算機中的本質,以及全連接神經網絡的缺陷,進而引出卷積神經網絡一、圖像在計算機中的本質 不知道你有沒有學過數據結構,在講這一部分的時候對數組進行了擴展,講到了廣義表和壓縮矩陣…

http性能測試命令ab

在 Linux系統中, ab( ApacheBench)是一個用于 測試HTTP服務器性能的 工具。它是 Apache HTTP服務器項目的 一部分,專門設計用來模擬 多個用戶對 服務器發起 并發請求,從而 評估服務器的 負載能力和 響應時間其中&#…

從0開始學習R語言--Day50--ROC曲線

對于已經擬合好的生存模型,我們一般會直接用ROC去評判一下整體的水平,因為很多時候閾值都是我們人為根據實際情況去設定的,這種微調的細節都是在整體模型的擬合程度確定下來后再做的工作。ROC曲線可以提供給我們模型對于二分類變量的區分能力…

從Hyperliquid到AILiquid:一場從極致性能到策略智能的迭代

在Hyperliquid以極致性能引爆鏈上衍生品交易熱潮之后,DeFi市場正迎來新一輪的范式轉變。作為AI原生的下一代交易平臺,AILiquid正式上線并引發市場廣泛關注。該平臺不僅保留了高頻低延遲的交易體驗,更通過AI撮合引擎與鏈上風險控制系統&#x…

磁懸浮軸承轉子不平衡質量控制:陷波濾波器深度解析

在磁懸浮軸承高速旋轉的世界里,不平衡質量如同一個無形的幽靈,引發危險的同步振動,而陷波濾波器,正是精準捕獲并消除這個幽靈的“電磁獵手”。本文將深入剖析其核心原理與實戰設計。引言:同步振動的致命誘惑磁懸浮軸承…

Oracle 數據庫常見等待事件參數詳解

在 Oracle 數據庫的性能診斷與優化中,等待事件是重要的分析依據,而理解等待事件的參數則是深入排查問題的基礎。本文將結合 Oracle 官方文檔,對數據庫中常見的等待事件參數進行詳細解析,幫助數據庫管理員和開發人員更好地解讀等待…

STM32中的CAN總線詳解:從原理到實戰

前言:為什么CAN總線是嵌入式通信的"硬通貨"? 在嵌入式通信領域,CAN(Controller Area Network)總線憑借其高可靠性、實時性和多節點通信能力,成為汽車電子、工業控制、智能設備等領域的"標配…

【鴻蒙HarmonyOS】鴻蒙app開發入門到實戰教程(二):封裝自定義可復用組件

組件的可復用性,對我們開發的app質量影響很大,看看鴻蒙中如何封裝這種組件 實現效果代碼實現 局部封裝 Builder titleBuilder(title:string 默認標題) {// Builder裝飾此函數,使其能以鏈式調用的方式配置并構建Text組件Row(){Text(title).fo…

Volo-HTTP 0.4.0發布:正式支持 HTTP/2,客戶端易用性大幅提升!

🤖 VOLO簡介 Volo 是由字節跳動服務框架團隊開源的一款高性能、易用的 Rust RPC 框架。 Volo 框架自身開銷極低,并提供了命令行工具與靈活的中間件設計,讓開發者可以輕松上手,享受 Rust 帶來的開發樂趣。 本文介紹自 Volo-HTTP 0…

HTTP相關知識

文章目錄一、基礎特性與規范二、頁面元素與布局三、交互與表單四、網絡通信基礎流程(以瀏覽器訪問網頁為例)五、配套技術與工具六、知識關聯圖(簡化版)一、基礎特性與規范 技術定位:HTML 是前端技術棧的核心標記語言&…