摘要:压摆率就是电平跳变所需要的时间,比如从到需要多少时间,时间越小波形就越陡,说明压摆率越高反之,时间越多波形就越缓,压摆率就越低。
研究IMX6UL GPIO 原理前先回忆一下STM32GPIO配置流程,其主要分为4个步骤:
下面我们学习 IMX6UL 的 GPIO 原理也是按照这样的流程来学习
学习前先了解一下 IMX 的命名方式,在以前学STM32时他的 IO 口是按照一组一组来命名的,如PA是一组,一组里面有16个 IO 口即 PA0-PA15;而在 IMX6UL里面命名方式则大不一样,I.MX6UL 的 IO 主要分为两类:SNVS 域IO和通用 IO
SNVC域 IO 命名: IOMUXC_SNVC_SW_MUX_CTL_PAD_XX_XX
,后面的 XX_XX
就是 GPIO 命名, 比如:BOOT_MODE0
等等
通用 IO 命名: IOMUXC_SW_MUX_CTL_PAD_XX_XX
,后面的 XX_XX
就是 GPIO 命名, 比如:GPIO1_IO01
、UART1_TX_DATA
、JTAG_MOD
等等
具体IO文档可以参考 IMX6UL 官方文档
IO 复用是通过一个寄存器来控制的,这里我以 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00
为例子,翻阅手册可以看到一个 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO01
的32位寄存器,寄存器如下:
可以看到寄存器的地址为 20E_005CH
低5位用于模式控制分为 SION 和 MUX_MODE,其他的则是保留位
MUX_MODE 的0到3位对应具体模式,具体有以下几个:
MUX_MODE | 复用模式 |
---|---|
0000 | ALT0 复用为 IIC2_SCL |
0001 | ALT1 复用为 GPT1_CAPTURE1 |
0010 | ALT2 复用为 ANATOP_OTG1_ID |
0011 | ALT3 复用为 ENET1_REF_CLK1 |
0100 | ALT4 复用为 MQS_RIGHT |
0101 | ALT5 复用为 GPIO1_IO00 |
0110 | ALT6 复用为 ENET1_1588_EVENT0_IN |
0111 | ALT7 复用为 SRC_SYSTEM_RESET |
1000 | ALT8 复用为 WDOG3_WDOG_B |
SION 的控制功能如下:
SION | 功能 |
---|---|
0 | IO输入路径按照复用的模式来 |
1 | IO输入路径强制按照GPIO1——IO00来 |
以上就是 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00
的复用寄存器一个简单的介绍,不同的 IO 他的复用寄存器不完全相同,需要根据手册具体去查询
I.MX6U 的 GPIO 一共有 5 组:GPIO1、GPIO2、GPIO3、GPIO4 和 GPIO5, 其中 GPIO1 有 32 个 IO,GPIO2 有 22 个 IO,GPIO3 有 29 个 IO、GPIO4 有 29 个 IO,GPIO5 有 12 个 IO,一共有 124 个 GPIO
1.2 讲述的是 IO 口的复用配置寄存器,但 IO 的具体工作配置还有另外一个寄存器进行控制,继续以 GPIO1 组的 IO00 为例子;具体 IO 工作配置寄存器由 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00 控制,该寄存器如下:
其不同位控制的 IO 配置功能不同,需要结合 IO 的工作原理图来理解,上 IO 原理图:
寄存器分析:
HYS(bit16): 对应图中 HYS,用来使能迟滞比较器,在 IO 输入时有效,可以用来对输入波形进行处理,关于迟滞比较器可以看这篇文章 : 迟滞比较器;HYS 为 0 的时候禁止迟滞比较器,为 1 的时候使能迟滞比较器
PUS(bit15:14): 图中的 PUS,用来设置上下拉电阻的:
位 | 功能 |
---|---|
00 | 100k 下拉 |
01 | 47k 上拉 |
10 | 100k 上拉 |
11 | 22k 上拉 |
PUE(bit13): 上图没有显示,当 IO 作为输入的时候,这个位用来设置 IO 是使用上下拉还是使用状态保持器。为 0 的时候使用状态保持器,当为 1 的时候使用上下拉。
状态保持器在 IO 作为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住之前状态。
PKE(bit12): 对应图中的 PKE,此位用来使能或者禁止上下拉或者状态保持器功能,为 0 时禁止上下拉/状态保持器,为 1 时使能上下拉和状态保持器。
ODE(bit11): 对应图中的 ODE,当 IO 作为输出的时候,此位用来禁止或者使能开路输出,此位为 0 的时候禁止开路输出,当此位为 1 的时候就使能开路输出功能。
SPEED(bit7:6): 对应图中的 SPEED,当 IO 用作输出的时候,此位用来设置 IO 速度
位设置 | 速度 |
---|---|
00 | 低速 50M |
01 | 中速 100M |
10 | 中速 100M |
11 | 最大速度 200M |
DSE(bit5:3): 对应图中 DSE,当 IO 用作输出的时候用来设置 IO 的驱动能力, 总共有 8 个可选选项,如表所示:
(3.3V 下 R0 是 260Ω,1.8V 下 R0 是 150Ω,接 DDR 的时候是 240Ω)
位设置 | 速度 |
---|---|
000 | 输出驱动关闭 |
001 | R0 **** |
010 | R0/2 |
011 | R0/3 |
100 | R0/4 |
101 | R0/5 |
110 | R0/6 |
111 | R0/7 |
SRE(bit0): 对应图中的 SRE,设置压摆率,当此位为 0 的时候是低压摆率,当为 1 的时候是高压摆率。
压摆率就是 IO 电平跳变所需要的时间,比如从 0 到 1 需要多少时 间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就越低。高速信号压摆率要高,速度快;而要考虑电磁兼容性的话压摆率要低
压摆率参考文章:运放压摆率
1.2 和 1.3 讲了IO 的复用与功能寄存器配置,1.4 小节分析 IO 众多复用里面的一种 GPIO 的具体配置
首先看一下 GPIO 的结构图:
结构中可以看到 IOMUXC 里面有 SW_MUX_CTL_PAD_* 和 SW_PAD_CTL_PAD__* 两个寄存器用于配置 IO;而多带带的 GPIO 配置则是另外 8 个 GPIO 自己的寄存器进行配置;
这 8 个寄存器介绍如下:
首先看 GPIOx_DR 数据寄存器,由翻译可以看到,DR 寄存器在 IO 的模式设置为 GPIO 且 GPIO 的输入输出方向确定好后,输出状态时 DR 寄存器里面的位可以控制 GPIO 的输出值,输入时则存储输入的状态值,通过读取可以获取 GPIO 状态,比如当 GPIO1_IO00 引脚接地,那么 GPIO1.DR 的 bit0 就是 0
GPIOx_IR 方向寄存器,结构如下:
GPIO_GDIR 作为方向控制,每个位指定了一位信号的方向,此寄存器用来设置某个 IO 的工作方向,是输入还是输出。同 样的,每个 IO 对应一个位,如果要设置 GPIO 为输入的话就设置相应的位为 0,如果要设置为输出的话就设置为 1
PSR 寄存器: GPIO 的状态寄存器
PSR 寄存器也是一个 GPIO 对应一个位,读取相应的位即可获取对应的 GPIO 的状态,也就是 GPIO 的高低电平值,功能和输入状态下的 DR 寄存器一样
ICR1和ICR2 是中断控制寄存器, ICR1用于配置低16个GPIO, ICR2 用于配置高 16 个 GPIO,以 ICR1 为例子:寄存器结构如下:
两位一组控制一个 GPIO 的中断,和 STM32 的中断类似,每一组可配置的选线如下:
位设置 | 速度 |
---|---|
00 | 低电平触发 |
01 | 高电平触发 |
10 | 上升沿触发 |
11 | 下降沿触发 |
比如要设置 GPIO1_IO15 为上升沿触发中断,那么使用 GPIO1.ICR1=2<<30 就可以设置
IMR : 中断屏蔽寄存器,一个 GPIO 对应一个位,IMR 寄存器用来控制 GPIO 的中断禁止和使能,1 对应中断使能,0 则是禁止
**ISR 是中断状态寄存器 ** :一个 GPIO 对应一个位,只要某个 GPIO 的中断发生,那么 ISR 中相应的位就会被置 1,通过读取值判断中断有没有发生
注意:处理完中断以后,必须清除中断标志位,清除方法就是向 ISR 中相应的位写 1 清零
EDGE_SEL 寄存器用来设置边沿中断,该寄存器会覆盖 ICR1 和 ICR2 的设置,同样是一 个 GPIO 对应一个位。如果相应的位被置 1,那么就相当与设置了对应的 GPIO 是上升沿和下降 沿(双边沿)触发,寄存器如下
I.MX6U 有复杂的时钟系统,每个外设的时钟都可以独立的使能或禁止,这样可以关闭掉不使用的外设时钟,起到 省电的目的,时钟系统后面学习到在分析,当前先研究 IO 时钟如何使能
时钟系统有关的模块叫做 Clock Controller Module(CCM) ,其中控制时钟使能的寄存器为CCM_CCGR0~CCM_CCGR6 这 7 个寄存器,这 7 个寄存器控制着 I.MX6U 的所有外设时钟开关,CCM_CCGR0 结构体如图:
每 2 位控制一个外设的时钟,控制功能如下:
位设置 | 时钟控制 |
---|---|
00 | 所有模式下都关闭外设时钟。 |
01 | 只有在运行模式下打开外设时钟,等待模式和停止模式下均关闭外设时钟。 |
10 | 未使用(保留位)。 |
11 | 除了停止模式以外,其他所有模式下时钟都打开。 |
要使能对应的时钟只要置位对应的时钟控制位就行!
正点原子阿尔法LED灯原理图如下:
LED0 接到了 GPIO_3 上,GPIO_3 就是 GPIO1_IO03
程序编写按照下面的流程进行编写:
配置 CCM 的 CCGR0-6 寄存器,开启所有时钟
读取立即数到 R0 、 R1,通过寄存器间接寻址将 R1 的值赋值给目标地址
ldr r0, =0X020C4068 # CCGR0ldr r1, =0XFFFFFFFF str r1, [r0] ldr r0, =0X020C406C # CCGR1str r1, [r0]ldr r0, =0X020C4070 # CCGR2str r1, [r0]ldr r0, =0X020C4074 # CCGR3str r1, [r0]ldr r0, =0X020C4078 # CCGR4str r1, [r0]ldr r0, =0X020C407C # CCGR5str r1, [r0]ldr r0, =0X020C4080 # CCGR6str r1, [r0]
ldr r0, =0X020E0068 # 将寄存器 SW_MUX_GPIO1_IO03_BASE 地址加载到 r0 中ldr r1, =0X5 str r1,[r0] # 设置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MODE 为5
# 模式配置# bit 16:0 HYS关闭# bit [15:14]: 00 默认下拉# bit [13]: 0 kepper功能# bit [12]: 1 pull/keeper使能# bit [11]: 0 关闭开路输出# bit [7:6]: 10 速度100Mhz# bit [5:3]: 110 R0/6驱动能力# bit [0]: 0 低转换率# 寄存器 SW_PAD_GPIO1_IO03_BASEldr r0, =0X020E02F4 ldr r1, =0X10B0str r1,[r0]
# 寄存器GPIO1_GDIRldr r0, =0X0209C004# 配置为输出模式ldr r1, =0X0000008 str r1,[r0]
# 寄存器GPIO1_DRldr r0, =0X0209C000# 输出低电平ldr r1, =0 str r1,[r0]
在开头添加一个全局入口声明代码
.global _start_start# 需要运行的代码
结尾加一个死循环,防止程序结束
loop: b loop
编译使用 makefile 进行编译链接得到 .elf 文件,之后转化为 .bin 文件,通过 imxdownload 到 sd 下插到开发板上进行 SD 启动,具体步骤可以参考我之前的文章: Linux驱动开发:I.MX6UL 程序编译下载(SD卡)
下载程序后,LED 灯点亮
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/118979.html
摘要:可是在现实操作过程中总有一种方式出现问题,这就不得不提到现实情况下单片机的驱动能力对实验结果的影响。但是在现实中由于单片机驱动能力的影响往往第一种是无法点亮灯的。 一、LED灯与单片机的连接方式 在proteus仿真中,无论LED灯是负极连接IO端口,正极通过电阻连接VCC...
摘要:转,通过调节外置的电阻,能控制高亮度灯的驱动电流,使灯亮度达到预期恒定亮度,流过高亮度灯的电流可从几毫安到安培变化。 12V转3.3VLED驱动芯片AH2030是一款高效率,稳定可靠的高亮度 LED灯驱动控制 IC ,内置高精度比较器,off-time控制电路,恒流驱动控制电路等,特别适合大...
摘要:大信刷抖音时,偶然蹦出了联盛德物联开发板这个广告。板子做的很精致,毫米厚的板子,平滑的板边缘,亮紫色和镀金的过孔透露着高档品质,同时收到售后支持的加好友,在售后支持指导下加入了联盛德官方的开发群里,开始了开发测试工作。 ...
摘要:前言芯片接口占用管脚数量比以太网的少,版线布局可更精简。网卡芯片介绍接口网卡芯片是为方物联网行业进以太网通信而开发出的解决方案。此应用可用于监控家庭物联网网关搭建等。 前言 DM9051NP芯片 SPI接口占用管脚数量比以太网PHY的RMII/MII少,PCBA版线布局可更精简。...
阅读 1605·2021-09-23 11:31
阅读 919·2021-09-23 11:22
阅读 1335·2021-09-22 15:41
阅读 4060·2021-09-03 10:28
阅读 2905·2019-08-30 15:55
阅读 3534·2019-08-30 15:55
阅读 1937·2019-08-30 15:44
阅读 2712·2019-08-30 13:50