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

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

3天内不再提示

i.MX6ULL处理器GPIO寄存器配置原理及方法

CHANBAEK 来源:嵌入式攻城狮 作者:安迪西 2023-04-14 11:43 次阅读

之前的文章中介绍了新旧字符设备驱动开发的方式,并利用虚拟的字符设备来学习其开发流程,没有涉及到操作Linux开发板上的硬件。 对硬件的操作,究其本质最终都是要操作处理器寄存器。 因此在操作硬件之前,我们需要先了解有关GPIO的寄存器配置原理及方法

1. 认识i. MX6ULL处理器GPIO

1.1 基本概念

以下是一些名词缩写及其含义:

  • IO:Input Output,用于CPU与外界进行信息交互
  • GPIO:General Purpose IO ports,通用IO口
  • SNVS:Secure Non-Volatile Storage 安全的非易失性存储
  • IOMUX:Input Output Multiplexer 输入/输出多路复用器
  • IOMUXC:Input Output Multiplexer Controller 输入/输出多路复用控制器
  • SW:Switch 开关

1.2 GPIO逻辑结构

下图为i. MX6ULL处理器的GPIO硬件结构框图,其中PAD1和PAD2表示i.MX6ULL芯片引出的GPIO引脚,其余部件均位于芯片内部

图片

上图中各部分的功能和作用如下

PAD1 :GPIO引脚,其左侧通过IOMUX复用选择器连接到各种寄存器上

IOMUX复用选择器:用于将芯片引脚与最左侧的各种寄存器连接起来

IOMUXC复用控制器:IO通过MUX寄存器来配置复用功能,如GPIO、IIC等; 通过PAD寄存器来配置引脚属性,如驱动能力,是否使用上下拉电阻

Block外设功能控制块:例如具有PWM输出功能的引脚,它需要PWM外设的支持

GPIO外设:GPIO是每个IO都有的外设,是IO控制的基本功能, 如输出高低电平、 检测电平输入等。 当需要使用引脚的GPIO功能时,就要配置GPIO外设中的各个寄存器

PAD2 :另一个引脚,它与PAD1有一根信号线连接,表示部分引脚的输出可以作为另一个引脚的输入

1.3 GPIO命名

i.MX6ULL处理器的GPIO被分为5组,且每组的数量不同,具体可查阅数据手册

图片

另外根据IO类别,可以分为两大类:SNVS域IO和通用域IO,这两类IO本质上是一样的

图片

2. 配置i. MX6ULL处理器GPIO

下面以GPIO1_IO00引脚为例,介绍GPIO配置的步骤

2.1 时钟配置

I.MX6ULL每个外设都有一个外设时钟,使用GPIO时,也必须先使能对应的时钟。 CCM (Clock Controller Module)时钟控制模块寄存器用来使能外设时钟。 CMM一共有CCM_CCGR0~CCM_CCGR6这7个寄存器,控制着I.MX6U的所有外设时钟开关

以CCM_CCGR0为例,它是个32位寄存器,每2位控制一个外设的时钟,比如 bit31:30 控制着GPIO2 的外设时钟,两个位就有 4 种操作方式:

图片

若要打开GPIO2的外设时钟,只需要设置CCM_CCGR0的bit31和bit30为1即可,即 CCM_CCGR0=3 << 30

图片

2.2 IO配置

配置MUX寄存器:配置复用功能

图片

IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00寄存器地址为:0x020E005C,只用到了最低的5位,bit0~bit3就是设置复用功能的,该引脚可复用为9种不同功能的IO

配置PAD 寄存器:配置引脚属性

图片

IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00寄存器地址为:0x020E02E8,只用到了低17位,用于设置速度、驱动能力、压摆率等

2.3 GPIO配置

上面的MUX和PAD寄存器都是配置IO的,当把IO配置为了GPIO功能后,还需要继续对GPIO外设的各种寄存器进行配置

配置DR寄存器:数据寄存器,一个GPIO组最大只有32个IO,32位DR寄存器中的每一个位对应一个GPIO

图片

当设置为输出模式,向指定的位写入数据,相应的IO就会输出相应的高低电平; 当设置为输入模式,比如GPIO1_IO00引脚接地的话,GPIO1. DR的bit0就是0

配置GDIR寄存器:方向寄存器,设置GPIO的工作方向是输入还是输出,每个位对应一个IO

