| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 【i.MX6ULL】驱动开发3——GPIO寄存器配置原理 -> 正文阅读 |
|
[嵌入式]【i.MX6ULL】驱动开发3——GPIO寄存器配置原理 |
前面的两篇Linux驱动文章,介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程。 本篇起,就要来操作Linux开发板的硬件,首先当然是通过经典的点亮LED灯程序,来学习Linux IO口操作的字符设备开发流程。 对比STM32的点灯程序,有寄存器操作与库函数操作两种,但其本质都是在配置寄存器。 同样,i.MX6ULL也有多种点灯方式:
究其本质,最终都是要操作i.MX6ULL的寄存器。比如,在控制GPIO引脚实现LED亮灭时,会进行类似如下的寄存器配置:
那这些寄存器都是什么作用呢?这些地址是怎么确定的呢? 所以,在学习GPIO控制LED点灯之前,需要先了解清楚有关GPIO的寄存器配置。 既然是要操作硬件,首先就来看一下i.MX6ULL这个芯片的IO口基本信息。 1 认识Linux开发板的GPIO口首先要明确:IO与GPIO是两个概念,GPIO是属于IO的一部分。
1.1 板子LED硬件原理图在开始介绍i.MX6ULL的GPIO之前,先来看一下板子的原理中对于LED的标注。 我这块板子(野火EBF6ULL S1 Pro)的原理图中关于LED电路的部分,如下图所示。 这里出现了两种标注:SNVS_TAMPER3与GPIO5_IO03,先对这两个名称有个印象,下面就来介绍其含义。 另外,从原理图可以看出,低电平时LED灯会亮起。 1.2 GPIO逻辑结构下图为i.MX6ULL的GPIO硬件结构框图,其中①和⑤的PAD表示i.MX6ULL芯片引出的GPIO引脚,其余部件都位于芯片内部。 ① PAD:它代表了i.MX6ULL芯片的一个GPIO引脚。 ② IOMUX复用选择器:与STM32的引脚复用功能类似,i.MX6ULL芯片的每个IO通过IOMUXC中的MUX寄存器和PAD寄存器设置,可以支持多种功能(如GPIO、IIC、USART…)。 ③ Block外设功能控制块:例如具有PWM输出功能的引脚,它需要PWM外设的支持。 ④ GPIO外设:GPIO模块是每个IO都具有的外设, 它是IO控制的基本功能, 如输出高低电平、 检测电平输入等。当需要使用引脚的GPIO功能时,就要配置GPIO外设中的各个寄存器(DR、GDIR、PSR…)。 ⑤ 与其它引脚的连接:这里是另一个引脚PAD2,它与PAD1有一根信号线连接,表示部分引脚的输出可以作为另一个引脚的输入。 1.2.1 PAD配置PAD代表示i.MX6ULL 的GPIO引脚。其左侧是一系列信号通道及控制线:
这些信号都经过一个IOMUX器件连接到左侧的寄存器。 另外,对于每个引脚都有很多关于属性的配置:
1.2.2 IOMUX复用选择器与STM32的引脚复用功能类似,i.MX6ULL芯片的每个GPIO通过IOMUX设置,可以支持多种功能。 IOMUX由其左侧的IOMUXC提供寄存器给用户进行配置,它又分成MUX_Mode(IO 模式控制)以及Pad Settings(Pad 配置)两个部分: ① MUX_Mode配置:用来配置引脚的复用功能 ② Pad Settings 配置:配置引脚的属性,例如驱动能力,是否使用上下拉电阻,是否使用保持器,是否使用开漏模式以及使用施密特模式还是CMOS模式等 在IOMUXC外设中关于MUX_Mode和Pad Settings寄存器命名格式如下:
1.3 GPIO命名1.3.1 按照GPIO分组i.MX6ULL芯片的GPIO被分成 5 组, 并且每组GPIO的数量不尽相同,例如GPIO1有32个引脚,GPIO2有22个引脚等等:
具体可查阅数据手册: 1.3.2 按照IO分组此外,还有另一种命名方式,因为GPIO是属于IO的一种,因此按照I.MX6ULL的IO分类,可以分为两大类:SNVS域的IO和通用的IO,这两类IO本质上是一样的。
所以,从IO名称上,基本就可以看出该管脚的基本用途。 2 板子LED引脚配置下面以 GPIO5_IO03引脚为例,也就是这次要控制的LED引脚,进行配置: 2.1 IO配置2.1.1 配置MUX寄存器从下图可以看出,IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3的MUX寄存器,其地址为0X2290014H。 这个寄存器是32位的,但只用到了低5位,其中bit0~bit3(MUX_MODE)就是设置SNVS_TAMPER3的复用功能的。 SNVS_TAMPER3只能复用为 种功能 IO,即ALT5作为 GPIO5_IO03。 2.1.2 配置PAD寄存器PAD 寄存器的配置项相对于MUX寄存器就更加丰富了。 从下图可以看出,IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3的PAD寄存器,其地址为0X2290058H。 这也是个32位寄存器,但是只用到了其中的低17位。 2.2 GPIO配置上面的MUX和PAD这两种寄存器都是配置IO的,当把IO配置为了GPIO功能后,还有继续对GPIO外设的各种寄存器进行配置: 2.2.1 配置DR寄存器DR(data register),即数据寄存器,它是32位的,一个GPIO组最大只有32个IO,因此DR寄存器中的每个位都对应一个 GPIO。
2.2.2 配置GDIR寄存器GDIR(GPIO direction register),即方向寄存器,也是32位的,用来设置某个GPIO的工作方向的,即输入/输出。 同样的,每个IO对应一个位,如果要设置GPIO为输入,就设置相应的位为0,如果要设置为输出,就设置为 1。 比如要设置 GPIO5_IO03 为输出,那么 GPIO5.GDIR=0x00; 2.2.3 配置PSR寄存器PSR(Pad Status Register),即状态寄存器,也是32位的。 注意它是一个只读寄存器,每个IO对应一个位,读取相应的位即可获取对应的GPIO的状(高低电平值),功能和输入状态下的DR寄存器一样。 这个寄存器使用ipg_clk_s时钟,这意味着只有在访问这个位时才对输入信号进行采样。所以,为了同步访问这个寄存器都需要两个等待状态。 2.2.4 配置ICR1寄存器ICR1(interrupt configuration register1)和ICR2,都是中断控制寄存器, ICR1用于配置低16个GPIO,ICR2 用于配置高16 个GPIO。 ICR1寄存器中一个GPIO用两个位,这两个位用来配置中断的触发方式:
以GPIO1_IO15为例, 若要设置该引脚为上升沿触发中断, 需要配置为:GPIO1.ICR1=2<<30。 2.2.5 配置ICR2寄存器ICR1和ICR2(interrupt configuration register2),都是中断控制寄存器, ICR1用于配置低16个GPIO,ICR2 用于配置高16 个GPIO。 若要设置GPIO1的IO16~31的话就需要设置ICR2寄存器了,设置方式参考上面的ICR1。下面这个图与ICR1类似,只截取部分显示。 2.2.6 配置IMR寄存器IMR(interrupt mask register),即中断屏蔽寄存器,也是32位,每个IO对应一个位。 IMR寄存器用来控制GPIO的中断禁止和使能,如果使能某个GPIO的中断,那么设置相应的位为1即可,反之,如果要禁止中断,那么就设 例如,要使能GPIO1_IO00的中断,需要配置为GPIO1.MIR=1。 2.2.7 配置ISR寄存器ISR(interrupt status register),即中断状态寄存器,也是32位,每个IO对应一个位。 只要某个GPIO的中断发生,则ISR中相应的位就会被置1。所以通过读取ISR寄存器来判断是否发生了中断,类似于学习STM32用到的中断标志位。 当中断处理完以后,必须清除中断标志位,清除方法就是向ISR中相应的位写1,也就是写1清零。 为了同步,读访问需要两个等待状态,复位需要一个等待状态。 2.2.8 配置EDGE_SEL寄存器EDGE_SEL(edge select register),即边沿选择寄存器,也是32位,每个IO对应一个位。 它用来设置边沿中断, 并会覆盖ICR1和ICR2的设置。 如果相应的位被置1,则相当于设置了对应的GPIO是双边沿(上升沿和下降沿)触发。例如,设置GPIO1.EDGE_SEL=1,则表示 GPIO1_IO01是双边沿触发中断,无论 GFPIO1_CR1的设置为多少。 2.3 GPIO各寄存器地址查询表上面介绍的有关GPIO的7种寄存器,为了方便查询各个寄存器的地址,这里列出一张表: 2.4 时钟配置与ST32类似,I.MX6ULL每个外设都有一个外设时钟,使用GPIO时,也必须先使能对应的时钟。 2.4.1 配置CCM寄存器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.5 配置总结使用i.MX6ULL的GPIO时,需要如下几步配置:
通过上面对各种寄存器的介绍,现在再来看本篇开头提到的那几个寄存器地址,如果理解了本篇的介绍,应该就知道这些地址大概的含义了:
3 总结本篇主要介绍了i.MX6ULL有关GPIO的寄存器配置原理,本篇是i.MX6ULL操作硬件电路的基础,了解了这些寄存器的配置原理,后续的LED输出控制、按键输入控制、IIC、SPI通信控制才能更加容易理解。 本文用到的i.MX6ULL数据手册PDF已上传至我的gitee仓库 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 3:50:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |