0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

对比恩智浦全系列MCU的GPIO电平中断设计差异

痞子衡嵌入式 来源:痞子衡嵌入式 2023-02-07 09:01 次阅读

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦全系列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 操作。

25e9b048-a63f-11ed-bfe3-dac502259ad0.png

我们可以直接在 SDK_2.3.1_FRDM-KL03Zoardsfrdmkl03zdriver_examplesgpioinput_interrupt 例程上做测试,只需要做简单修改,痞子衡摘取了主要代码如下。FRDM-KL03Z 板上 SW3 按键对应 PTB5 引脚(按下为低电平,松开为高电平),代码设计里按一次 SW3 便打印一次。测试结果来看,在 Kinetis 上即使是电平中断,PORTx->ISFR 寄存器也是必须要手动清零的,与手册描述一致。

IRQ函数中是否清零Flag SW3动作 IRQ执行情况 打印输出结果
上电默认松开(高电平) IRQ函数未触发
SW3按下(低电平) IRQ函数重复执行
SW3松开(高电平) IRQ函数不再触发 出现一次打印
上电默认松开(高电平) IRQ函数未触发
SW3按下(低电平) IRQ函数重复执行
SW3松开(高电平) IRQ函数重复执行

volatileboolg_ButtonPress=false;
voidPORTB_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 
", "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 操作。

2610dec0-a63f-11ed-bfe3-dac502259ad0.png

我们可以直接在 SDK_2_12_1_EVK-MIMXRT1060oardsevkmimxrt1060driver_examplesgpioinput_interrupt 例程上做测试,只需要做简单修改,主要代码如下。MIMXRT1060-EVK 板上 SW8 按键对应 WAKEUP_GPIO5[0] 引脚(按下为低电平,松开为高电平),代码设计里按一次 SW8 便打印一次。测试结果来看,在 i.MXRT 四位数上如果是电平中断,GPIOx->ISR 寄存器会在电平状态切换时自动清零,跟手册描述有点差异,不过这样的设计比 Kinetis 上看起来更合理。

IRQ函数中是否清零Flag SW8动作 IRQ执行情况 打印输出结果
是/否 上电默认松开(高电平) IRQ函数未触发
SW8按下(低电平) IRQ函数重复执行
SW8松开(高电平) IRQ函数不再触发 出现一次打印

volatileboolg_InputSignal=false;
voidGPIO5_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. 
", "SW8");
            g_InputSignal = false;
        }
    }
}

2.3 LPC

LPC系列分为 800/1x00/4000/4300/51Uxx/54000/5500 等若干子型号,但是它们关于 GPIO 中断设计是一样的。痞子衡选取了 LPC54114 这颗芯片来做的测试,查看其手册 PINT->IST 寄存器标记了中断状态,这里关于 W1C 操作做了边沿方式和电平方式的区别,其中对于电平方式,W1C 是切换有效电平逻辑。

262d4d8a-a63f-11ed-bfe3-dac502259ad0.png

我们可以直接在 SDK_2_9_0_LPCXpresso54114oardslpcxpresso54114driver_examplespintpin_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函数执行一次 出现一次打印

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);
}
//清除中断标志
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 
", "SW1");
            g_ButtonPress = false;
        }
    }
}

至此,恩智浦全系列MCU的GPIO电平中断设计差异痞子衡便介绍完毕了,掌声在哪里~~~

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16248

    浏览量

    345598
  • 恩智浦
    +关注

    关注

    14

    文章

    5738

    浏览量

    101774
  • 电平
    +关注

    关注

    5

    文章

    342

    浏览量

    39629
  • 中断
    +关注

    关注

    5

    文章

    885

    浏览量

    41115
  • GPIO
    +关注

    关注

    16

    文章

    1152

    浏览量

    50980