图片

若要设置GPIO1_IO00为输入,则GPIO1.GDIR=0;反之GPIO1.GDIR=1

配置PSR寄存器:状态寄存器,每个IO对应一个位,用于获取对应的GPIO的状态

图片

是一个只读寄存器,功能类似于输入状态下的DR寄存器

配置ICR1/ICR2寄存器:中断控制寄存器,每两位对应一个GPIO,ICR1用于配置低16个GPIO,ICR2用于配置高16个GPIO

图片

例如设置GPIO1_IO15为上升沿触发中断,则GPIO1.ICR1 = 2 << 30

配置IMR寄存器:中断屏蔽寄存器,每个IO对应一个位,用于控制GPIO的中断使能和禁止

图片

例如要使能GPIO1_IO00的中断,则GPIO1.MIR=1

配置ISR寄存器:中断状态寄存器,每个IO对应一个位,只要某个GPIO的中断发生,ISR中相应的位会被置1

图片

可通过读取ISR寄存器来判断GPIO中断是否发生,相当于中断标志位。 处理完中断后,必须清除中断标志位

配置EDGE_SEL寄存器:边沿选择寄存器,每个IO对应一个位,用来设置边沿中断, 并会覆盖ICR1和ICR2的设置

图片

若相应位被置1,相当于设置了对应GPIO双边沿(上升沿和下降沿)触发。 例如,设置GPIO1.EDGE_SEL=1,则表示双边沿触发中断,无论 GFPIO1_CR1的设置为多少

3. GPIO配置总结

综上所述,i.MX6ULL的IO作为GPIO使用,需要进行以下几个步骤的配置:

  • 使能GPIO对应的时钟
  • 配置MUX寄存器,设置IO的复用功能,使其复用为GPIO功能
  • 配置PAD寄存器,设置IO的上下拉、速度等
  • 配置GPIO的各种寄存器,设置输入/输出、是否使用中断、默认输出电平等

裸机开发中,需要自已定义寄存器及其地址,通常代码如下:

/* 寄存器物理地址 */
#define CCM_CCGR1_BASE              (0X020C406C) 
#define SW_MUX_SNVS_TAMPER3_BASE    (0X02290014)
#define SW_PAD_SNVS_TAMPER3_BASE    (0X02290058)
#define GPIO5_DR_BASE               (0X020AC000)
#define GPIO5_GDIR_BASE             (0X020AC004)
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19121

    浏览量

    228874
  • 寄存器
    +关注

    关注

    31

    文章

    5304

    浏览量

    119876
  • Linux
    +关注

    关注

    87

    文章

    11215

    浏览量

    208754
  • 开发板
    +关注

    关注

    25

    文章

    4914

    浏览量

    97098
  • GPIO
    +关注

    关注

    16

    文章

    1189

    浏览量

    51852
