大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是恩智浦全系列MCU(包含Kinetis, LPC, i.MXRT, MCX)的GPIO電平中斷設(shè)計(jì)差異。
在痞子衡舊文 《以i.MXRT1xxx的GPIO模塊為例談?wù)勚袛嗵幚砗瘮?shù)(IRQHandler)的標(biāo)準(zhǔn)流程》里,痞子衡主要介紹得是 GPIO 一般控制以及最常用的輸入邊沿中斷相關(guān)知識。最近恩智浦官方社區(qū)有用戶反映 i.MXRT1060 上 GPIO 中斷狀態(tài)寄存器(GPIO->ISR)在發(fā)生有效電平中斷后的置位并不需要手動清零(W1C),其會在 I/O 輸入電平狀態(tài)切換后自動清零,這和手冊里描述不一致。
首先在痞子衡的認(rèn)知里 GPIO 輸入電平中斷沒有什么具體應(yīng)用場景,想象一下,如果 GPIO 中斷事件由輸入電平值來觸發(fā),如果發(fā)生了有效輸入電平且其狀態(tài)不改變,那么 GPIO 中斷響應(yīng)函數(shù)就會被不斷重復(fù)執(zhí)行(此時(shí) CPU 時(shí)間片無法再分給主函數(shù)),什么樣的任務(wù)需要這樣的處理呢?暫且不論應(yīng)用場景,痞子衡今天就從恩智浦全系列 MCU 這方面的行為角度來做一下對比吧。
一、I/O中斷控制模塊差異
恩智浦現(xiàn)有的經(jīng)典 Arm Cortex-M MCU 產(chǎn)品線共有如下五大類,它們在 GPIO 一般控制和中斷控制外設(shè)上是有差異的。首先 i.MXRT四位數(shù)/Kinetis/LPC 這三條線各自是完全不同的外設(shè),然后 i.MXRT三位數(shù)是在 LPC 外設(shè)基礎(chǔ)上做了增強(qiáng),而最新的 MCX 系列則是組合了 Kinetis 和 LPC 外設(shè)。
| 芯片系列 | I/O一般控制 | I/O中斷控制 |
|---|---|---|
| Kinetis | GPIO type1 | PORT |
| LPC | GPIO type2 | PINT |
| i.MXRT四位數(shù) | GPIO type3 | GPIO type3 |
| i.MXRT三位數(shù) | GPIO type2 |
GPIO type2(增加interrupt A/B) PINT |
| MCX | GPIO type1 |
GPIO type1(集成Kinetis PORT) PINT |
二、不同系列MCU下測試結(jié)果
根據(jù)上一節(jié)外設(shè)情況我們知道,只要測試了 i.MXRT四位數(shù)/Kinetis/LPC 這三個(gè)系列的情況,剩下兩個(gè)系列自然也就不用測試了。
2.1 Kinetis
Kinetis 系列分為 K/KL/KE/KS/KW/KV/KM/K32L 等若干子系列,但是它們關(guān)于 GPIO 中斷設(shè)計(jì)這一塊是一樣的。痞子衡選取了 MKL03Z 這顆芯片來做的測試,查看其手冊 PORTx->PCRn[ISF] 位或者 PORTx->ISFR 寄存器均標(biāo)記了中斷狀態(tài),并且標(biāo)明了需要做 W1C 操作。

