查看: 2747|回复: 30

[分享] i.MX RT1170双核下不同GPIO组的访问以及中断设计

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

    [LV.8]以坛为家I

    3299

    主题

    6546

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32022
    最后登录
    2024-4-25
    发表于 2022-9-20 09:17:52 | 显示全部楼层 |阅读模式
    i.MX RT1170双核下不同GPIO组的访问以及中断设计


    在双核的i.MX RT1170下设计应用程序,有一个比较重要的考虑点是片内外设资源共享以及任务分配问题,同样一个任务既可以放在默认主核CM7下做,也可以放在默认从核 CM4下去完成。如果这个任务跟片内外设有关,那就得考虑该外设是否在两个核下设计与使用一致,这在项目开始前必须要调研清楚。
    今天就和大家聊一聊i.MX RT1170的GPIO外设的使用,在两个核下有什么异同以及注意点。
    在正文开始之前,建议大家先浏览一下我之前写的关于GPIO的两篇文章:《以i.MX RT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程》、《聊聊i.MX RT1xxx上的普通GPIO与高速GPIO差异及其用法》。
    注:本文内容虽以i.MX RT1170为例,但同样适用i.MX RT1160。

    一、从引脚看GPIO分组

    先聊聊GPIO分组,目前 i.MX RT1170 芯片封装主要是BGA289,除去电源、地、时钟、专用外设引脚外,可用作通用I/O的引脚剩下174个,而芯片内部GPIO模块多达 16个(GPIO1-13、CM7_GPIO2-3),显然GPIO模块太富裕了,显得硬件I/O引脚资源有点紧张,所以不可避免地多个GPIO 模块要复用硬件 I/O引脚,复用关系如下:

    GPIO1与GPIO7复用同一组I/O引脚,共32个pin。
    GPIO2与GPIO8以及CM7_GPIO2复用同一组I/O引脚,共32个pin。
    GPIO3与GPIO9以及CM7_GPIO3复用同一组I/O引脚,共32个pin。
    GPIO4与GPIO10复用同一组I/O引脚,共32个pin。
    GPIO5与GPIO11复用同一组I/O引脚,共17个pin。
    GPIO6与GPIO12复用同一组I/O引脚,共16 个pin。
    GPIO13独享一组I/O引脚,共13个pin。
    下图是i.MX RT1170 GPIO相关的Pinmux表,其中GPIO1-6、GPIO13主要在Alt5选项里,GPIO7-12主要在 Alt10 选项里,并且大部分I/O引脚默认功能就是GPIO(见表中 DEF 一栏)。此外表中并未看到CM7_GPIO2-3选项,这是因为其和GPIO2-3共用了 Alt5选项(需进一步通过IOMUXC_GPR->GPR40-43寄存器设置)。
    11.png
    二、关于GPIO外设访问

    知道了GPIO分组以及I/O引脚复用情况,那么这些GPIO模块是否可以被i.MX RT1170 两个核(CM7/CM4)对等访问呢?我们用官方例程 \SDK_2.11.1_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\gpio\led_output 来做测试,这个例程操作的是 MIMXRT1170-EVK 板卡上用于连接 LED 灯的引脚 GPIO_AD_04,从上一节里我们得知这个 I/O 引脚可被用作 GPIO3[3]、CM7_GPIO3[3]、GPIO9[3],因此我们编写了如下三个相应的 gpio 翻转测试函数:)。
    1. gpio_pin_config_t s_ledConfig = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};

    2. void toggle_gpio3_3(void)
    3. {
    4.     CLOCK_EnableClock(kCLOCK_Iomuxc);
    5.     IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03, 0U);
    6.     IOMUXC_GPR->GPR42 &= ~(1u << 3);
    7.     GPIO_PinInit(GPIO3, 3, &s_ledConfig);
    8.     while(1)
    9.     {
    10.         SDK_DelayAtLeastUs(100000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    11.         GPIO_PortToggle(GPIO3, 1u << 3);
    12.     }
    13. }

    14. void toggle_cm7_gpio3_3(void)
    15. {
    16.     CLOCK_EnableClock(kCLOCK_Iomuxc);
    17.     IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03, 0U);
    18.     IOMUXC_GPR->GPR42 |= (1u << 3);
    19.     GPIO_PinInit(CM7_GPIO3, 3, &s_ledConfig);
    20.     while(1)
    21.     {
    22.         SDK_DelayAtLeastUs(100000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    23.         GPIO_PortToggle(CM7_GPIO3, 1u << 3);
    24.     }
    25. }

    26. void toggle_gpio9_3(void)
    27. {
    28.     CLOCK_EnableClock(kCLOCK_Iomuxc);
    29.     IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO9_IO03, 0U);
    30.     GPIO_PinInit(GPIO9, 3, &s_ledConfig);
    31.     while(1)
    32.     {
    33.         SDK_DelayAtLeastUs(100000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
    34.         GPIO_PortToggle(GPIO9, 1u << 3);
    35.     }
    36. }
    复制代码
    我们把上面三个函数分别加到两个核下的 led_output 工程主函数里,并且在板卡上实测,结果如下表。
    据此进一步扩展结论,除了 CM7_GPIO2-3 无法在 CM4 内核下被访问外,其余 GPIO1-13 在两个核下都能被正常访问。
    注:在 CM4 系统地址映射里,CM7_GPIO2_BASE 0x42008000u、CM7_GPIO3_BASE 0x4200C000u 地址都是不可访问状态。
    12.png
    三、关于GPIO中断设计
    除了 GPIO 外设一般寄存器访问之外,GPIO 中断方面是不是在 i.MX RT1170 两个核(CM7/CM4)下设计也一致呢?这得对比 MIMXRT1176_cm7.h 和 MIMXRT1176_cm4.h 头文件里关于 IRQn_Type 的定义,我将相同项去掉了,只保留差异项的定义对比如下(GPIO 相关的全部保留了):
    13.png
    大部分外设中断号定义在两个核下都是一致的,这意味着 i.MX RT1170 两个核设计上其实是对等关系。但是 GPIO 中断这里确实是有不小的区别的:

    GPIO1-5、GPIO13 中断在两个核下定义一致
    GPIO6、CM7_GPIO2-3 中断仅在 CM7 核下有定义
    GPIO7-12 中断仅在 CM4 核下有定义
    继续以上一节操作的 MIMXRT1170-EVK 板卡上用于连接 LED 灯的引脚 GPIO_AD_04 为例测试其中断情况,编写了相关中断配置使能函数如下:
    1. gpio_pin_config_t s_ledConfig = {kGPIO_DigitalInput, 0, kGPIO_IntRisingEdge};

    2. void GPIO3_Combined_0_15_IRQHandler(void)
    3. {
    4.     GPIO_PortClearInterruptFlags(GPIO3, 1U << 3);
    5.     SDK_ISR_EXIT_BARRIER;
    6. }

    7. void config_irq_gpio3_3(void)
    8. {
    9.     CLOCK_EnableClock(kCLOCK_Iomuxc);
    10.     IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03, 0U);
    11.     IOMUXC_GPR->GPR42 &= ~(1u << 3);
    12.     NVIC_EnableIRQ(GPIO3_Combined_0_15_IRQn);
    13.     GPIO_PinInit(GPIO3, 3, &s_ledConfig);
    14.     GPIO_PortEnableInterrupts(GPIO3, 1U << 3);
    15. }

    16. void CM7_GPIO2_3_IRQHandler(void)
    17. {
    18.     GPIO_PortClearInterruptFlags(CM7_GPIO3, 1U << 3);
    19.     SDK_ISR_EXIT_BARRIER;
    20. }

    21. void config_irq_cm7_gpio3_3(void)
    22. {
    23.     CLOCK_EnableClock(kCLOCK_Iomuxc);
    24.     IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03, 0U);
    25.     IOMUXC_GPR->GPR42 |= (1u << 3);
    26.     NVIC_EnableIRQ(CM7_GPIO2_3_IRQn);
    27.     GPIO_PinInit(CM7_GPIO3, 3, &s_ledConfig);
    28.     GPIO_PortEnableInterrupts(CM7_GPIO3, 1U << 3);
    29. }

    30. void GPIO7_8_9_10_11_IRQHandler(void)
    31. {
    32.     GPIO_PortClearInterruptFlags(GPIO9, 1U << 3);
    33.     SDK_ISR_EXIT_BARRIER;
    34. }

    35. void config_irq_gpio9_3(void)
    36. {
    37.     CLOCK_EnableClock(kCLOCK_Iomuxc);
    38.     IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO9_IO03, 0U);
    39.     NVIC_EnableIRQ(GPIO7_8_9_10_11_IRQn);
    40.     GPIO_PinInit(GPIO9, 3, &s_ledConfig);
    41.     GPIO_PortEnableInterrupts(GPIO9, 1U << 3);
    42. }
    复制代码
    我们把上面三个 config 函数分别加到两个核下的 led_output 工程主函数里,并且在板卡上实测,可以使用外部高电平强加到 GPIO_AD_04 引脚(R1855 电阻一端),然后再移除高电平以造出输入电平翻转,测试结果如下表。据此进一步扩展结论,如果希望双核下得到一致的 GPIO 使用体验,建议选择 GPIO1-5、GPIO13。
    14.png

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2022-9-20 10:40:36 | 显示全部楼层
    不研究datasheet,无法发挥芯片的性能。
    简单的应用并非积累经验,而是枯燥的重复。
    要发挥芯片的极致性能必须研究阅读datasheet

    经验的积累是一种磨炼,没有捷径。
    如果非要说有捷径,那就关注NXPIC.ORG论坛了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-1-4 09:08
  • 签到天数: 493 天

    [LV.9]以坛为家II

    2

    主题

    763

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1842
    最后登录
    2024-4-2
    发表于 2022-9-23 09:06:15 | 显示全部楼层
    干货经验,谢谢分享!
    加油!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-4-7 20:47
  • 签到天数: 537 天

    [LV.9]以坛为家II

    69

    主题

    2521

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7104
    最后登录
    2024-4-9
    发表于 2022-9-23 14:28:03 | 显示全部楼层
    双核应用,好好学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2022-2-25 10:20
  • 签到天数: 32 天

    [LV.5]常住居民I

    1

    主题

    289

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1129
    最后登录
    2023-10-31
    发表于 2022-9-23 16:12:09 | 显示全部楼层
    还没用过双核单片机
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12

    主题

    789

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2719
    最后登录
    2024-4-4
    发表于 2022-9-23 16:14:12 | 显示全部楼层
    前来学习了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 11:49
  • 签到天数: 2037 天

    [LV.Master]伴坛终老

    17

    主题

    4822

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    9895
    最后登录
    2024-4-24
    发表于 2022-9-23 21:21:28 | 显示全部楼层
    谢谢分享!
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 1295 天

    [LV.10]以坛为家III

    7

    主题

    6300

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    10514
    最后登录
    2024-4-25
    发表于 2022-9-23 23:09:50 | 显示全部楼层

    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 10:22
  • 签到天数: 364 天

    [LV.8]以坛为家I

    0

    主题

    388

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1167
    最后登录
    2024-4-24
    发表于 2022-9-24 10:54:42 | 显示全部楼层
    i.MX RT1170 芯片封装主要是BGA289,
    GPIO1与GPIO7复用同一组I/O引脚,共32个pin。
    GPIO2与GPIO8以及CM7_GPIO2复用同一组I/O引脚,共32个pin。
    GPIO3与GPIO9以及CM7_GPIO3复用同一组I/O引脚,共32个pin。
    GPIO4与GPIO10复用同一组I/O引脚,共32个pin。
    GPIO5与GPIO11复用同一组I/O引脚,共17个pin。
    GPIO6与GPIO12复用同一组I/O引脚,共16 个pin。
    GPIO13独享一组I/O引脚,共13个pin。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    昨天 16:52
  • 签到天数: 1734 天

    [LV.Master]伴坛终老

    4

    主题

    7034

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    11413
    最后登录
    2024-4-24
    发表于 2022-9-24 13:28:41 | 显示全部楼层
    学**                        
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-25 10:03 , Processed in 0.149896 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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