通过第五章我们对 ARM 汇编语法有了初步的认识,在本章我们开始使用会念编写我们的第一个汇编实 1.jpg
打开该手册的 32 章节“Chapter 32 IOMUX Controller (IOMUXC)”,我们看到 32 章节的目录如下图所示: 2.jpg
图中的“IOMUXC_SW_MUC_CTL_PAD_GPIO1_IO00”就是 GPIO 的命名。其命名格式是 “IOMUXC_SW_MUC_CTL_PAD_XX_XX”,其中的 XX_XX 就是 GPIO 的命名。例如:JTAG_MOD,GPIO1_IO00, UART4_TX_DATA 等。I.MX6ULL 的 GPIO 命名是根据 IO 所拥有的功能来命名的,比如我们看到 GPIO1_IO00, 就可以知道这个是 GPIO 功能,看到 UART4_TX_DATA 就知道这个是串口 4 的发送功能。在参考手册的 32 章 节列出了 i.MX6 ULL 的所有 IO 引脚,我们可以看到具有 GPIO 功能的引脚只有“GPIO1_IO00~GPIO1_IO09” 这 10 路 GPIO,实际上 i.MX6 ULL 的 IO 口都是具有复用功能的(一个 IO 口可以配置成好几种功能,如果不 做配置,会有一种默认的功能)。下面我们看看 i.MX6 ULL 的 IO 引脚复用功能。 我们以“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00”这个 IO 为例,打开手册的 32.6.7(1568 页)如下图所示 3.jpg
上图可以看到该 IO 对应的配置寄存器“SW_MUX_CTL_PAD_GPIO1_IO00”,寄存器地址是 0X20E005C, 寄存器为 32 位,其中的 bit0-bit3(MUX_MODE)这四位是设置 IO 引脚复用功能的。从表中我们可以看到 GPIO1_IO00 有 9 种复用功能,分别对应 ALT0-ALT8,其中 ALT5 就是作为 GPIO1_IO00,如下图所示: 4.jpg
从上图中我们可以看到 GPIO1_IO00 这个引脚还可以配置成 ENET2_REF_CLK2,I2C2_SDA 等功能,这就是 IO 的复用功能。 下面我们再来看下“IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA”这个 IO 引脚。这个引脚的描述在 32.6.29 章节(1590 页),如下图所示: 5.jpg
从上图可以看到该引脚可以复用成 7 种不同的模式。其中 ALT5(0101)表示可以复用为 GPIO1_IO28。 6.jpg 从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我 们可以看到改寄存器按照位划分成了几种功能设置,如下: HYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发 器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的 时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。 PUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作 为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。 PKE(bit12)用来使能或者禁止上下拉/状态保持器功能。 ODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。 SPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。 DSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。 SRE(bit0)设置压摆率。 9 93 .3 GPIO 配置 配置 在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX” 用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如 GPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能, GPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的硬件设计中这个 IO 是作为哪种功 能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式, 然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output (GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
7.jpg
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我 8.jpg
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO 9.jpg
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应 10.jpg
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。 11.jpg
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存 12.jpg
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄 13.jpg
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器 15.jpg
该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应 14.jpg
该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应 其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子 |