点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式(下)

简介: 点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式

通用GPIO引脚操作方法

GPIO: General-purpose input/output,通用的输入输出口

1 GPIO 模块一般结构

  • 有多组 GPIO,每组有多个 GPIO
  • 使能:电源/时钟
  • 模式(Mode):引脚可用于 GPIO 或其他功能
  • 方向:引脚 Mode 设置为 GPIO 时,可以继续设置它是输出引脚,还是输入引脚
  • 数值:
    对于输出引脚,可以设置寄存器让它输出高、低电平
    对于输入引脚,可以读取寄存器得到引脚的当前电平

2 GPIO 寄存器操作

  • 芯片手册一般有相关章节,用来介绍: power/clock
    可以设置对应寄存器使能某个 GPIO 模块(Module)
    有些芯片的 GPIO 是没有使能开关的,即它总是使能的
  • 一个引脚可以用于 GPIO、串口、 USB 或其他功能,有对应的寄存器来选择引脚的功能
  • 对于已经设置为 GPIO 功能的引脚,有方向寄存器用来设置它的方向:输出、输入
  • 对于已经设置为 GPIO 功能的引脚,有数据寄存器用来写、读引脚电平状态GPIO 寄存器的 2 种操作方法: 原则:不能影响到其他位
  1. 直接读写:读出、修改对应位、写入

a) 要设置 bit n:

val = data_reg;
val = val | (1<<n);
data_reg = val;

b) 要清除 bit n:

val = data_reg;
val = val & ~(1<<n);
data_reg = val;
  1. set-and-clear protocol:

set_reg, clr_reg, data_reg 三个寄存器对应的是同一个物理寄存器,

a) 要设置 bit n:

set_reg = (1<<n);

b) 要清除 bit n:

clr_reg = (1<<n);

3.imx6ull寄存器操作

3.1IMX6ULL 的 GPIO 模块结构

参考资料:芯片手册《Chapter 28: General Purpose Input/Output(GPIO)》有 5 组 GPIO( GPIO1~GPIO5),每组引脚最多有 32 个,但是可能实际上并没有那么多。

  • GPIO1 有 32 个引脚: GPIO1_IO0~GPIO1_IO31;
  • GPIO2 有 22 个引脚: GPIO2_IO0~GPIO2_IO21;
  • GPIO3 有 29 个引脚: GPIO3_IO0~GPIO3_IO28;
  • GPIO4 有 29 个引脚: GPIO4_IO0~GPIO4_IO28;
  • GPIO5 有 12 个引脚: GPIO5_IO0~GPIO5_IO11;
  • GPIO 的控制涉及 4 大模块: CCM、 IOMUXC、 GPIO 模块本身,框图如图 4.2

3.2CCM 用于设置是否向 GPIO 模块提供时钟

参考资料:芯片手册《Chapter 18: Clock Controller Module (CCM)》

GPIOx 要用 CCM_CCGRy 寄存器中的 2 位来决定该组 GPIO 是否使能。哪组GPIO 用哪个 CCM_CCGR 寄存器来设置,请看上图红框部分。

CCM_CCGR 寄存器中某 2 位的取值含义如下:

图 4.3 CCM_CCGR

  • 00:该 GPIO 模块全程被关闭
  • 01:该 GPIO 模块在 CPU run mode 情况下是使能的;在 WAIT 或 STOP模式下,关闭
  • 10:保留
  • 11:该 GPIO 模块全程使能

GPIO2 时钟控制

GPIO1、 GPIO5 时钟控制:

GPIO3 时钟控制:

GPIO4 时钟控制:

3.3 IOMUXC:引脚的模式(Mode、功能)

参考资料:芯片手册《Chapter 32: IOMUX Controller (IOMUXC)》。

对于某个/某组引脚, IOMUXC 中有 2 个寄存器用来设置它:

  1. 选择功能:

a) IOMUXC_SW_MUX_CTL_PAD_ : Mux pad xxx,选择某个 pad 的功能