收藏 人收藏

    评论

    相关推荐

    i.MX6ULL 驱动开发7—按键输入捕获与GPIO输入配置与高低电平读取

    本篇主要介绍了i.MX6ULL的按键检测的使用,主要的知识点是设备树的修改,以及GPIO的输入配置与高低电平的读取。
    的头像 发表于 05-24 09:11 6096次阅读
    <b class='flag-5'>i.MX6ULL</b> 驱动开发7—按键输入捕获与<b class='flag-5'>GPIO</b>输入<b class='flag-5'>配置</b>与高低电平读取

    I.MX6ULL终结者开发板裸机仿真jlink调试

    I.MX6ULL‘终结者’开发板预留了JTAG仿真接口,并给出了开发文档,可以实现在JLINK仿真条件下的单步跟踪、断点调试等功能,使得开发研究i.MX6ULL处理器的相关技术更加直
    发表于 07-07 10:56

    i.MX6ULL核心板资源

    `STAMP-IMX6ULL-CM是浙江启扬智能科技有限公司推出的基于 NXP i.MX6ULL 处理器的产品;i.MX 6ULL 是 NX
    发表于 07-12 17:50

    初识 i.MX6ULL 寄存器

    i.MX6ULL 电气属性寄存器2.4 i.MX6ULL GPIO控制寄存器3. ARM 汇编指令集简介3.1
    发表于 12-20 07:13

    I.MUX6ULL的初始化方法

    拉、速度等);4.使用GPIO输出高低电平。二、I.MX6ULL初始化1.使能时钟CCGR0-CCGR6,这七个寄存器控制着6ull所有外设
    发表于 03-02 06:18

    ARM裸机篇之i.MX6ULL处理器资料分享

    1、i.MX6ULL处理器启动过程i.MX6ULL是NXP基于ARM Cortex-A7内核的单核处理器家族,主频可以高900MHz。i.MX6UL
    发表于 04-14 16:42

    关于i.MX6ULL配置GPIO

    处理器,它的GPIO外设应该如何配置呢?今天小编就将通过飞凌嵌入式的OKMX6ULL-S开发板来为大家详细介绍。一、i.MX6ULL
    发表于 08-05 10:37

    珠海明远智睿科技联合NXP强势推出i.MX6ull核心板

    NXP I.MX6ULL是一个高性能、低功耗、高性价比处理器系列,基于ARM Cortex-A7内核,主频可达900MHz。i.MX 6ULL应用
    发表于 04-24 14:10 545次阅读

    飞凌i.MX6ULL开发板的评测,再次进阶拥有更高的性价比

    MCIMX6Y2开发设计,采用先进的ARMCortex-A7内核,运行速度高达800MHz。i.MX6ULL应用处理器包括一个集成的电源管理模块,降低了外接电源的复杂性,并简化了上电时序。 i
    发表于 10-27 11:55 1449次阅读
    飞凌<b class='flag-5'>i.MX6ULL</b>开发板的评测,再次进阶拥有更高的性价比

    基于NXP i.MX6ULL处理器的FETMX6ULL-C核心板

    “性价比高,功能接口丰富,资料齐全,稳定性强”这是许多用户对飞凌FETMX6ULL-S核心板的评价。作为NXP公司一颗经典的MPU,i.MX6ULL的市场认可度无需多言。而作为NXP公司的金牌
    发表于 04-11 15:05 1130次阅读
    基于NXP <b class='flag-5'>i.MX6ULL</b><b class='flag-5'>处理器</b>的FETMX<b class='flag-5'>6ULL</b>-C核心板

    基于i.MX6ULL应用处理器的FETMX6ULL-C核心板

    NXP i.MX6ULL扩展了i.MX6系列,它是一个高性能、超高效、低成本处理器子系列,采用先进的ARM Cortex-A7内核,运行速度高达800MHz。i.MX6ULL应用
    发表于 04-29 14:37 1316次阅读
    基于<b class='flag-5'>i.MX6ULL</b>应用<b class='flag-5'>处理器</b>的FETMX<b class='flag-5'>6ULL</b>-C核心板

    i.MX6ULL】驱动开发4——点亮LED(寄存器版)

    本篇主要介绍了如何通过操作寄存器来点亮i.MX6ULL开发板上的led,通过编写LED对应的驱动程序和应用程序,实现程序设计的分层。
    的头像 发表于 05-21 21:26 2929次阅读
    【<b class='flag-5'>i.MX6ULL</b>】驱动开发4——点亮LED(<b class='flag-5'>寄存器</b>版)

    使用pinctrl和gpio子系统实现LED灯驱动

    前边已经学了两种点灯,本质依然还是通过配置寄存器;在学习STM32的时候除了学习配置一下寄存器,基本都是使用库来开发,那么在i.MX6ULL
    的头像 发表于 04-03 10:17 1269次阅读

    飞凌嵌入式技术帖——i.MX9352的GPIO怎么用?

    让我们一起走近i.MX9352处理器,深入了解这位i.MX系列新成员的GPIO该如何操作,以及它与前辈i.MX6ULL
    的头像 发表于 05-16 15:07 1020次阅读
    飞凌嵌入式技术帖——<b class='flag-5'>i.MX</b>9352的<b class='flag-5'>GPIO</b>怎么用?

    基于i.MX6ULL的掉电检测设计与软件测试

    基于i.MX6ULL的掉电检测设计与软件测试基于i.MX6ULL平台设计实现掉电检测功能,首先选择一路IO,利用IO电平变化触发中断,在编写驱动时捕获该路GPIO的中断,然后在中断响应函数中发
    的头像 发表于 11-09 10:40 799次阅读
    基于<b class='flag-5'>i.MX6ULL</b>的掉电检测设计与软件测试