我們可以直接在 SDK_2.3.1_FRDM-KL03Zoardsfrdmkl03zdriver_examplesgpioinput_interrupt 例程上做測試,只需要做簡單修改,痞子衡摘取了主要代碼如下。FRDM-KL03Z 板上 SW3 按鍵對應(yīng) PTB5 引腳(按下為低電平,松開為高電平),代碼設(shè)計(jì)里按一次 SW3 便打印一次。測試結(jié)果來看,在 Kinetis 上即使是電平中斷,PORTx->ISFR 寄存器也是必須要手動清零的,與手冊描述一致。
| IRQ函數(shù)中是否清零Flag | SW3動作 | IRQ執(zhí)行情況 | 打印輸出結(jié)果 |
|---|---|---|---|
| 是 | 上電默認(rèn)松開(高電平) | IRQ函數(shù)未觸發(fā) | 無 |
| SW3按下(低電平) | IRQ函數(shù)重復(fù)執(zhí)行 | 無 | |
| SW3松開(高電平) | IRQ函數(shù)不再觸發(fā) | 出現(xiàn)一次打印 | |
| 否 | 上電默認(rèn)松開(高電平) | IRQ函數(shù)未觸發(fā) | 無 |
| SW3按下(低電平) | IRQ函數(shù)重復(fù)執(zhí)行 | 無 | |
| SW3松開(高電平) | IRQ函數(shù)重復(fù)執(zhí)行 | 無 |
volatileboolg_ButtonPress=false;
voidPORTB_IRQHandler(void)
{
//清除中斷標(biāo)志
PORTB->ISFR=1U<5U;
????g_ButtonPress?=?true;
}
int?main(void)
{
????//?省略?PTB5?引腳的?PINMUX?配置
????gpio_pin_config_t?sw_config?=?{
????????kGPIO_DigitalInput,?0,
????};
????//?僅需此處修改:將 GPIO 中斷模式改為低電平觸發(fā)
????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?
",?"SW3");
????????????g_ButtonPress?=?false;
????????}
????}
}
2.2 i.MXRT四位數(shù)
i.MXRT四位數(shù)系列分為 RT1010/1015/1020/1040/1050/1060/1160/1170/1180 等若干子型號,但是它們關(guān)于 GPIO 中斷設(shè)計(jì)是一樣的。痞子衡選取了 i.MXRT1062 這顆芯片來做的測試,查看其手冊 GPIOx->ISR 寄存器標(biāo)記了中斷狀態(tài),同樣標(biāo)明了需要做 W1C 操作。

我們可以直接在 SDK_2_12_1_EVK-MIMXRT1060oardsevkmimxrt1060driver_examplesgpioinput_interrupt 例程上做測試,只需要做簡單修改,主要代碼如下。MIMXRT1060-EVK 板上 SW8 按鍵對應(yīng) WAKEUP_GPIO5[0] 引腳(按下為低電平,松開為高電平),代碼設(shè)計(jì)里按一次 SW8 便打印一次。測試結(jié)果來看,在 i.MXRT 四位數(shù)上如果是電平中斷,GPIOx->ISR 寄存器會在電平狀態(tài)切換時(shí)自動清零,跟手冊描述有點(diǎn)差異,不過這樣的設(shè)計(jì)比 Kinetis 上看起來更合理。
| IRQ函數(shù)中是否清零Flag | SW8動作 | IRQ執(zhí)行情況 | 打印輸出結(jié)果 |
|---|---|---|---|
| 是/否 | 上電默認(rèn)松開(高電平) | IRQ函數(shù)未觸發(fā) | 無 |
| SW8按下(低電平) | IRQ函數(shù)重復(fù)執(zhí)行 | 無 | |
| SW8松開(高電平) | IRQ函數(shù)不再觸發(fā) | 出現(xiàn)一次打印 |
volatileboolg_InputSignal=false;
voidGPIO5_Combined_0_15_IRQHandler(void)
{
//清除中斷標(biāo)志
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 中斷模式改為低電平觸發(fā)
????};
????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.?
",?"SW8");
????????????g_InputSignal?=?false;
????????}
????}
}
2.3 LPC
LPC系列分為 800/1x00/4000/4300/51Uxx/54000/5500 等若干子型號,但是它們關(guān)于 GPIO 中斷設(shè)計(jì)是一樣的。痞子衡選取了 LPC54114 這顆芯片來做的測試,查看其手冊 PINT->IST 寄存器標(biāo)記了中斷狀態(tài),這里關(guān)于 W1C 操作做了邊沿方式和電平方式的區(qū)別,其中對于電平方式,W1C 是切換有效電平邏輯。

