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

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

3天内不再提示

关于GPIO外设访问及中断设计

痞子衡嵌入式 来源:痞子衡嵌入式 作者:痞子衡嵌入式 2022-09-05 10:00 次阅读

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1170双核下不同GPIO组的访问以及中断设计

在双核 i.MXRT1170 下设计应用程序,有一个比较重要的考虑点是片内外设资源共享以及任务分配问题,同样一个任务既可以放在默认主核 CM7 下做,也可以放在默认从核 CM4 下去完成。如果这个任务跟片内外设有关,那就得考虑该外设是否在两个核下设计与使用一致,这在项目开始前必须要调研清楚。

今天痞子衡和大家聊一聊 i.MXRT1170 的 GPIO 外设使用在两个核下有什么异同以及注意点,在正文开始之前,建议大家先浏览一下痞子衡之前写的关于 GPIO 的两篇文章:《以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程》《聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法》

  • Note:本文内容虽以 i.MXRT1170 为例,但同样适用 i.MXRT1160。

一、从引脚看GPIO分组

先聊聊 GPIO 分组,目前 i.MXRT1170 芯片封装主要是 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.MXRT1170 GPIO 相关的 Pinmux 表,其中 GPIO1-6、GPIO13 主要在 Alt5 选项里,GPIO7-12 主要在 Alt10 选项里,并且大部分 I/O 引脚默认功能就是 GPIO(见表中 DEF 一栏)。此外表中并未看到 CM7_GPIO2-3 选项,这是因为其和 GPIO2-3 共用了 Alt5 选项(需进一步通过 IOMUXC_GPR->GPR40-43 寄存器设置)。

166c8c84-2b61-11ed-ba43-dac502259ad0.png

二、关于GPIO外设访问

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

gpio_pin_config_ts_ledConfig={kGPIO_DigitalOutput,0,kGPIO_NoIntmode};

voidtoggle_gpio3_3(void)
{
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03,0U);
IOMUXC_GPR->GPR42&=~(1u<< 3);
GPIO_PinInit(GPIO3,3,&s_ledConfig);
while(1)
{
SDK_DelayAtLeastUs(100000,SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
GPIO_PortToggle(GPIO3,1u<< 3);
}
}

voidtoggle_cm7_gpio3_3(void)
{
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03,0U);
IOMUXC_GPR->GPR42|=(1u<< 3);
GPIO_PinInit(CM7_GPIO3,3,&s_ledConfig);
while(1)
{
SDK_DelayAtLeastUs(100000,SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
GPIO_PortToggle(CM7_GPIO3,1u<< 3);
}
}

voidtoggle_gpio9_3(void)
{
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO9_IO03,0U);
GPIO_PinInit(GPIO9,3,&s_ledConfig);
while(1)
{
SDK_DelayAtLeastUs(100000,SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
GPIO_PortToggle(GPIO9,1u<< 3);
}
}

我们把上面三个函数分别加到两个核下的 led_output 工程主函数里,并且在板卡上实测,结果如下表。据此进一步扩展结论,除了 CM7_GPIO2-3 无法在 CM4 内核下被访问外,其余 GPIO1-13 在两个核下都能被正常访问。

  • Note:在 CM4 系统地址映射里,CM7_GPIO2_BASE 0x42008000u、CM7_GPIO3_BASE 0x4200C000u 地址都是不可访问状态。
测试函数 cm7下 cm4下
toggle_gpio3_3 正常工作,LED闪烁 正常工作,LED闪烁
toggle_cm7_gpio3_3 正常工作,LED闪烁 异常跑飞
toggle_gpio9_3 正常工作,LED闪烁 正常工作,LED闪烁

三、关于GPIO中断设计

除了 GPIO 外设一般寄存器访问之外,GPIO 中断方面是不是在 i.MXRT1170 两个核(CM7/CM4)下设计也一致呢?这得对比 MIMXRT1176_cm7.h 和 MIMXRT1176_cm4.h 头文件里关于 IRQn_Type 的定义,痞子衡将相同项去掉了,只保留差异项的定义对比如下(GPIO 相关的全部保留了):

169d2722-2b61-11ed-ba43-dac502259ad0.png

大部分外设中断号定义在两个核下都是一致的,这意味着 i.MXRT1170 两个核设计上其实是对等关系。但是 GPIO 中断这里确实是有不小的区别的:

- GPIO1-5、GPIO13 中断在两个核下定义一致
- GPIO6、CM7_GPIO2-3 中断仅在 CM7 核下有定义
- GPIO7-12 中断仅在 CM4 核下有定义

继续以上一节操作的 MIMXRT1170-EVK 板卡上用于连接 LED 灯的引脚 GPIO_AD_04 为例测试其中断情况,编写了相关中断配置使能函数如下:

gpio_pin_config_ts_ledConfig={kGPIO_DigitalInput,0,kGPIO_IntRisingEdge};

voidGPIO3_Combined_0_15_IRQHandler(void)
{
GPIO_PortClearInterruptFlags(GPIO3,1U<< 3);
SDK_ISR_EXIT_BARRIER;
}

voidconfig_irq_gpio3_3(void)
{
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03,0U);
IOMUXC_GPR->GPR42&=~(1u<< 3);
NVIC_EnableIRQ(GPIO3_Combined_0_15_IRQn);
GPIO_PinInit(GPIO3,3,&s_ledConfig);
GPIO_PortEnableInterrupts(GPIO3,1U<< 3);
}

voidCM7_GPIO2_3_IRQHandler(void)
{
GPIO_PortClearInterruptFlags(CM7_GPIO3,1U<< 3);
SDK_ISR_EXIT_BARRIER;
}

voidconfig_irq_cm7_gpio3_3(void)
{
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03,0U);
IOMUXC_GPR->GPR42|=(1u<< 3);
NVIC_EnableIRQ(CM7_GPIO2_3_IRQn);
GPIO_PinInit(CM7_GPIO3,3,&s_ledConfig);
GPIO_PortEnableInterrupts(CM7_GPIO3,1U<< 3);
}

voidGPIO7_8_9_10_11_IRQHandler(void)
{
GPIO_PortClearInterruptFlags(GPIO9,1U<< 3);
SDK_ISR_EXIT_BARRIER;
}

voidconfig_irq_gpio9_3(void)
{
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO9_IO03,0U);
NVIC_EnableIRQ(GPIO7_8_9_10_11_IRQn);
GPIO_PinInit(GPIO9,3,&s_ledConfig);
GPIO_PortEnableInterrupts(GPIO9,1U<< 3);
}

我们把上面三个 config 函数分别加到两个核下的 led_output 工程主函数里,并且在板卡上实测,可以使用外部高电平强加到 GPIO_AD_04 引脚(R1855 电阻一端),然后再移除高电平以造出输入电平翻转,测试结果如下表。据此进一步扩展结论,如果希望双核下得到一致的 GPIO 使用体验,建议选择 GPIO1-5、GPIO13。

测试函数 cm7下 cm4下
config_irq_gpio3_3 中断正常触发 中断正常触发
config_irq_cm7_gpio3_3 中断正常触发 /
config_irq_gpio9_3 / 中断正常触发

至此,i.MXRT1170双核下不同GPIO组的访问以及中断设计痞子衡便介绍完毕了,掌声在哪里~~~

审核编辑:汤梓红

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

    关注

    5

    文章

    884

    浏览量

    41030
  • 引脚
    +关注

    关注

    16

    文章

    1045

    浏览量

    48973
  • GPIO
    +关注

    关注

    16

    文章

    1137

    浏览量

    50596

原文标题:i.MXRT1170双核下不同GPIO组的访问以及中断设计

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

