痞子衡嵌入式:對比恩智浦全系列MCU(包含Kinetis/LPC/i.MXRT/MCX)的GPIO電平中斷設計差異

来源:https://www.cnblogs.com/henjay724/archive/2022/12/22/16999794.html
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦全系列MCU(包含Kinetis, LPC, i.MXRT, MCX)的GPIO電平中斷設計差異。 在痞子衡舊文 《以i.MXRT1xxx的GPIO模塊為例談談中斷處理函數(IRQHandler)的標準流程》里,痞子衡主要介紹得是 ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦全系列MCU(包含Kinetis, LPC, i.MXRT, MCX)的GPIO電平中斷設計差異

  在痞子衡舊文 《以i.MXRT1xxx的GPIO模塊為例談談中斷處理函數(IRQHandler)的標準流程》里,痞子衡主要介紹得是 GPIO 一般控制以及最常用的輸入邊沿中斷相關知識。最近恩智浦官方社區有用戶反映 i.MXRT1060 上 GPIO 中斷狀態寄存器(GPIO->ISR)在發生有效電平中斷後的置位並不需要手動清零(W1C),其會在 I/O 輸入電平狀態切換後自動清零,這和手冊里描述不一致。

  首先在痞子衡的認知里 GPIO 輸入電平中斷沒有什麼具體應用場景,想象一下,如果 GPIO 中斷事件由輸入電平值來觸發,如果發生了有效輸入電平且其狀態不改變,那麼 GPIO 中斷響應函數就會被不斷重覆執行(此時 CPU 時間片無法再分給主函數),什麼樣的任務需要這樣的處理呢?暫且不論應用場景,痞子衡今天就從恩智浦全系列 MCU 這方面的行為角度來做一下對比吧。

一、I/O中斷控制模塊差異

  恩智浦現有的經典 Arm Cortex-M MCU 產品線共有如下五大類,它們在 GPIO 一般控制和中斷控制外設上是有差異的。首先 i.MXRT四位數/Kinetis/LPC 這三條線各自是完全不同的外設,然後 i.MXRT三位數是在 LPC 外設基礎上做了增強,而最新的 MCX 系列則是組合了 Kinetis 和 LPC 外設。

晶元系列 I/O一般控制 I/O中斷控制
Kinetis GPIO type1 PORT
LPC GPIO type2 PINT
i.MXRT四位數 GPIO type3 GPIO type3
i.MXRT三位數 GPIO type2 GPIO type2(增加interrupt A/B)
PINT
MCX GPIO type1 GPIO type1(集成Kinetis PORT)
PINT

二、不同系列MCU下測試結果

  根據上一節外設情況我們知道,只要測試了 i.MXRT四位數/Kinetis/LPC 這三個系列的情況,剩下兩個系列自然也就不用測試了。

2.1 Kinetis

  Kinetis 系列分為 K/KL/KE/KS/KW/KV/KM/K32L 等若幹子系列,但是它們關於 GPIO 中斷設計這一塊是一樣的。痞子衡選取了 MKL03Z 這顆晶元來做的測試,查看其手冊 PORTx->PCRn[ISF] 位或者 PORTx->ISFR 寄存器均標記了中斷狀態,並且標明瞭需要做 W1C 操作。

  我們可以直接在 \SDK_2.3.1_FRDM-KL03Z\boards\frdmkl03z\driver_examples\gpio\input_interrupt 常式上做測試,只需要做簡單修改,痞子衡摘取了主要代碼如下。FRDM-KL03Z 板上 SW3 按鍵對應 PTB5 引腳(按下為低電平,鬆開為高電平),代碼設計里按一次 SW3 便列印一次。測試結果來看,在 Kinetis 上即使是電平中斷,PORTx->ISFR 寄存器也是必須要手動清零的,與手冊描述一致。

IRQ函數中是否清零Flag SW3動作 IRQ執行情況 列印輸出結果
上電預設鬆開(高電平) IRQ函數未觸發
SW3按下(低電平) IRQ函數重覆執行
SW3鬆開(高電平) IRQ函數不再觸發 出現一次列印
上電預設鬆開(高電平) IRQ函數未觸發
SW3按下(低電平) IRQ函數重覆執行
SW3鬆開(高電平) IRQ函數重覆執行
volatile bool g_ButtonPress = false;
void PORTB_IRQHandler(void)
{
    // 清除中斷標誌
    PORTB->ISFR = 1U << 5U;
    g_ButtonPress = true;
}
int main(void)
{
    // 省略 PTB5 引腳的 PINMUX 配置
    gpio_pin_config_t sw_config = {
        kGPIO_DigitalInput, 0,
    };
    // 僅需此處修改:將 GPIO 中斷模式改為低電平觸發
    PORT_SetPinInterruptConfig(PORTB, 5U, kPORT_InterruptLogicZero);
    NVIC_EnableIRQ(PORTB_IRQn);
    GPIO_PinInit(GPIOB, 5U, &sw_config);
    while (1)
    {
        if (g_ButtonPress)
        {
            delay();
            PRINTF(" %s is pressed \r\n", "SW3");
            g_ButtonPress = false;
        }
    }
}

