前言:
前面我们介绍了汇编语言的作用,实际上就是C环境还没准备好时,我们只能用汇编去进行一些必要的操作,例如DDR、SP指针的初始化、跳转指令等。具体该如何实现这些功能,并且点亮LED呢?
I.MX6U的管脚命名规则
STM芯片的管脚是用PA_ping0、PB_ping1、来命名。但是I.MX6U是用GPIO1~GPIO5 共五组 GPIO的管脚功能来命名,例如:IOMUXC_SW_MUC_CTL_PAD_GPIO1_IO00。虽然一个管脚也可以复用很多功能,但是他只挑选其中一个功能来命名。
此外,和STM初始化管脚不一样的地方在于,他有SW_MUX_CTL_PAD_* 和SW_PAD_CTL_PAD_*两种寄存器。这两种寄存器用来设置 IO 的复用功能和 IO 属性配置。SW_MUX_CTL_PAD_*负责设置管脚使用什么复用功能,SW_PAD_CTL_PAD_*用来设置管脚的属性,比如在输出时什么属性,输入时什么属性。
Keeper ,保持就是在内核供电关掉之后,IO的输出能够自动维持在关电之前的那个状态。 Pull就是使能了上拉或者下拉功能
DR寄存器决定管脚的电平状态,如果设置GPIO_IO0为输出模式,DR[0]为1,输出高电平;DR[0]为0,输出低电平。如果为输入模式,DR[0]为1,则上拉;DR[0]为0,则下拉。
EDGE_SEL 寄存器,这是边沿选择寄存器,是用来选择是否双边沿触发的,因为与ICR1、ICR2有冲突,因此如果设置了EDGE_SEL 寄存器,那么ICR1、ICR2这两个寄存器对应的GPIO就无效。
CMM 有 CCM_CCGR0~CCM_CCGR6 这 7 个寄存器,控制着 I.MX6U 的所有外设时钟开关
总结一下,要将 I.MX6U 的 IO 作为 GPIO 使用,我们需要一下几步:
②、设置寄存器 IOMUXC_SW_MUX_CTL_PAD_XX_XX,设置 IO 的复用功能,使其复用为 GPIO 功能。
③、设置寄存器 IOMUXC_SW_PAD_CTL_PAD_XX_XX,设置 IO 的上下拉、速度等等。
④、第②步已经将 IO 复用为了 GPIO 功能,所以需要配置 GPIO,设置输入/输出、是否使用中断、默认输出电平等。
前面介绍了I.MX6U的IO和寄存器,接下来就是如何从软件上实现
具体LED灯实现过程
LED0连接在GPIO1_IO3处,因此需要将该管脚设置为输出模式,上拉,低电平LED0亮
1.使能时钟,CCM_CCGR1 的 bit27 和 bit26设置为11
2.设置GPIO1_IO3复用功能为GPIO,寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03,在I.MX6U手册的1332页,寄存器地址Address: 20E_0000h base + 68h offset = 20E_0068h
0101 ALT5 — Select mux mode: ALT5 mux port: GPIO1_IO03 of instance: gpio1 |
3.配置GPIO1_IO3上拉,寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03,在1588页,寄存器地址Address: 20E_0000h base + 2F4h offset = 20E_02F4h
01 PUS_1_47K_Ohm_Pull_Up — 47K Ohm Pull Up 10 PUS_2_100K_Ohm_Pull_Up — 100K Ohm Pull Up 11 PUS_3_22K_Ohm_Pull_Up — 22K Ohm Pull Up |
本实验中 GPIO1_IO03 是作为输出功能的,因此 GPIO1_GDIR 的 bit3 要设置为 1,表示输
GPIO1_DR 寄存器的 bit3 写入 0 即可控制 GPIO1_IO03 输出低电平