当前位置: 首页 > news >正文

RK平台操作GPIO的两种方法

RK平台操作GPIO的两种方法

在嵌入式开发调试过程中,操作 GPIO 是一个至关重要的技能。通过操作 GPIO,我们可以控制外部设备,比如开关LED灯、开关模块电源、复位外设等。本文将分享两种在 RK 平台上通过 ADB 或者调试串口就能操作 GPIO 的方法。

直接操作寄存器

这种方式可以直接通过操作 CPU 的寄存器,精准控制每一个 GPIO 引脚的状态,简单直接。缺点就是需要查阅芯片手册,并且要求板子上有 IO 指令,IO 指令的使用方法可以看前面的文章。
下面以拉高 RK3399 的 GPIO2_D3 为例来说明:

  • 查GRF基址
    从 RK3399 的 TRM 手册 Address Mapping 章节获得 GRF 基址为:0xFF770000:
    GRF 基址
  • 查IOMUX偏移址
    IOMUX 管理每个 GPIO 口的功能复用,从 GRF Register Description 章节找到 GRF_GPIO2D_IOMUX 偏移地址为 0x0000E00C:
    IOMUX 偏移址
  • 设置 IOMUX 寄存器
    找到 IOMUX 寄存器的描述:
    IOMUX 寄存器
    可以看到 bit[7:6] 设置为 2’b00 的时候,该 GPIO 为 GPIO 功能,由于 bit[31:16] 为写允许位,bit[7:6] 对应的写允许位 bit[23:22] 为2’b11,因此实际写入的寄存器值为0x00C00000:
io -4 0xFF77E00C 0x00C00000
  • 查 PU/PD 偏移址
    PU/PD 控制每个 GPIO 口的拉低和拉高,从 GRF Register Description 章节找到 GRF_GPIO2D_P 偏移地址为 0x0000E04C:
    PU/PD偏移址
  • 设置 PU/PD 寄存器
    找到 PU/PD 寄存器的描述:
    PU/PD 寄存器
    可以看到 bit[7:6] 设置为 2’b11 的时候,该 GPIO 是拉高状态(pull-up),由于 bit[31:16] 为写允许位,bit[7:6] 对应的写允许位 bit[23:22] 为2’b11,因此实际写入的寄存器值为0x00C000C0:
io -4 0xFF77E04C 0x00C000C0

通过 Sysfs 接口

Sysfs 接口是 kernel 给用户空间提供的接口,可以把设备和驱动程序从内核输出到用户空间,也可以用来对设备和驱动程序做设置,因此也为 GPIO 提供了简便的操作方式。通过文件系统对 GPIO 进行配置和控制,可以避免直接操作寄存器的复杂性。但是,要通过 Sysfs 接口来操作,前提是系统没有使用到对应的 GPIO 口,设备的 dts 文件也没有对该 GPIO 口有定义,否则可能会导致操作失败。
下面同样以拉高 RK3399 的 GPIO2_D3 为例来说明:

  • 计算 GPIO 编号
    GPIO 的编号计算公式为:GPIO2_D3=2x32+(D-A)x8+3=2x32+3x8+3=91,因此 GPIO2_D3 的编号是 91。
  • 导出GPIO
echo 91 > /sys/class/gpio/export
  • 配置为输出模式
echo "out" > /sys/class/gpio/gpio91/direction
  • 设置输出值
echo "1" > /sys/class/gpio/gpio91/value  # 高电平
echo "0" > /sys/class/gpio/gpio91/value  # 低电平

Sysfs 接口适合开发者快速上手 GPIO 控制,无需复杂的底层操作,适合简单的项目或测试使用。

总结

在 RK 平台上操作 GPIO 有多种方法,以上是个人在 RK 平台开发调试过程经常用到的方法,在项目开发中可以根据现场条件选择最适合的方式。

欢迎关注公众号“我的RK随记”,获取更多技术分享!


http://www.mrgr.cn/news/57548.html

相关文章:

  • vue3可组合函数和hook的用法和使用场景区别
  • 系统架构设计师教程 第18章 18.4 信息安全整体架构设计 笔记
  • 058_基于python时尚女装抖音号评论数据分析系统
  • ELRS遥控器与接收机WIFI对频
  • 九、pico+Unity交互开发——触碰抓取
  • redis 第155节答疑 源码分析Hash类型ziplist结构和zlentry实体解析
  • 爬虫中代理ip的选择和使用实战
  • HCIP--1
  • Java 网络下载文件输出字节流
  • 鸿蒙开发融云Demo消息列表
  • 顶层模块中定义一个数组,如何 通过端口将这个数组传递给所有需要它的子模块
  • Find My折叠车|苹果Find My技术与折叠车结合,智能防丢,全球定位
  • 2024年6月份北京深信服——蓝中护网面试经验分享
  • 博客搭建之路:hexo搜索引擎收录
  • 程序员35岁何必苟且,打造一人企业开启创业之路
  • 软考信息安全
  • c# grpc 保姆级教学搭建grpc框架 服务端、客户端
  • bcf的设计思想
  • 【2024工业3D异常检测文献】LSFA: 面向三维工业异常检测的自监督特征适配
  • 数据结构之栈
  • java 语言层面 Final 关键字和 Finally关键字的区别
  • Artificial Intelligence
  • 如何训练 RAG 模型
  • Git报错:Another git process seems to be running in this repository【已解决】
  • 如何在算家云搭建ControlNext-SVD(视频生成)
  • Vue.js组件开发全攻略:从基础到进阶,打造高效可维护的前端应用!