• 嵌入式Linux应用开发-基础知识-第三章 LED原理图-GPIO及操作


    第三章 硬件知识_LED 原理图

    当我们学习 C 语言的时候,我们会写个 Hello 程序。
    那当我们写 ARM 程序,也该有一个简单的程序引领我们入门,这个程序就是点亮 LED。

    我们怎样去点亮一个 LED 呢?
    分为三步:
    1.看原理图,确定控制 LED 的引脚;
    2.看主芯片的芯片手册,确定如何设置控制这个引脚;
    3.写程序;

    3.1 先来讲讲怎么看原理图

    LED 样子有很多种,像插脚的,贴片的。
    在这里插入图片描述
    它们长得完全不一样,因此我们在原理图中将它抽象出来。

    点亮 LED 需要通电源,同时为了保护 LED,加个电阻减小电流。
    控制 LED 灯的亮灭,可以手动开关 LED,但在电子系统中,不可能让人来控制开关,通过编程,利用芯片的引脚去控制开关。
    在这里插入图片描述
    LED 的驱动方式,常见的有四种。
    方式 1:使用引脚输出 3.3V 点亮 LED,输出 0V 熄灭 LED。
    方式 2:使用引脚拉低到 0V 点亮 LED,输出 3.3V 熄灭 LED。

    有的芯片为了省电等原因,其引脚驱动能力不足,这时可以使用三极管驱动。
    方式 3:使用引脚输出 1.2V 点亮 LED,输出 0V 熄灭 LED。
    方式 4:使用引脚输出 0V 点亮 LED,输出 1.2V 熄灭 LED。

    在这里插入图片描述
    由此,主芯片引脚输出高电平/低电平,即可改变 LED 状态,而无需关注 GPIO 引脚输出的是 3.3V 还是1.2V。
    所以简称输出 1 或 0:
    逻辑 1–>高电平
    逻辑 0–>低电平

    第四章 普适的 GPIO 引脚操作方法

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

    4.1 GPIO 模块一般结构

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

    4.2 GPIO 寄存器操作

    a. 芯片手册一般有相关章节,用来介绍:power/clock
    可以设置对应寄存器使能某个 GPIO 模块(Module)
    有些芯片的 GPIO 是没有使能开关的,即它总是使能的
    b. 一个引脚可以用于 GPIO、串口、USB 或其他功能,
    有对应的寄存器来选择引脚的功能
    c. 对于已经设置为 GPIO 功能的引脚,有方向寄存器用来设置它的方向:输出、输入
    d. 对于已经设置为 GPIO 功能的引脚,有数据寄存器用来写、读引脚电平状态

    GPIO 寄存器的 2 种操作方法:
    原则:不能影响到其他位
    1) 直接读写:读出、修改对应位、写入
    要设置 bit n:
    val = data_reg;
    val = val | (1< data_reg = val;
    要清除 bit n:
    val = data_reg;
    val = val & ~(1< data_reg = val;

    2) set-and-clear protocol:
    set_reg, clr_reg, data_reg 三个寄存器对应的是同一个物理寄存器,
    要设置 bit n:set_reg = (1< 要清除 bit n:clr_reg = (1<

    4.3 GPIO 的其他功能:防抖动、中断、唤醒

    后续章节再介绍

    第五章 具体单板的 GPIO 操作方法

    请使用 GIT 下载文档后,看下图红框所示目录中各板子对应的文档及图片。
    网盘中相同名字的目录下也有对应的视频。
    在这里插入图片描述
    为方便学习,在本文档中也把上述 GIT 目录中的文档添加进来了。

    5.1 AM335X 的 GPIO 操作方法

    GPIO: General-purpose input/output,通用的输入输出口
    PRCM: Power, Reset, and Clock Management (电源、复位、时钟管理器)
    CM: Control Module(控制模块) 或 Clock Module (时钟模块)
    PRM_PER: Power Reset Module Peripheral Registers(电源/复位模块中关于外设的寄存器)
    CM_PER: Clock Module Peripheral Registers (时钟模块中关于外设的寄存器)

    5.1.1 AM335X 的 GPIO 模块结构

    在这里插入图片描述
    有 4 组 GPIO(GPIO0~3),每组有 32 个 GPIO。
    GPIO 的控制涉及 3 大模块:PRCM、Control Module、GPIO 模块本身。
    ① PRCM 用于使能模块:
    GPIO0 永远都是使能的,GPIO1~3 可单独控制。
    PRCM 模块给 GPIO 模块常供电,只需要使能 GPIO 模块的时钟。
    ② Control Module 用于设置模式(Mode):
    设置引脚的 Mode(即选择功能)、上下拉电阻等;
    每一个 GPIO 引脚在 Control Module 中都有一个寄存器,怎么找到这个寄存器?
    a. 根据 pin number 确定 pin name
    b. 根据 pin name 在 Control Module 中确定寄存器

    ③ GPIO 模块内部:
    方向:引脚 Mode 设置为 GPIO 时,可以继续设置它是输出引脚,还是输入引脚。
    数值:对于输出引脚,可以设置寄存器让它输出高、低电平;
    对于输入引脚,可以读取寄存器得到引脚的当前电平。

    5.1.2 AM335X 的 GPIO 相关寄存器

    在这里插入图片描述

    5.1.3 set-and-clear 协议

    假设某个 GPIO 被设置为输出,怎么设置它的输出电平呢?AM335X 中对于每个 GPIO 模块有一个
    GPIO_DATAOUT 寄存器,其中的每一位对应一个引脚,如下:
    在这里插入图片描述
    要设置某一位时,不能影响到其他位,操作方法是:读出原来的值,修改某一位,把新值写回去。需要3 个步骤才可以设置某一位的值,这效率太低了!

    使用 set-and-clear 可以只用一个步骤即可修改某一位的值。
    当想设置某一位为 1 时,往 DATA_SETDATAOUT 寄存器中某位写入 1 即可,芯片内部会把对应引脚的电平设置为 1,并且不会影响其他引脚:
    在这里插入图片描述
    并非所有的芯片都有 set-and-clear 功能,TI 的 AM335X 系列芯片有这功能。

    5.2 RK3288 的 GPIO 操作方法

    GPIO: General-purpose input/output,通用的输入输出口
    CRU: Clock & Reset Unit (时钟和复位单元)
    PMU: Power Managerment Unit (电源管理单元)
    GRF: General Register Files (通用寄存器文件)

    5.2.1 RK3288 的 GPIO 模块结构

    在这里插入图片描述
    有 9 组 GPIO(GPIO0~8),每组分为最多 4 个小组 port A/B/C/D,每小组最多 8 个 GPIO。理论上每组GPIO 的引脚有 32 个,但是实际上并没有那么多。比如 GPIO0 只有 GPIO0_A0~A7、GPIO0_B0~B7、GPIO0_C0~C2 这些引脚。
    GPIO 的控制涉及 4 大模块:CRU、PMU、GRF、GPIO 模块本身。
    ① CRU 用于设置是否向 GPIO 模块提供时钟:
    CRU 的内部结构如下图所示:
    在这里插入图片描述

    可以设置寄存器使能 GPIOx 的时钟:
    a. CRU_CLKGATE17_CON 用于控制 GPIO0;
    b. CRU_CLKGATE14_CON 用于控制 GPIO1~8

    ② PMU 用于控制电源:
    电源管理单元里,有多个电源域(power domain,简称为 PM),在一个域下有多个设备。
    比如 PD_ALIVE,它下面有这些设备:CRU、GRF、GPIO 1~8、TIMER 或 WDT。
    比如 PD_PMU,它下面有这些设备:PMU、SRAM(4K)、Secure GRF、GPIO0。
    可见,GPIO0、GPIO1~8 分属不同的 PM。
    GPIO0、GPIO1~8 都是常供电的,它们是否工作取决于其时钟是否使能。

    ③ 设置引脚的模式(Mode、功能):
    GPIO0 比较特殊,为了让其引脚用于 GPIO 功能,要设置 PMU 里的相关寄存器。
    GPIO1~8 类似,为了让其引脚用于 GPIO 功能,要设置 GRF 里的相关寄存器。

    ④ GPIO 模块内部:
    方向:引脚设置为 GPIO 时,可以继续设置寄存器 GPIO_SWPORTA_DDR 确定它是输出引脚,还是输入引脚。
    数值:对于输出引脚,可以设置寄存器 GPIO_SWPORTA_DR 让它输出高、低电平;
    对于输入引脚,可以读取寄存器 GPIO_EXT_PORTA 得到引脚的当前电平。

    5.2.2 RK3288 的 GPIO 相关寄存器

    在这里插入图片描述

    5.3 RK3399 的 GPIO 操作方法

    GPIO: General-purpose input/output,通用的输入输出口
    CRU: Clock & Reset Unit (时钟和复位单元)
    PMU: Power Managerment Unit (电源管理单元)
    GRF: General Register Files (通用寄存器文件)

    5.3.1 RK3399 的 GPIO 模块结构

    在这里插入图片描述
    有 5 组 GPIO(GPIO0~4),每组分为最多 4 个小组 port A/B/C/D,每小组最多 8 个 GPIO。理论上每组 GPIO 的引脚有 32 个,但是实际上并没有那么多。比如 GPIO0 只有 GPIO0_A0~A7、GPIO0_B0~B5 这些引脚。

    ① CRU 用于设置是否向 GPIO 模块提供时钟
    a. PMUCRU_CLKGATE_CON1 用于控制 GPIO0~1;
    b. CRU_CLKGATE_CON31 用于控制 GPIO2~4

    ② PMU 用于控制电源:
    电源管理单元里,有多个电源域(power domain,简称为 PM),在一个域下有多个设备。
    比如 PD_ALIVE,它下面有这些设备:CRU、GRF、GPIO 1~4、TIMER 或 WDT。
    比如 PD_PMU,它下面有这些设备:cm0、PMU、SRAM(8K)、Secure GRF、GPIO0、PVTM、I2C。
    可见,GPIO0、GPIO1~4 分属不同的 PM。
    GPIO0、GPIO1~4 都是常供电的。

    ③ 设置引脚的模式(Mode、功能):
    GPIO0~1 比较特殊,为了让其引脚用于 GPIO 功能,要设置 PMU 里的相关寄存器。
    GPIO2~4 类似,为了让其引脚用于 GPIO 功能,要设置 GRF 里的相关寄存器。

    ④ GPIO 模块内部:
    方向:引脚设置为 GPIO 时,可以继续设置寄存器 GPIO_SWPORTA_DDR 确定它是输出引脚,还是输入引脚。
    数值:对于输出引脚,可以设置寄存器 GPIO_SWPORTA_DR 让它输出高、低电平;
    对于输入引脚,可以读取寄存器 GPIO_EXT_PORTA 得到引脚的当前电平。

    5.3.2 RK3399 的 GPIO 相关寄存器

    在这里插入图片描述

    5.4 IMX6ULL 的 GPIO 操作方法

    CCM: Clock Controller Module (时钟控制模块)
    IOMUXC : IOMUX Controller,IO 复用控制器
    GPIO: General-purpose input/output,通用的输入输出口

    5.4.1 IMX6ULL 的 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 模块本身,框图如下:

    在这里插入图片描述

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

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

    GPIOx 要用 CCM_CCGRy 寄存器中的 2 位来决定该组 GPIO 是否使能。哪组 GPIO 用哪个 CCM_CCGR 寄存器来设置,请看上图红框部分。
    CCM_CCGR 寄存器中某 2 位的取值含义如下:
    在这里插入图片描述
    ① 00:该 GPIO 模块全程被关闭
    ② 01:该 GPIO 模块在 CPU run mode 情况下是使能的;在 WAIT 或 STOP 模式下,关闭
    ③ 10:保留
    ④ 11:该 GPIO 模块全程使能

    GPIO2 时钟控制:
    在这里插入图片描述
    GPIO1、GPIO5 时钟控制:
    在这里插入图片描述

    GPIO3 时钟控制:
    在这里插入图片描述
    GPIO4 时钟控制:
    在这里插入图片描述

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

    参考资料:芯片手册《Chapter 32: IOMUX Controller (IOMUXC)》。
    在这里插入图片描述
    对于某个/某组引脚,IOMUXC 中有 2 个寄存器用来设置它:
    ① 选择功能:
    IOMUXC_SW_MUX_CTL_PAD_ :Mux pad xxx,选择某个 pad 的功能
    IOMUXC_SW_MUX_CTL_GRP_:Mux grp xxx,选择某组引脚的功能
    某个引脚,或是某组预设的引脚,都有 8 个可选的模式(alternate (ALT) MUX_MODE)。
    在这里插入图片描述
    比如:
    在这里插入图片描述
    ② 设置上下拉电阻等参数:
    IOMUXC_SW_PAD_CTL_PAD_:pad pad xxx,设置某个 pad 的参数
    IOMUXC_SW_PAD_CTL_GRP_:pad grp xxx,设置某组引脚的参数
    在这里插入图片描述
    比如:
    在这里插入图片描述

    5.4.4 GPIO 模块内部

    在这里插入图片描述

    我们暂时只需要关心 3 个寄存器:
    ① GPIOx_GDIR:设置引脚方向,每位对应一个引脚,1-output,0-input
    在这里插入图片描述
    ② GPIOx_DR:设置输出引脚的电平,每位对应一个引脚,1-高电平,0-低电平
    在这里插入图片描述
    ③ GPIOx_PSR:读取引脚的电平,每位对应一个引脚,1-高电平,0-低电平
    在这里插入图片描述

    5.4.5 读 GPIO

    在这里插入图片描述
    翻译一下:
    ① 设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的,上图省略了
    ② 设置 IOMUX 来选择引脚用于 GPIO
    ③ 设置 GPIOx_GDIR 中某位为 0,把该引脚设置为输入功能
    ④ 读 GPIOx_DR 或 GPIOx_PSR 得到某位的值(读 GPIOx_DR 返回的是 GPIOx_PSR 的值)

    5.4.6 写 GPIO

    在这里插入图片描述
    翻译一下:
    ① 设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的,上图省略了
    ② 设置 IOMUX 来选择引脚用于 GPIO
    ③ 设置 GPIOx_GDIR 中某位为 1,把该引脚设置为输出功能
    ④ 写 GPIOx_DR 某位的值

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

  • 相关阅读:
    在 Linux 中,可以使用分号 (;) 或者 && 运算符来执行多条命令
    应用在SMPS中的GaN/氮化镓
    基于51单片机的气泵气压控制系统无线WiFi通信proteus仿真原理图PCB
    降低企业运营成本的API服务有哪些?
    基于Nodejs的房屋租赁管理系统的设计和实现
    国际结算业务
    [Android] [解决]Bottom Navigation Views Activity工程带来的fragment底部遮盖的问题
    结构型模式 - 代理模式Proxy
    VSCODE CMAKE C++ 工程调试, C++不以科学计数法输出并控制小数位数
    总结三:计算机网络面经
  • 原文地址:https://blog.csdn.net/kingpower2018/article/details/133299430