i.MX6 裸机 汇编 | GPIO硬件原理分析


本人原使用平台为STM32F407,对于i.MX6平台的使用,通过STM32的对照来进行学习。

有了Linux为什么还需要写汇编?

首先是带来一个疑问,既然平台使用i.MX6,有了Liunx操作系统,按理来说我们应该更多的精力放在上层的设计。

我们在学习 STM32的时候几乎没有用到过汇编,可能在学习 UCOS、 FreeRTOS等 RTOS类操作系统移植的时候可能会接触到一点汇编。

但是我们在进行嵌入式 Linux开发的时候是绝对要掌握基本的 ARM汇编,因为 Cortex-A芯片一上电 SP指针还没初始化, C环境还没准备好,所以肯定不能运行 C代码,必须先用汇编语言设置好 C环境,比如初始化 DDR、设置 SP指针等等,当汇编把 C环境设置好了以后才可以运行 C代码。

所以 Cortex-A一开始肯定是汇编代码,其实 STM32也一样的,一开始也是汇编,以 STM32F103为例,启动文件startup_stm32f10x_hd.s就是汇编文件,只是这个文件 ST已经写好了,我们根本不用去修改,所以大部分学习者都没有深入的去研究。

对于 Cortex-A芯片来讲,大部分芯片在上电以后 C语言环境还没准备好,所以第一行程序肯定是汇编的,至于要写多少汇编程序,那就看你能在哪一步把 C语言环境准备好。

所谓的 C语言环境就是保证 C语言能够正常运行。 C语言中的函数调用涉及到出栈入栈,出栈入栈就要对堆栈进行操作,所谓的堆栈其实就是 一段内存,这段内存比较特殊,由 SP指针访问, SP指针指向栈顶。

芯片一上电 SP指针还没有初始化,所以 C语言没法运行,对于有些芯片还需要初始化 DDR,因为芯片本身没有 RAM,或者内部 RAM不开放给用户使用,用户代码需要在DDR中运行,因此一开始要用汇编来初始化 DDR控制器。后面学习 Uboot和 Linux 内核的时候汇编是必须要会的。

STM32 IO初始化流程

  • 使能GPIO时钟
  • 设置IO复用,将其复用为GPIO
  • 配置GPIO的电气属性
  • 使用GPIO,输出高/低电平

I.MX6Q IO初始化流程

1、使能时钟

  • 使能时钟,CCGRO-CCGR6这7个寄存器控制着所有外设的使能, 为了简单,设置CCGRO-CCGR6这7个寄存器全部为0xFFFFFFFF,相当于使能所有外设时钟。

在这里插入图片描述

2、IO复用

IO命名

STM32中的 IO都是 PA0~15、 PB0~15这样命名的, I.MX6U的 IO是怎么命名的呢?打开I.MX6UL参考手册的“IOMUX Controller(IOMUXC)”,如图

在这里插入图片描述
图中的形如“ IOMUXC_SW_MUC_CTL_PAD_GPIO1_IO00”的就是 GPIO命名,命名形式就是“ IOMUXC_SW_MUC_CTL_PAD_XX_XX”,后面的 XX_XX”就是 GPIO命名,比如: GPIO1_IO01、 UART1_TX_DATA、 JTAG_MOD、 SNVS_TAMPER1等等。 I.MX6U的 GPIO并不像 STM32一样以 PA0~15这样命名,他是根据某个 IO所拥有的功能来命名的。比如我们一看到 GPIO1_IO01就知道这个肯定能做 GPIO,看到 UART1_TX_DATA肯定就知道这个 IO肯定能做为 UART1的发送引脚。“ IOMUX Controller(IOMUXC)”这一章列出了I.MX6U的所有 IO,如果你找遍第 30章的书签,你会发现貌似 GPIO只有GPIO1_IO00~GPIO1_IO09,难道 I.MX6U的 GPIO只有这 10个?

显然不是的, 我们知道 STM32的很多 IO是可以复用为其它功能的,那么 I.MX6U的其它 IO也是可以复用为 GPIO功能。同样的,GPIO1_IO00~GPIO_IO09也是可以复用为其它外设引脚的,接下来就是 I.MX6U IO复用。

