请选择 进入手机版 | 继续访问电脑版
查看: 1024|回复: 2

[分享] [痞子衡]对比恩智浦全系列MCU的GPIO电平中断设计差异

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32000
    最后登录
    2024-4-9
    发表于 2023-2-7 13:27:06 | 显示全部楼层 |阅读模式
    对比恩智浦全系列MCU的GPIO电平中断设计差异

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦全系列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 外设。
    1.png
    二、不同系列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 操作。
    2.png

    我们可以直接在 \SDK_2.3.1_FRDM-KL03Z\boards\frdmkl03z\driver_examples\gpio\input_interrupt 例程上做测试,只需要做简单修改,痞子衡摘取了主要代码如下。FRDM-KL03Z 板上 SW3 按键对应 PTB5 引脚(按下为低电平,松开为高电平),代码设计里按一次 SW3 便打印一次。测试结果来看,在 Kinetis 上即使是电平中断,PORTx->ISFR 寄存器也是必须要手动清零的,与手册描述一致。
    3.png
    1. volatile bool g_ButtonPress = false;
    2. void PORTB_IRQHandler(void)
    3. {
    4.     // 清除中断标志
    5.     PORTB->ISFR = 1U << 5U;
    6.     g_ButtonPress = true;
    7. }
    8. int main(void)
    9. {
    10.     // 省略 PTB5 引脚的 PINMUX 配置
    11.     gpio_pin_config_t sw_config = {
    12.         kGPIO_DigitalInput, 0,
    13.     };
    14.     // 仅需此处修改:将 GPIO 中断模式改为低电平触发
    15.     PORT_SetPinInterruptConfig(PORTB, 5U, kPORT_InterruptLogicZero);
    16.     NVIC_EnableIRQ(PORTB_IRQn);
    17.     GPIO_PinInit(GPIOB, 5U, &sw_config);
    18.     while (1)
    19.     {
    20.         if (g_ButtonPress)
    21.         {
    22.             delay();
    23.             PRINTF(" %s is pressed \r\n", "SW3");
    24.             g_ButtonPress = false;
    25.         }
    26.     }
    27. }
    复制代码
    2.2 i.MXRT四位数
    i.MXRT四位数系列分为 RT1010/1015/1020/1040/1050/1060/1160/1170/1180 等若干子型号,但是它们关于 GPIO 中断设计是一样的。痞子衡选取了 i.MXRT1062 这颗芯片来做的测试,查看其手册 GPIOx->ISR 寄存器标记了中断状态,同样标明了需要做 W1C 操作。
    4.png
    我们可以直接在 \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 上看起来更合理。
    5.png
    1. volatile bool g_InputSignal = false;
    2. void GPIO5_Combined_0_15_IRQHandler(void)
    3. {
    4.     // 清除中断标志
    5.     GPIO5->ISR = 1U << 0U;
    6.     g_InputSignal = true;
    7.     __DSB();
    8. }
    9. int main(void)
    10. {
    11.     // 省略 WAKEUP 引脚的 PINMUX 配置
    12.     gpio_pin_config_t sw_config = {
    13.         kGPIO_DigitalInput,
    14.         0,
    15.         kGPIO_IntLowLevel,  // 仅需此处修改:将 GPIO 中断模式改为低电平触发
    16.     };
    17.     GPIO_PortEnableInterrupts(GPIO5, 1U << 0U);
    18.     NVIC_EnableIRQ(GPIO5_Combined_0_15_IRQn);
    19.     GPIO_PinInit(GPIO5, 0U, &sw_config);
    20.     while (1)
    21.     {
    22.         if (g_InputSignal)
    23.         {
    24.             delay();
    25.             PRINTF(" %s is turned on. \r\n", "SW8");
    26.             g_InputSignal = false;
    27.         }
    28.     }
    29. }
    复制代码
    2.3 LPC
    LPC系列分为 800/1x00/4000/4300/51Uxx/54000/5500 等若干子型号,但是它们关于 GPIO 中断设计是一样的。痞子衡选取了 LPC54114 这颗芯片来做的测试,查看其手册 PINT->IST 寄存器标记了中断状态,这里关于 W1C 操作做了边沿方式和电平方式的区别,其中对于电平方式,W1C 是切换有效电平逻辑。
    6.png
    我们可以直接在 \SDK_2_9_0_LPCXpresso54114\boards\lpcxpresso54114\driver_examples\pint\pin_interrupt 例程上做测试,只需要做简单修改,主要代码如下。LPCXpresso-54114 板上 SW1 按键对应 PIO0[24] 引脚(按下为低电平,松开为高电平),代码设计里按一次 SW1 便打印一次。测试结果来看,在 LPC 上如果是电平中断,PINT->IST 寄存器会在电平状态切换时自动清零,跟手册描述有点差异,并且中断处理函数里如果主动加上 W1C 操作其效果就变成了双边沿中断,这样的设计比 i.MXRT 四位数更进了一步。
    7.png
    1. volatile bool g_ButtonPress = false;
    2. void PIN_INT0_DriverIRQHandler(void)
    3. {
    4.     uint32_t pmstatus = PINT_PatternMatchResetDetectLogic(PINT);
    5.     if (s_pintCallback[kPINT_PinInt0] != NULL)
    6.     {
    7.         s_pintCallback[kPINT_PinInt0](kPINT_PinInt0, pmstatus);
    8.     }
    9.     // 清除中断标志
    10.     PINT->IST = (1UL << (uint32_t)kPINT_PinInt0);
    11.     __DSB();
    12. }
    13. void pint_intr_callback(pint_pin_int_t pintr, uint32_t pmatch_status)
    14. {
    15.     g_ButtonPress = true;
    16. }
    17. int main(void)
    18. {
    19.     INPUTMUX_Init(INPUTMUX);
    20.     INPUTMUX_AttachSignal(INPUTMUX, kPINT_PinInt0, kINPUTMUX_GpioPort0Pin24ToPintsel);
    21.     PINT_Init(PINT);
    22.     // 仅需此处修改:将 GPIO 中断模式改为低电平触发
    23.     PINT_PinInterruptConfig(PINT, kPINT_PinInt0, kPINT_PinIntEnableLowLevel, pint_intr_callback);
    24.     PINT_EnableCallbackByIndex(PINT, kPINT_PinInt0);
    25.     while (1)
    26.     {
    27.         if (g_ButtonPress)
    28.         {
    29.             delay();
    30.             PRINTF(" %s Pin Interrupt event detected \r\n", "SW1");
    31.             g_ButtonPress = false;
    32.         }
    33.     }
    34. }
    复制代码
    至此,恩智浦全系列MCU的GPIO电平中断设计差异痞子衡便介绍完毕了,掌声在哪里~~~







    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 268 天

    [LV.8]以坛为家I

    31

    主题

    2988

    帖子

    38

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5290

    活跃会员

    最后登录
    2024-4-12
    发表于 2023-2-7 13:32:29 | 显示全部楼层
    不错啊,学习了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    12 小时前
  • 签到天数: 1040 天

    [LV.10]以坛为家III

    0

    主题

    1499

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4009
    最后登录
    2024-4-18
    发表于 2023-2-7 14:54:35 来自手机 | 显示全部楼层
    感谢分享
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-18 12:57 , Processed in 0.126899 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表