b) IOMUXC_SW_MUX_CTL_GRP_: Mux grp xxx,选择某组引脚的功能

某个引脚,或是某组预设的引脚,都有 8 个可选的模式(alternate (ALT)MUX_MODE)。

比如:

设置上下拉电阻等参数:

a) IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME>: pad pad xxx,设置某个 pad 的参数

b) IOMUXC_SW_PAD_CTL_GRP_: pad grp xxx,设置某组引脚的参数

比如:

3.4 GPIO 模块内部

框图如下:

我们暂时只需要关心 3 个寄存器

  1. GPIOx_GDIR:设置引脚方向,每位对应一个引脚, 1-output, 0-input

  2. GPIOx_DR:设置输出引脚的电平,每位对应一个引脚, 1-高电平, 0-低电平

  3. GPIOx_PSR:读取引脚的电平,每位对应一个引脚, 1-高电平, 0-低电平

3.5 读 GPIO

翻译一下:

  • 设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的,上图省略了
  • 设置 IOMUX 来选择引脚用于 GPIO
  • 设置 GPIOx_GDIR 中某位为 0,把该引脚设置为输入功能
  • 读 GPIOx_DR 或 GPIOx_PSR 得到某位的值(读 GPIOx_DR 返回的是GPIOx_PSR 的值)

3.6 写 GPIO

翻译一下:

  • 设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的,上图省略了
  • 设置 IOMUX 来选择引脚用于 GPIO
  • 设置 GPIOx_GDIR 中某位为 1,把该引脚设置为输出功能
  • 写 GPIOx_DR 某位的值

需要注意的是,你可以设置该引脚的 loopback 功能,这样就可以从GPIOx_PSR 中读到引脚的有实电平;你从 GPIOx_DR 中读回的只是上次设置的值,它并不能反应引脚的真实电平,比如可能因为硬件故障导致该引脚跟地短路了,你通过设置 GPIOx_DR 让它输出高电平并不会起效果。

目录
相关文章
|
11月前
|
Ubuntu Linux Windows
Linux开发环境配置详细过程--正点原子阿尔法开发板
Linux开发环境配置详细过程--正点原子阿尔法开发板
319 0
|
21天前
|
数据安全/隐私保护
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
|
21天前
|
传感器 Linux 编译器
不同平台下的点灯代码,你在点灯的哪个段位?
不同平台下的点灯代码,你在点灯的哪个段位?
|
9月前
|
C语言 Python Windows
MicroPython 玩转硬件系列2:点灯实验
MicroPython 玩转硬件系列2:点灯实验
|
9月前
|
Linux 开发工具
瑞芯微RV1109配置GPIO设备树修改笔记(熟悉新平台从点灯大法开始)
瑞芯微RV1109配置GPIO设备树修改笔记(熟悉新平台从点灯大法开始)
188 0
|
9月前
|
Linux
手把手教你写Linux设备驱动---定时器(一)(基于友善之臂4412开发板)
手把手教你写Linux设备驱动---定时器(一)(基于友善之臂4412开发板)
91 0
|
11月前
|
API
点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式(上)
点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式
157 0
|
Windows
nxp官方uboot移植到野火开发板PRO(无任何代码逻辑的修改)
nxp官方uboot移植到野火开发板PRO(无任何代码逻辑的修改)
113 0
【蓝桥杯嵌入式】PWM的设置,原理图解析与代码实现(第十一届省赛为例)——STM32
【蓝桥杯嵌入式】PWM的设置,原理图解析与代码实现(第十一届省赛为例)——STM32
339 0
【蓝桥杯嵌入式】PWM的设置,原理图解析与代码实现(第十一届省赛为例)——STM32
【蓝桥杯嵌入式】LCD屏的原理图解析与代码实现(第十三届省赛为例)——STM32
【蓝桥杯嵌入式】LCD屏的原理图解析与代码实现(第十三届省赛为例)——STM32
365 0

热门文章

最新文章