原文标题:对比恩智浦全系列MCU的GPIO电平中断设计差异

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    i.MXRT1xxx系列MCU的Serial NAND启动

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1xxx系列MCU的Serial NAND启动。
    发表于 08-21 09:20 251次阅读
    <b class='flag-5'>恩</b>智<b class='flag-5'>浦</b>i.MXRT1xxx<b class='flag-5'>系列</b><b class='flag-5'>MCU</b>的Serial NAND启动

    MCU也开始卷了,率先将NPU集成进MCU

    几天前IC Insights发布了2021年MCU销售情况,MCU销售额达到了37.95亿美元,排名第一。其实,
    的头像 发表于 06-18 08:00 3764次阅读

    i.MX RTxxx系列MCU的特性

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MX RTxxx系列MCU的基本特性。  
    发表于 11-04 07:08

    推出带中断和复位功能且符合AEC-Q100标准的GPIO

    —凭借在汽车联网智能和安全解决方案领域的领先优势,半导体NXP Semiconductors N.V. (NASDAQ:NXPI) 近日宣布推出符合AEC-Q100标准、面向I2C总线
    发表于 07-09 15:57 1345次阅读

    2009年MCU产品系列总览

    2009年MCU产品系列总览,又需要的下来看看。
    发表于 12-15 15:05 22次下载

    ARM_MCU开发工具速选

    ARM_MCU开发工具速选,下来看看。
    发表于 12-15 15:01 10次下载

    无线MCU产品及方案介绍

    无线MCU产品及方案介绍
    发表于 10-16 15:42 9次下载
    <b class='flag-5'>恩</b>智<b class='flag-5'>浦</b>无线<b class='flag-5'>MCU</b>产品及方案介绍

    基于Arm® Cortex®-M内核的MCU产品组合概览,及其部分演示-01

    本讲座将简要介绍各种可扩展的MCU产品组合,并详细介绍不同市场和用例所对应的产品系列。此外,还将简要介绍支持
    的头像 发表于 12-20 15:46 1225次阅读

    发布两款MCU,助力环保型智能家居设备

    半导体公司推出了K32W061/41,这是一个超低功耗/多协议无线微控制器(MCU)的新系列
    的头像 发表于 05-12 11:32 3603次阅读

    :安全的无线MCU是核心问题

    作为去年消费电子展 (CES) 上推出的Tri-Radio系列的最新成员,表示 RW612 使用与其 i.MX RT 系列“跨界”MCU
    的头像 发表于 01-30 09:42 529次阅读

    经典LPC系列MCU内部Flash IAP驱动介绍

    LPC 系列 MCU公司于 2003 年开始推出的非常具有代表性的产品,距今已经有近 20 年的生命。
    的头像 发表于 03-30 09:19 1780次阅读

    ACH拉近您与MCU专家的距离

    这个 ACH 将会汇聚内部 MCU 专家们开发的各种应用笔记配套代码(AN SW),通用代码片段,应用软件包(SW Pack)和综合参考例程(Demo),涵盖
    的头像 发表于 08-17 15:18 541次阅读
    ACH拉近您与<b class='flag-5'>恩</b>智<b class='flag-5'>浦</b><b class='flag-5'>MCU</b>专家的距离

    发布新一代MCX A系列MCU

    半导体近日发布了MCX A14x和MCX A15x两款通用MCU,作为MCX A系列中的首批产品,现已正式上市。
    的头像 发表于 02-02 14:41 562次阅读

    【上海】5月25日-基于MCX N系列MCU结合RT-Thread的应用与实践 线下培训

    5月25号,RT-Thread将携手共同举办基于MCXN系列MCU结合RT-Thre
    的头像 发表于 05-13 18:19 205次阅读
    【上海】5月25日-基于<b class='flag-5'>恩</b>智<b class='flag-5'>浦</b>MCX N<b class='flag-5'>系列</b><b class='flag-5'>MCU</b>结合RT-Thread的应用与实践 线下培训

    新品MCX N系列线下培训来啦!LVGL、AI等超多精彩Demo演示,快来报名吧!

    5月25号,RT-Thread将携手共同举办基于MCXN系列MCU结合RT-Thre
    的头像 发表于 05-19 08:36 182次阅读
    <b class='flag-5'>恩</b>智<b class='flag-5'>浦</b>新品MCX N<b class='flag-5'>系列</b>线下培训来啦!LVGL、AI等超多精彩Demo演示,快来报名吧!