嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十三)普适的GPIO引脚操作方法

简介: 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十三)普适的GPIO引脚操作方法

1.普适的GPIO引脚操作方法


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


1.1 GPIO模块一般结构


a. 有多组GPIO,每组有多个GPIO

b. 使能:电源/时钟 c. 模式(Mode):引脚可用于GPIO或其他功能

d. 方向:引脚Mode设置为GPIO时,可以继续设置它是输出引脚,还是输入引脚

e. 数值:对于输出引脚,可以设置寄存器让它输出高、低电平

对于输入引脚,可以读取寄存器得到引脚的当前电平

1670916289975.jpg

每组GPIO有多组引脚,每一个引脚又可能是连接UART,也有可能连接GPIO,所以说还要选择引脚的模式,除此之外选择引脚是输入还是输出功能,最后选择输出或输入高电平还是低电平。


对于这些步骤具体怎么操作呢。要读取寄存器。


1.2 GPIO寄存器操作


a. 芯片手册一般有相关章节,用来介绍:power/clock 可以设置对应寄存器使能某个GPIO模块(Module)有些芯片的GPIO是没有使能开关的,即它总是使能的

b. 一个引脚可以用于GPIO、串口、USB或其他功能, 有对应的寄存器来选择引脚的功能

c. 对于已经设置为GPIO功能的引脚,有方向寄存器用来设置它的方向:输出、输入

d. 对于已经设置为GPIO功能的引脚,有数据寄存器用来写、读引脚电平状态


GPIO寄存器的2种操作方法:

原则:不能影响到其他位

举个例子:

要输出1,data_reg则需要设置为1。则需要如下三个步骤。


直接读写:读出、修改对应位、写入

要设置bit n:

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


要清除bit n:

val = data_reg;
val = val & ~(1<<n);
data_reg = val;

1670916318863.jpg


能不能直接data_reg=1?不能,这样的话你确实把data_reg设置为bit0=1了,但同时也把bit1=0,bit=0…了。违反了寄存器修改的原则。


更高效方法:

对于有些处理器,就有两个寄存器一个叫做set_reg的寄存器,一个叫做clr_reg的寄存器。设置寄存器set_reg=1,设置寄存器只有当某位等于1的时候才会有效果。所以当其位置不被设置为1,就不起作用。

1670916330133.jpg

再比如,让bit0=bit2=1,只需要set_reg=(1)|(1<<2);

1670916341388.jpg

让某一位清0。按照老办法你需要三步走,读,修改,写,现在有了clr_reg可以方便很多。如下:

1670916348902.jpg

上面的图意思是让第一位清0,其他位置不起作用。 同理让第一位和第三位清0:

1670916359133.jpg

上面这种方法就是set_and_clear proyocol.


set-and-clear protocol:

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

要设置bit n:set_reg =(1<<n);

要清除bit n:clr_reg = (1<<n);


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


后续章节再介绍

相关文章
|
5月前
|
存储 网络协议 Ubuntu
【Linux开发实战指南】基于UDP协议的即时聊天室:快速构建登陆、聊天与退出功能
UDP 是一种无连接的、不可靠的传输层协议,位于IP协议之上。它提供了最基本的数据传输服务,不保证数据包的顺序、可靠到达或无重复。与TCP(传输控制协议)相比,UDP具有较低的传输延迟,因为省去了建立连接和确认接收等过程,适用于对实时性要求较高、但能容忍一定数据丢失的场景,如在线视频、语音通话、DNS查询等。 链表 链表是一种动态数据结构,用于存储一系列元素(节点),每个节点包含数据字段和指向下一个节点的引用(指针)。链表分为单向链表、双向链表和循环链表等类型。与数组相比,链表在插入和删除操作上更为高效,因为它不需要移动元素,只需修改节点间的指针即可。但访问链表中的元素不如数组直接,通常需要从
308 2
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
116 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
4月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
60 6
|
4月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
61 5
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
152 3
|
4月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
143 3
|
5月前
|
Web App开发 缓存 Linux
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
《FFmpeg开发实战》书中第10章提及轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适合生产环境。推荐使用SRS或ZLMediaKit,其中SRS是国产开源实时视频服务器,支持多种流媒体协议。本文简述在华为欧拉系统上编译安装SRS和FFmpeg的步骤,包括安装依赖、下载源码、配置、编译以及启动SRS服务。此外,还展示了如何通过FFmpeg进行RTMP推流,并使用VLC播放器测试拉流。更多FFmpeg开发内容可参考相关书籍。
138 2
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
|
3月前
|
Linux 测试技术 芯片
在Linux中使用GPIO线【ChatGPT】
在Linux中使用GPIO线【ChatGPT】
|
5月前
|
Linux
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
《FFmpeg开发实战》书中介绍了直播的RTSP和RTMP协议,以及新协议SRT和RIST。SRT是安全可靠传输协议,RIST是可靠的互联网流传输协议,两者于2017年发布。腾讯视频云采用SRT改善推流卡顿。以下是Linux环境下为FFmpeg集成libsrt和librist的步骤:下载安装源码,配置、编译和安装。要启用这些库,需重新配置FFmpeg,添加相关选项,然后编译和安装。成功后,通过`ffmpeg -version`检查版本信息以确认启用SRT和RIST支持。详细过程可参考书中相应章节。
119 1
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist

热门文章

最新文章