我們可以直接在 SDK_2_9_0_LPCXpresso54114oardslpcxpresso54114driver_examplespintpin_interrupt 例程上做測試,只需要做簡單修改,主要代碼如下。LPCXpresso-54114 板上 SW1 按鍵對應(yīng) PIO0[24] 引腳(按下為低電平,松開為高電平),代碼設(shè)計(jì)里按一次 SW1 便打印一次。測試結(jié)果來看,在 LPC 上如果是電平中斷,PINT->IST 寄存器會在電平狀態(tài)切換時(shí)自動清零,跟手冊描述有點(diǎn)差異,并且中斷處理函數(shù)里如果主動加上 W1C 操作其效果就變成了雙邊沿中斷,這樣的設(shè)計(jì)比 i.MXRT 四位數(shù)更進(jìn)了一步。
| IRQ函數(shù)中是否清零Flag | SW1動作 | IRQ執(zhí)行情況 | 打印輸出結(jié)果 |
|---|---|---|---|
| 否 | 上電默認(rèn)松開(高電平) | IRQ函數(shù)未觸發(fā) | 無 |
| SW1按下(低電平) | IRQ函數(shù)重復(fù)執(zhí)行 | 無 | |
| SW1松開(高電平) | IRQ函數(shù)不再觸發(fā) | 出現(xiàn)一次打印 | |
| 是 | 上電默認(rèn)松開(高電平) | IRQ函數(shù)未觸發(fā) | 無 |
| SW1按下(低電平) | IRQ函數(shù)執(zhí)行一次 | 出現(xiàn)一次打印 | |
| SW1松開(高電平) | IRQ函數(shù)執(zhí)行一次 | 出現(xiàn)一次打印 |
volatileboolg_ButtonPress=false;
voidPIN_INT0_DriverIRQHandler(void)
{
uint32_tpmstatus=PINT_PatternMatchResetDetectLogic(PINT);
if(s_pintCallback[kPINT_PinInt0]!=NULL)
{
s_pintCallback[kPINT_PinInt0](kPINT_PinInt0,pmstatus);
}
//清除中斷標(biāo)志
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 中斷模式改為低電平觸發(fā)
????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?
",?"SW1");
????????????g_ButtonPress?=?false;
????????}
????}
}
至此,恩智浦全系列MCU的GPIO電平中斷設(shè)計(jì)差異痞子衡便介紹完畢了,掌聲在哪里~~~
-
mcu
+關(guān)注
關(guān)注
147文章
18924瀏覽量
398034 -
恩智浦
+關(guān)注
關(guān)注
14文章
6095瀏覽量
147150 -
電平
+關(guān)注
關(guān)注
5文章
372瀏覽量
41597 -
中斷
+關(guān)注
關(guān)注
5文章
917瀏覽量
43754 -
GPIO
+關(guān)注
關(guān)注
16文章
1328瀏覽量
56219
原文標(biāo)題:對比恩智浦全系列MCU的GPIO電平中斷設(shè)計(jì)差異
文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
恩智浦i.MXRT1xxx系列MCU的Serial NAND啟動
恩智浦i.MX RTxxx系列MCU的特性
恩智浦:安全的無線MCU是核心問題
恩智浦經(jīng)典LPC系列MCU內(nèi)部Flash IAP驅(qū)動介紹
ACH拉近您與恩智浦MCU專家的距離
恩智浦發(fā)布新一代MCX A系列MCU
【上海】5月25日-基于恩智浦MCX N系列MCU結(jié)合RT-Thread的應(yīng)用與實(shí)踐 線下培訓(xùn)
恩智浦MCX W系列無線MCU的獨(dú)特魅力
基于恩智浦MCX N系列MCU的應(yīng)用示例
恩智浦MCX L系列超低功耗MCU概述
恩智浦MCX L系列MCU的低功耗設(shè)計(jì)
對比恩智浦全系列MCU的GPIO電平中斷設(shè)計(jì)差異
評論