2.2 i.MXRT四位數

  i.MXRT四位數系列分為 RT1010/1015/1020/1040/1050/1060/1160/1170/1180 等若幹子型號,但是它們關於 GPIO 中斷設計是一樣的。痞子衡選取了 i.MXRT1062 這顆晶元來做的測試,查看其手冊 GPIOx->ISR 寄存器標記了中斷狀態,同樣標明瞭需要做 W1C 操作。

  我們可以直接在 \SDK_2_12_1_EVK-MIMXRT1060\boards\evkmimxrt1060\driver_examples\gpio\input_interrupt 常式上做測試,只需要做簡單修改,主要代碼如下。MIMXRT1060-EVK 板上 SW8 按鍵對應 WAKEUP_GPIO5[0] 引腳(按下為低電平,鬆開為高電平),代碼設計里按一次 SW8 便列印一次。測試結果來看,在 i.MXRT 四位數上如果是電平中斷,GPIOx->ISR 寄存器會在電平狀態切換時自動清零,跟手冊描述有點差異,不過這樣的設計比 Kinetis 上看起來更合理。

IRQ函數中是否清零Flag SW8動作 IRQ執行情況 列印輸出結果
是/否 上電預設鬆開(高電平) IRQ函數未觸發
SW8按下(低電平) IRQ函數重覆執行
SW8鬆開(高電平) IRQ函數不再觸發 出現一次列印
volatile bool g_InputSignal = false;
void GPIO5_Combined_0_15_IRQHandler(void)
{
    // 清除中斷標誌
    GPIO5->ISR = 1U << 0U;
    g_InputSignal = true;
    __DSB();
}
int main(void)
{
    // 省略 WAKEUP 引腳的 PINMUX 配置
    gpio_pin_config_t sw_config = {
        kGPIO_DigitalInput,
        0,
        kGPIO_IntLowLevel,  // 僅需此處修改:將 GPIO 中斷模式改為低電平觸發
    };
    GPIO_PortEnableInterrupts(GPIO5, 1U << 0U);
    NVIC_EnableIRQ(GPIO5_Combined_0_15_IRQn);
    GPIO_PinInit(GPIO5, 0U, &sw_config);
    while (1)
    {
        if (g_InputSignal)
        {
            delay();
            PRINTF(" %s is turned on. \r\n", "SW8");
            g_InputSignal = false;
        }
    }
}

2.3 LPC

  LPC系列分為 800/1x00/4000/4300/51Uxx/54000/5500 等若幹子型號,但是它們關於 GPIO 中斷設計是一樣的。痞子衡選取了 LPC54114 這顆晶元來做的測試,查看其手冊 PINT->IST 寄存器標記了中斷狀態,這裡關於 W1C 操作做了邊沿方式和電平方式的區別,其中對於電平方式,W1C 是切換有效電平邏輯。

  我們可以直接在 \SDK_2_9_0_LPCXpresso54114\boards\lpcxpresso54114\driver_examples\pint\pin_interrupt 常式上做測試,只需要做簡單修改,主要代碼如下。LPCXpresso-54114 板上 SW1 按鍵對應 PIO0[24] 引腳(按下為低電平,鬆開為高電平),代碼設計里按一次 SW1 便列印一次。測試結果來看,在 LPC 上如果是電平中斷,PINT->IST 寄存器會在電平狀態切換時自動清零,跟手冊描述有點差異,並且中斷處理函數里如果主動加上 W1C 操作其效果就變成了雙邊沿中斷,這樣的設計比 i.MXRT 四位數更進了一步。

