IMX6ULL之IOMUXC

前言

IMX6ULL芯片利用IOMUX机制来解决引脚复用的问题,和之前学到的STM32芯片解决引脚复用的解决方式有很大的不同,主要就是配置一下寄存器:
1.PAD控制寄存器
2.MUX控制寄存器
3.Select Input控制寄存器

引脚的命名与功能配置

我们来看下STM32引脚的命名
在这里插入图片描述
我们发现,每个引脚的名称都类似于PA5,PB4等等。看起来很清晰。
我们再来看下IMX6ULL芯片引脚的名称。
在这里插入图片描述
每一个引脚的名称都是千差万别,根本就没用共同点。
如果你是先学32在学IMX。你会一下子摸不到头绪。因为你发现IMX的引脚命名根本没有规律,这根本就不好编程。
比如,我们都知道,在32中,PA9,PA10这两个引脚,它们的作用主要是用来当作串口1的收发引脚。我们在编程的时候,我们对GPIOA进行相应的操作就可以了,思路是非常清晰的。但是IMX怎么去配置寄存器从而达到将引脚用作uart1的收发引脚呢。
IMX配置寄存器的方式和32配置寄存器的方式应该反着来。
IMX6ULL芯片的引脚名称和STM32大不一样,但是通过功能的方式对其命名又是一样的,cpu上电复位后引脚默认通过IOMUX与哪个外设进行连接,这个引脚的名称就是那个外设的名称
一定要记住上面强调的那句话。
现在我们来配置一下UART5_RXRX
在这里插入图片描述
原理图上显示着G13引脚可以被复用为多种功能的IO口,但是这个引脚的名称是什么?肯定是红线上的那些名称中的一个吧。
规则:最左边的名称就是相应IO口的名称。
那也就是说UART5_RX是G13的名称了。
在这里插入图片描述
再去IMX6ULL参考手册中去搜索这个名称
tips:
在手册中要搜寻某个名称的时候,是从你当前页开始搜寻的,因此你可以现回到第一页,然后再进行搜寻,这样会搜的更全,也会省点时间。
在这里插入图片描述
我们一下就找到了MUX控制寄存器了。这个寄存器的功能就是将G13复用为多种模式的。
我们可以发现,cpu上电复位后,这个寄存器在[3:0]的数据是0101,也就是说cpu上电复位后,G13复用为GPIO1_IO31。我们要配置这个寄存器在[3:0]的数据是0000。
接下来,就是要对IO口的电气属性进行配置。
接着进行搜索。
在这里插入图片描述
如上图所示,这个寄存器的作用就是配置UART5_RX_DATA也就是G13的电气属性。

注意:IO口的电气属性不是由复用的外设进行配置的,而是由IOMUXC进行配置。
UART5_RX_DATA就是G13的名字。
G13是引脚在芯片上的实际物理名称

在这里插入图片描述

接下来就是配置IO输入配置
在这里插入图片描述
进行相应的配置即可。

IOMUXC

1.Overview

The IOMUX Controller (IOMUXC), together with the IOMUX, enables the IC to shareone pad to several functional blocks. This sharing is done by multiplexing the pad’s inputand output signals.
Every module requires a specific pad setting (such as pull up or keeper), and for each pad, there are up to 8 muxing options (called ALT modes). The pad settings parametersare controlled by the IOMUXC.
The IOMUX consists only of combinatorial logic combined from several basic IOMUXcells. Each basic IOMUX cell handles only one pad signal’s muxing

2.Block Diagram

在这里插入图片描述
通过IOMUX的框图我们可以非常清楚地看到IOMUX的运行机制。
我的建议是:在学习一个新的芯片的时候,框图是你必须要掌握的东西,它可以理清你的思路,让你更清楚地芯片内存内部的架构。
注意:
上图中
1.module是外设的意思,学习芯片的过程中,你会发现外设有很多的表述方式,有外设,模块,区,存储段等等。
2.AIPS指的是ARM IP BUS.就是总线。
3.cpu是通过AIPS与IOMUXC进行数据交互的
4.引脚的电气属性是由IOMUXC进行配置的

3.Functional description

The IOMUXC consists of two sub-blocks:
• IOMUXC_REGISTERS includes all of the IOMUXC registers .
• IOMUXC_LOGIC includes all of the IOMUXC combinatorial logic (IP interface
controls, address decoder, observability muxes).
The IOMUX consists of a number (about the number of pads in the SoC) of basic iomux_cell units.
If only one functional mode is required for a specific pad, there is no need for IOMUX and the signals can be connected directly from the module to the I/O.(默认)
The IOMUX cell is required whenever two or more functional modes are required for a specific pad or when one functional mode and the one test mode are required
在这里插入图片描述

从上图我们可以发现一个非常重要但又被忽略的一点:
1.一个外设的输入和输出是不在同一个数据线上的
2.外设的输入源的个数和类型都是已经在芯片中制作好了的,根据你自己工程的需要进行相应的配置。
3.PAD对内的输入和输出也是不在同一个数据线上的
4.在外设和IO之间存在着IOMUX

4.Daisy chain - multi pads driving same module input pin

in some cases, more than one pad may drive a single module input pin. Such cases require the addition of one more level of IOMUXing; all of these input signals are muxed, and a dedicated software controlled register controls the mux in order to select the required input path.
A module port involved in “daisy chain” requires two software configuration commands,one for selecting the mode for this pad (programable via the
IOMUXC_SW_MUX_CTL_ registers) and one for defining it as the input path (via the daisy chain registers).
This means that a module port involved in “daisy chain” requires two software
configuration commands, one for selecting the mode for this pad (programable via the
IOMUXC_SW_MUX_CTL_ registers) and one for defining it as the input path
(via the daisy chain registers). The daisy chain is illustrated in the figure below
在这里插入图片描述

总结

在这里插入图片描述
如上图所示,我们在使用某个外设的时候,我们一定要配置IOMUXC。而需要配置IOMUXC中的哪些寄存器呢,就是红色箭头所指向的
IMX6ULL中,在外设和IO之间加上了IOMUX。IONUXC和IOMUX是相辅相成的
无论你学习什么类型的芯片,你手上一定要有数据手册,参考手册,内核手册,开发手册,原理图。 对于外设而言,一个外设可以对应于多个PAD,所以SELECT_INPUT寄存器就必要配置了。 对于PAD而言,一个PAD可以对应于多个外设,所以SW_MUX_CTL寄存器就有必要配置了。 而PAD本身也是需要配置的,所以SW_PAD_CTL寄存器就有必要配置了。