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

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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 寄存器设置)。
二、关于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_t s_ledconfig = {kgpio_digitaloutput, 0, kgpio_nointmode};void toggle_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  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 相关的全部保留了):
大部分外设中断号定义在两个核下都是一致的,这意味着 i.mxrt1170 两个核设计上其实是对等关系。但是 gpio 中断这里确实是有不小的区别的:
- gpio1-5、gpio13 中断在两个核下定义一致- gpio6、cm7_gpio2-3 中断仅在 cm7 核下有定义- gpio7-12 中断仅在 cm4 核下有定义 继续以上一节操作的 mimxrt1170-evk 板卡上用于连接 led 灯的引脚 gpio_ad_04 为例测试其中断情况,编写了相关中断配置使能函数如下:
gpio_pin_config_t s_ledconfig = {kgpio_digitalinput, 0, kgpio_intrisingedge};void gpio3_combined_0_15_irqhandler(void){    gpio_portclearinterruptflags(gpio3, 1u  测试函数 cm7下 cm4下
config_irq_gpio3_3 中断正常触发 中断正常触发
config_irq_cm7_gpio3_3 中断正常触发 /
config_irq_gpio9_3 / 中断正常触发
至此,i.mxrt1170双核下不同gpio组的访问以及中断设计痞子衡便介绍完毕了,掌声在哪里~~~


理论与实验结合建立一种新型的聚合物锂硫电池
苹果不断降价 开始进入策略调整期
智联物联4G DTU新能源充电桩解决方案
小米Max2发布会前价格泄露:售价爽翻!坚果Pro大危机
面部表情识别的技术挑战与解决方案
关于GPIO外设访问及中断设计
传三星电子将在德州奥斯汀建立晶圆厂
全球首款折叠屏手机中兴天机Axon M,首发京东!
选择5.0蓝牙网关的三大理由_SKYLAB
爆款福利来袭!猎板PCB打样5元/款史上最低!
RS-485信号隔离放大串口透明传输模块
智能语音最强突破!微软语音识别率已堪比人声
单片机I/O口推挽输出与开漏输出的区别
飞腾平台适配加速 2022年十月共72款软件适配飞腾CPU
A类放大器、B类放大器与AB类放大器的区别是什么?
三星、LGD等面板企业纷纷出售或停止在国内的液晶面板生产线
AMD首发PCIe 4.0:带宽翻倍、灵活性大增
NVIDIA 支撑自动驾驶车端云端同步迈入高算力大模型时代
中国计算机视觉的前途在哪?
小米MIX4正式发布 小米MIX4参数介绍