收藏 人收藏

    评论

    相关推荐

    单片机必须了解的外设功能——定时器/中断功能

    上一期《单片机必须了解的外设功能——GPIO/串行通信》中,我们了解了单片机的外设功能的结构和使用方法,本文主要介绍单片机必须了解的定时器中断功能。
    发表于 09-09 11:14 6949次阅读

    每一个GPIO如何配置成一个外部中断触发源

    1STM32中断分组STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之
    的头像 发表于 01-25 08:44 1.5w次阅读
    每一个<b class='flag-5'>GPIO</b>如何配置成一个外部<b class='flag-5'>中断</b>触发源

    STM32 GPIO的外部中断设计

    在之前针对STM32的GPIO相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读信号引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取检测操作,除了轮询的方式访问
    发表于 04-14 10:51 1393次阅读
    STM32 <b class='flag-5'>GPIO</b>的外部<b class='flag-5'>中断</b>设计

    关于GPIO和PIN的区别以及外设中断的实现

    在例程里面有GPIO和PIN的配置例程,想知道二者有什么区别?同时SPI中断和UART中断是如何实现的?
    发表于 06-21 11:50

    nRF5芯片外设GPIO和GPIOTE介绍

    副作用场景。由于GPIO模块不能处理中断,所以port event中断实际是交给GPIOTE模块来一起处理的。GPIOTE,全称GPIO Tasks and Events,GPIOTE
    发表于 02-22 16:38

    如何将I2C外设添加到GPIO并使用Cortex M4访问它呢?

    你好 ,我有一些关于GPIO wrt 分配给 Cortex M4 和 Cotex A7 的问题。任务是将 I2C 外设添加到 GPIO 并使用 Cortex M4
    发表于 12-27 06:10

    GPIO中断和事件:为ARM初学者导航(6)

    第六讲:GPIO中断和事件--《为ARM初学者导航》
    的头像 发表于 07-02 00:22 4418次阅读
    <b class='flag-5'>GPIO</b>、<b class='flag-5'>中断</b>和事件:为ARM初学者导航(6)

    GPIO做输出还能作外部中断输入吗?

    我们这里要谈的是基于硬件模式的外部中断话题。当STM32的GPIO作为输出时,可能是通用GPIO输出也可能是基于其它外设复用情况下的输出,即复用输出。
    的头像 发表于 07-05 10:42 4370次阅读
    <b class='flag-5'>GPIO</b>做输出还能作外部<b class='flag-5'>中断</b>输入吗?

    基于LabVIEW的数据访问及报表生成技术讲解

    基于LabVIEW的数据访问及报表生成技术讲解。
    发表于 05-27 15:28 69次下载

    嵌入式Linux的GPIO中断

    做个STM32开发的都知道,通过程序配置让普通的GPIO口具有中断功能。这样对于设备检测某些硬件的自动设备要方便的多。那么在嵌入式的Linux是否具有这样的功能呢?答案是肯定的,下面我们就来介绍一下
    发表于 11-01 17:37 6次下载
    嵌入式Linux的<b class='flag-5'>GPIO</b><b class='flag-5'>中断</b>

    基于STM32CubMX和HAL库的外设开发(七、GPIO作为外部中断

    基于STM32CubMX和HAL库的外设开发第七讲 GPIO作为外部中断外部中断简介STM32中含有多个外部中断号(外部
    发表于 01-14 15:50 1次下载
    基于STM32CubMX和HAL库的<b class='flag-5'>外设</b>开发(七、<b class='flag-5'>GPIO</b>作为外部<b class='flag-5'>中断</b>)

    深度剖析GPIO中断

    本文介绍 GPIO 中断,包括中断示例及其各种功能。这是上一篇文章的延续,该文章解释了微控制器的并发和中断的概念。
    的头像 发表于 04-27 16:11 8115次阅读
    深度剖析<b class='flag-5'>GPIO</b><b class='flag-5'>中断</b>

    AMetal开发:通用外设GPIO驱动的开发

    : 了解通用外设标准接口层、外设硬件层开发、外设驱动层开发、外设用户配置文件开发。           图1 通用外设文件结构 标准层了解
    的头像 发表于 05-31 17:28 1752次阅读

    关于Linux的GPIO中断知识

    在嵌入式系统中,经常会用到gpio外部中断来获取外部事件,比如按键、传感器、网络通信等等。一般中断都会绑定一个中断回调函数,来执行产生中断
    的头像 发表于 03-24 11:27 2917次阅读
    <b class='flag-5'>关于</b>Linux的<b class='flag-5'>GPIO</b><b class='flag-5'>中断</b>知识

    如何配置GPIO中断功能呢?

    如何配置GPIO中断功能呢? GPIO在嵌入式系统中经常用于控制外设,如LED、摄像头、传感器等。除此之外,GPIO还可以被配置为
    的头像 发表于 10-30 09:57 3046次阅读