IRQ函數中是否清零Flag SW1動作 IRQ執行情況 列印輸出結果
上電預設鬆開(高電平) IRQ函數未觸發
SW1按下(低電平) IRQ函數重覆執行
SW1鬆開(高電平) IRQ函數不再觸發 出現一次列印
上電預設鬆開(高電平) IRQ函數未觸發
SW1按下(低電平) IRQ函數執行一次 出現一次列印
SW1鬆開(高電平) IRQ函數執行一次 出現一次列印
volatile bool g_ButtonPress = false;
void PIN_INT0_DriverIRQHandler(void)
{
    uint32_t pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
    if (s_pintCallback[kPINT_PinInt0] != NULL)
    {
        s_pintCallback[kPINT_PinInt0](kPINT_PinInt0, pmstatus);
    }
    // 清除中斷標誌
    PINT->IST = (1UL << (uint32_t)kPINT_PinInt0);
    __DSB();
}
void pint_intr_callback(pint_pin_int_t pintr, uint32_t pmatch_status)
{
    g_ButtonPress = true;
}
int main(void)
{
    INPUTMUX_Init(INPUTMUX);
    INPUTMUX_AttachSignal(INPUTMUX, kPINT_PinInt0, kINPUTMUX_GpioPort0Pin24ToPintsel);
    PINT_Init(PINT);
    // 僅需此處修改:將 GPIO 中斷模式改為低電平觸發
    PINT_PinInterruptConfig(PINT, kPINT_PinInt0, kPINT_PinIntEnableLowLevel, pint_intr_callback);
    PINT_EnableCallbackByIndex(PINT, kPINT_PinInt0);
    while (1)
    {
        if (g_ButtonPress)
        {
            delay();
            PRINTF(" %s Pin Interrupt event detected \r\n", "SW1");
            g_ButtonPress = false;
        }
    }
}

  至此,恩智浦全系列MCU的GPIO電平中斷設計差異痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時發佈到我的 博客園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下麵二維碼,就可以在手機上第一時間看了哦。

  最後歡迎關註痞子衡個人微信公眾號【痞子衡嵌入式】,一個專註嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。

痞子衡嵌入式-微信二維碼 痞子衡嵌入式-微信收款二維碼 痞子衡嵌入式-支付寶收款二維碼

  衡傑(痞子衡),目前就職於某知名外企半導體公司MCU系統部門,擔任嵌入式系統應用工程師。

  專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]

  可以關註痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。

  關於專欄文章有任何疑問請直接在博客下麵留言,痞子衡會及時回覆免費(劃重點)答疑。

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。



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

-Advertisement-
Play Games
更多相關文章
  • 本文介紹了 Parquet 和 Feather 兩種文件類型,可以提高本地存儲數據時的讀寫速度,並壓縮存儲在磁碟上的數據大小。大型 CSV 文件的剋星!用起來~ ...
  • 前文再續,上一回我們完成了用戶的登錄邏輯,將之前用戶管理模塊中添加的用戶賬號進行賬號和密碼的校驗,過程中使用圖形驗證碼強制進行人機交互,防止賬號的密碼被暴力破解。本回我們需要為登錄成功的用戶生成Token,並且通過Iris的中間件(Middleware)進行鑒權操作。 Iris模板復用 在生成Tok ...
  • redis 是一種非關係型資料庫,什麼是非關係型資料庫,之前我們在mysql專欄 也有提到過,這邊就不再過多的贅述,忘記了的小伙伴可以再次閱讀這篇文章 終於明白了資料庫的【關係型】與【非關係型】 其實這還是挺重要的,上次我們有個初級程式員來面試,我作為旁聽,主考官就問了關係型資料庫跟非關係型資料庫, ...
  • JZ49 醜數 題目 我們先看到題目,把只包含質因數2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因數7。 習慣上我們把1當做是第一個醜數。 方法1:質因數分解(暴力) 思路 演算法實現 一個很朴素的做法 從1~n每次+1,一直枚舉,直到找到地N個醜數為 ...
  • 研發少閑月,九月人倍忙。又到了一年一度的“金九銀十”秋招季,又到了寫簡歷的時節,如果你還在用傳統的Word文檔尋找模板,然後默默耕耘,顯然就有些落後於時代了,本次我們嘗試使用雲平臺flowcv高效打造一份巧如範金、精比琢玉的高品質Golang技術簡歷。 首先來到雲平臺:flowcv.com 點擊 t ...
  • 整理 | 鄭麗媛,出品 | CSDN(ID:CSDNnews) 在近幾年的大環境影響下,線上筆試/面試愈發流行,這也給了部分人“鑽空子”的機會——除了筆試作弊(上網搜代碼),現在連面試都能找“替身”作弊了。 下麵,就例舉幾個真實發生的事件。 面試的人≠入職的人 最近,美國紐約州一家機構的 IT 部門 ...
  • 一、前言 程式猿為什麼如此執著於造輪子?MyBatis-Plus如此強大的工具流行這麼多年了,我為啥還在重覆造這樣的輪子? 1、公司的技術規範不允許使用MyBatis-Plus,咱也不知道什麼原因; 3、以前使用SpringDataJpa慣了,今年第一次用MyBatis,必須把它打造成我想要的樣子; ...
  • 繼我關註很久一位編程的大牛發佈了他的那篇文章——<探究:普通人都是怎麼入門編程>https://www.cnblogs.com/liuyangfirst/p/16991386.html我先去再相關評論里看到了有人說這是AI寫的一樣,不過我對這篇文章的作者稍微有些瞭解,可能就是他寫的,因為有時候你看不 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...