IO复用

  • IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO03的bit2-0设置为 101 = 5,这样IO口就复用为GPIO1_IO03。

在这里插入图片描述
"IOMUX Controller(IOMUXC)”的书签中,每一个 IO会出现两次,它们的名字差别很小,不仔细看就看不出来,比如 GPIO1_IO00有如下两个书签:

在这里插入图片描述

3、电气属性

电气属性

  • 电器属性,寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO03。包括压摆率、速度、驱动能力、开漏、上下拉等。

    这也是个 32位寄存器,但是只用到了其中的低 17位,在看这写位的具体含义之前,先来看一下图 8.1.4.2所示的 GPIO功能图:

在这里插入图片描述

GPIO功能图

在这里插入图片描述
HYS(bit16):对应图中 HYS,用来使能迟滞比较器,当 IO作为输入功能的时候有效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0的时候禁止迟滞比较器,为 1的时候使能迟滞比较器。PUS(bit15: 对应图中的 PUS,用来设置上下拉电阻的,一共有四种选项可以 选择,如表所示:

在这里插入图片描述
PUE( 图没有给出来,当 IO作为输入的时候,这个位用来设置 IO使用上下拉还是状态保持器。当为 0的时候使用状态保持器,当为 1的时候使用上下拉。状态保持器在IO作为输入的时候才有用,顾名思义,就是当外部电路断电以后此 IO口可以保持住以前的状态。

PKE( 对应图中的 PKE,此为用来使能或者禁止上下拉 /状态保持器功能,为0时禁止上下拉 /状态保持器,为 1时使能上下拉和状态保持器。ODE(bit11):对应图中的 ODE,当 IO作为输出的时候,此位用来禁止或者使能开路输出,此位为 0的时候禁止开路输出,当此位为 1的时候就使能开路输出功能。

SPEED(bit7: 对应图中的 SPEED,当 IO用作输出的时候,此位用来设置 IO速度,设置如表所示:

在这里插入图片描述
DSE(bit5:3):对应图中的 DSE,当 IO用作输出的时候用来设置 IO的驱动能力,总共有 8个可选选项,如表所示:

在这里插入图片描述

SRE( 对应图中的 SRE,设置压摆率,当此位为 0的时候是低压摆率,当为 1的时候是高压摆率。这里的压摆率就是 IO电平跳变所需要的时间,比如从 0到 1需要多少时间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就越低。如果你的产品要过 EMC的话那就可以使用小的压摆率,因为波形缓和,如果你当前所使用的 IO做高速通信的话就可以使用高压摆率。

4、GPIO配置

IOMUXC_SW_MUX_CTL_PAD_XX_XX

 IOMUXC_SW_PAD_CTL_PAD_XX_XX

这两种寄存器都是配置 IO的,注意是 IO!不是 GPIO GPIO是一个 IO众多复用功能中的一种。比如 GPIO1_IO00这个 IO可以复用为: I2C2_SCL、 GPT1_CAPTURE1、 ANATOP_OTG1_ID、ENET1_REF_CLK、 MQS_RIGHT、 GPIO1_IO00、ENET1_1588_EVENT0_IN、SRC_SYSTEM_RESET和 WDOG3_WDOG_B这 9个功能, GPIO1_IO00是其中的一种,我们想要把 GPIO1_IO00用作哪个外设就复用为哪个外设功能即可。如果我们要用 GPIO1_IO00来点个灯、作为按键输入啥的就是使用其 GPIO(通用输入输出 )的功能。将其复用为 GPIO以后还需要对其 GPIO的功能进行配置,关于 I.MX6的 GPIO请参考

《 IMX6芯片手册》

的第 28章“ Chapter 28 General Purpose Input/Ouput( GPIO结构如图所示:

在这里插入图片描述

配置GPIO功能

配置GPIO功能,设置输入输出。

设置GPIO1_GDIR寄存器,因为是IO03,所以是bit3位

在这里插入图片描述

根据上图,bit3为1为OUTPUT模式,设置为输出模式。

设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值