嵌入式 - GPIO编程简介

An Introduction to GPIO Programming

By Jeff Tranter Wednesday, June 12, 2019

编者按:本 2019 年博客系列是 ICS 最受欢迎的系列之一,现已更新(2022 年 12 月),以确保内容仍然准确、相关和有用。

本博客是 Integrated Computer Solutions (ICS) 关于 GPIO 编程的新系列博客的开篇。GPIO 即通用输入/输出,是大多数现代嵌入式计算机硬件的一项功能,也是许多嵌入式系统的关键组件。在本系列中,我将结合理论和实际编程示例,介绍嵌入式编程的这一重要方面。在第一篇文章中,我将概述 GPIO 编程、它的用途以及使用它所需了解的一些基本概念。

在接下来的文章中,我将介绍如何从文件系统或 sysfs 接口、Python(使用各种模块)以及 C 或 C++ 对 GPIO 进行编程。我将介绍一些低成本商用嵌入式板卡的功能,包括 Raspberry Pi 系列和 Toradex 的板卡。除了基本的数字输入和输出功能外,我还将介绍其他协议,如 SPI、I2C、1-Wire 和串行接口。

此外,我还会将一些低级编程与 Qt 联系起来,并展示一两个利用 Qt 功能的示例。虽然具体的代码示例是为 Raspberry Pi 或 Toradex 平台编写的,但这些概念也适用于其他硬件,只要这些硬件运行某种形式的 Linux,如 Raspbian、Yocto 或 boot2qt。

Editor's note: This 2019 blog series, among ICS' most popular,  has been updated (December 2022) to ensure the content is still accurate, relevant and useful.

This blog launches Integrated Computer Solutions' (ICS) new series on GPIO programming. GPIO, or General-Purpose Input/Output, is a feature of most modern embedded computer hardware and a key component of many embedded systems. In this series, I'll cover this important aspect of embedded programming, with a mix of  theory and practical programming examples. In this first installment I'll present an overview of GPIO programming, what it can be used for and some basic concepts you need to know in order to use it.

In upcoming posts I explain how to program GPIO, starting with the file system or sysfs interface, as well as from Python (using various modules) and from C or C++. I'll cover the capabilities of some low-cost commercial embedded boards, including the Raspberry Pi series and boards from Toradex. In addition to basic digital input and output functions, I'll address other protocols, such as SPI, I2C, 1-Wire and serial interfaces.

As a bonus, I'll tie some of this low-level programming back to Qt and show an example or two that make use of Qt features. While the specific code examples will be written for the Raspberry Pi or Toradex platforms, the concepts will be applicable to other hardware as long as it is running some form of Linux like Raspbian, Yocto or boot2qt.

What is GPIO?

GPIO 是集成电路或电路板上的一个信号引脚,可用于执行数字输入或输出功能。根据设计,它没有预定义的用途,硬件或软件开发人员可以使用它来执行自己选择的功能。典型的应用包括控制 LED、读取开关和控制各类传感器。

例如,大多数型号的 Raspberry Pi 都有一个 40 针 GPIO 连接器,可连接约 25 条 GPIO 线路。

A GPIO is a signal pin on an integrated circuit or board that can be used to perform digital input or output functions. By design it has no predefined purpose and can be used by the hardware or software developer to perform the functions they choose. Typical applications include controlling LEDs, reading switches and controlling various types of sensors.

Most models of Raspberry Pi, for example, have a 40-pin GPIO connector that provides access to about 25 GPIO lines.

GPIO 可由专用集成电路实现,或通常由片上系统 (SoC) 或模块上系统 (SoM) 设备直接支持。

GPIO 引脚最常见的功能包括:

  • 可通过软件配置为输入或输出

  • 启用或禁用

  • 设置数字输出的值

  • 读取数字输出的值

  • 当输入值发生变化时产生中断

GPIO 引脚是数字引脚,这意味着它们只支持高/低或开/关电平。它们通常不支持具有许多离散电压电平的模拟输入或输出。某些 GPIO 引脚可直接支持标准化通信协议,如串行通信、SPI、I2C、PCM 和 PWM。(我将在今后的文章中介绍这些内容)。

GPIO may be implemented by dedicated integrated circuits, or more often are directly supported by system on a chip (SoC) or system on a module (SoM) devices.

The most common functions of GPIO pins include:

* Being configurable in software to be input or output

* Being enabled or disabled

* Setting the value of a digital output

* Reading the value of a digital output

* Generating an interrupt when the input changes value

GPIO pins are digital, meaning they only support high/low or on/off levels. They generally don't support analog input or output with many discrete voltage levels. Some GPIO pins may directly support standardized communication protocols like serial communication, SPI, I2C, PCM, and PWM. (I'll cover these in future posts).

Hardware Concepts

如果您想尝试 GPIO 编程,您需要一些硬件和工具。除了 Raspberry Pi 这样的电路板外,还需要一些有用的部件和工具:

  • GPIO 分线或原型板

  • 无焊面包板和跳线

  • 各种 LED、电阻器和开关

  • 低成本数字万用表

这些可从许多供应商(如 AdaFruit)处购买。如果不想组装自己的硬件,也可以控制各种市售电路板。在 ICS,我们设计了一个小型 GPIO 学习板(如下图所示),用于我们的嵌入式编程课程。我将在以后的文章中详细介绍。

If you want to experiment with GPIO programming, you'll need some hardware and tools. In addition to a board like a Raspberry Pi, some useful parts and tools to have include:

  • GPIO breakout cable or prototyping board

  • Solderless breadboard and jumper wires

  • Variety of LEDs, resistors, and switches

  • Low-cost digital multimeter

These are available from many vendors such as AdaFruit. There are also various commercially available boards that you can control if you don't want to assemble your own hardware. At ICS, we designed a small GPIO Learning Board (shown below) that we use for our embedded programming classes. I'll describe that in more detail in later posts.

A Word on Safety / 安全问题

如果你是硬件方面的新手,就必须了解一些基本的安全知识。由于 Raspberry Pi 和类似电路板上的电压很低(5 伏或更低),因此只要避免使用任何电源线电压的电路,触电的风险就很小。

如果你要进行任何焊接或剪切导线引线,都应小心谨慎并戴上护目镜。

最有可能发生的事故是不慎损坏 Raspberry Pi 或其他设备。将 GPIO 或其他引脚连接到错误的电压上很容易损坏电路板,使其无法使用。静电,尤其是在干燥的冬季,也会产生高电压,如果你产生静电并触摸电路板,就会损坏硬件。建议在工作区使用接地的防静电垫和/或腕带。

此外,请注意包括 Raspberry Pi 在内的许多设备使用 3.3 伏逻辑电平,如果连接到 5 伏电压(Arduino 等许多其他设备使用 5 伏电压,GPIO 连接器上也有 5 伏电压),可能会损坏设备。

If you are new to hardware, a few words on basic safety are in order. Since the voltages on a Raspberry Pi and similar boards are low (5 volts or less), the risk of electric shock is minimal as long as you avoid any circuity that operates on power line voltages.

You should use caution and wear eye protection if you do any soldering or clip wire leads.

The most likely accident is to inadvertently damage your Raspberry Pi or other device. Connecting a GPIO or other pin to the wrong voltage can easily damage the board and render it unusable. Static electricity, especially during the dry winter months, can also generate high voltages that can damage hardware if you develop a static charge and then touch the board. A grounded anti-static mat and/or wrist strap are recommended for your work area.

Also be aware that many devices, including the Raspberry Pi, use 3.3 volt logic levels and can be damaged if connected to 5 volts, which is used by many other devices like Arduino and is present on the GPIO connector.

One Caveat / 一个注意事项

作为一个经常使用 Qt 框架开发图形用户界面应用程序的人,我想提最后一点注意事项。一般来说,嵌入式应用程序不会在运行图形用户界面的 CPU 上进行大量 GPIO 编程。相反,您通常希望使用另一个处理器或微控制器,尤其是在控制硬件有任何实时要求的情况下。

以下是一些例外情况,您可能需要在与图形用户界面相同的 CPU 上进行 GPIO 编程:

1,低速或很少使用的功能,如电源开关感应。

2,使用实时操作系统 (RTOS),可以从进程或线程运行代码,并保证响应时间和延迟时间的设计。

3,使用 Raspberry Pi 等现成的电路板开发初始原型或概念验证,这种电路板并非用于生产。

4,对性能要求不高的教育或自学应用。

As someone who often uses the Qt framework for developing applications with graphical user interfaces, I'd like to mention one final caveat. Generally speaking, embedded applications will not do any significant amount of GPIO programming on the same CPU as the one that runs the GUI. Instead, you'll typically want to use another processor or microcontroller, particularly if there are any real-time requirements for controlling the hardware.

Some exceptions to this rule where you might want to do GPIO programming on the same CPU as the GUI can include:

1. Low-speed or rarely used functions, such as power on/off switch sensing.

2. A design where you're using a real-time operating system (RTOS) and can run code from a process or thread with guaranteed response and latency times.

3. Developing an initial prototype or proof of concept with an off-the-shelf board like the Raspberry Pi that is not meant for production use.

4. Educational or self-learning applications where performance is not a factor.

随着本系列文章的展开,我们还将推出更多有关 GPIO 编程的内容。希望您能继续关注,尝试并修改其中的一些程序示例。

关于作者

杰夫-特兰特

Jeff Tranter 是 ICS 的 Qt 咨询经理。他负责监督客户软件系统的架构和高层设计。在杰夫的领导下,组织全球团队开发桌面和嵌入式应用程序。他曾在《电子设计》杂志上发表过文章。 (Home | Electronic Design)

Look for more on GPIO programming as this series unfolds. I hope you follow along, try out and modify some of the program examples.

About the author

Jeff Tranter

Jeff Tranter is a Qt Consulting Manager at ICS. He oversees the architectural and high-level design of software systems for clients. Jeff’s leadership organizes global teams of developers on desktop and embedded applications. He has been published in Electronic Design magazine.

参考:

An Introduction to GPIO Programming | ICS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片转word如何转换?

要将图片转换为Word文档,你可以使用以下方法之一: 以上这些方法都可以帮助你将图片中的文本转换为可编辑的Word文档,你可以根据自己的喜好和需求选择其中一种方法来操作。 使用OCR软件或在线工具:有许多OCR(Optical Ch…

电子资源|基于SSM+vue的电子资源管理系统(源码+数据库+文档)​

电子资源管理系统 目录 基于SSMvue的电子资源管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍 文章编号&#x…

python代码实现TF-IDF

1、TF-IDF解释 TF-IDF(Term frequency–inverse document frequency),中文翻译就是词频 - 逆文档频率,是一种用来计算关键词的传统方法。 TF(Term Frequency):TF 的意思就是词频,是…

SQL Server共享功能目录显示灰色无法自行选择

SQL Server共享功能目录显示灰色无法自行调整 一、 将之前安装SQL Server卸载干净 二、 清空注册表 1. 打开注册表,winR,输入regedit 2. 注册表-》编辑-》查找,输入C:\Program Files\Microsoft SQL Server\ 3. 注册表-》编辑-》查找&#x…

docker+nginx+Jenkins自动构建

文章目录 前言一、实操记录问下AI:jenkins 配置新增一个mobilegit配置Build TriggersBuild EnvironmentBuild StepsPost-build Actions 上面一顿配置下来,构建 -- FAILURE 总结 前言 在已有docker-Jenkins-nginx 部署方案上,在另外一台测试…

C++实现一个简单的控制cpu利用率的程序

写一个程序&#xff0c;让控制cpu利用率在20%左右 思路很简单&#xff1a;每个循环控制sleep的时间占比 #include <iostream> #include <chrono> #include <unistd.h>int main() {int ratio 20;int base_time 1000;int sleeptime base_time * (100-ratio…

【计算机网络篇】数据链路层(10)在物理层扩展以太网

文章目录 &#x1f354;扩展站点与集线器之间的距离&#x1f6f8;扩展共享式以太网的覆盖范围和站点数量 &#x1f354;扩展站点与集线器之间的距离 &#x1f6f8;扩展共享式以太网的覆盖范围和站点数量 以太网集线器一般具有8~32个接口&#xff0c;如果要连接的站点数量超过了…

10分钟入门pandas(一)

pandas 是基于python语言的数据分析处理库,使用广泛。本文主要参考pandas的官方入门指导,并结合自己入门使用的一些常用操作进行说明。 pandas通常和numpy结合使用,一般通过如下语句导入numpy和pandas库。 import numpy as np import pandas as pd一. pandas 数据结构 pan…

基于SSM的计算机课程实验管理系统的设计与实现(源码)

| 博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f44…

大屏分辨率适配插件v-scale-screen

前言&#xff1a;大屏分辨率适配繁多&#xff0c;目前我认为最简单且问题最少的的方案就是使用v-scale-screen插件&#xff0c;无需考虑单位转换&#xff0c;position定位也正常使用。 1. 效果 填充满屏幕的效果 保持宽高比的效果 2. 插件原理 原理是通过css transfom 实现…

macOS12安装 php8.1和apache

1. 安装php 8.1 macOS12不再自带php brew tap shivammathur/php 查看可安装版本 brew search php 安装指定版本 brew install php8.1 环境配置 vim ~/.zshrc export PATH"/usr/local/opt/php8.1/bin:$PATH" export PATH"/usr/local/opt/php8.1/sbin:$PAT…

[C#] 使用HttpClient请求https地址报错的解决方案

当使用HttpClient请求HTTPS地址遇到报错时&#xff0c;下面将解析并提供可能的解决方案供参考。 文章目录 异常代码无法定位错误的准确定位错误的 常见错误错误1错误2 解决问题生产环境开发环境 异常代码 首先&#xff0c;需要查看引发异常的代码部分, 无法定位错误的 以下代…

Android Compose 一:基础控件

Flutter 与 Compose 组件辣么像&#xff0c;难道是同一个google团队整的&#xff1b;也未深究&#xff0c;只是猜测。 创建项目 需要使用新版本Android studio&#xff0c;忽略步骤… 项目目录 MainActivity说明 1 系统默认页面 Preview 修饰的方法&#xff0c;只用来供开发…

撤销 git add 操作(忽略被追踪的文件)

文章目录 引言I git rm命令来取消暂存【推荐】II 撤销特定文件的暂存状态2.1 git rese2.2 git restoresee also引言 应用场景: 修改.gitignoregitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先…

精选多个炫酷的数据可视化大屏(含源码),拿走就用~

末尾有链接 演示地址&#xff1a;可视化大数据展示中心 (null.fit) 可视化大数据展示模板-科技语者 (chgskj.cn)

【Java】:方法重写、动态绑定和多态

目录 一个生动形象的例子 场景设定 1. 方法重写&#xff08;Method Overriding&#xff09; 2. 动态绑定&#xff08;Dynamic Binding&#xff09; 3. 多态&#xff08;Polymorphism&#xff09; 归纳关系&#xff1a; 重写 概念 条件 重写的示例 重载与重写的区别 …

libssh C++封装之七(File)

1 概述 libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh,您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C++封装。 libssh下载地址 3 实现 3.6 File File类型可以读写远程文件。 3.6.1 File定义 …

使用rsync+lnotify实现远程数据实时同步备份

目录 1、定时备份与实时备份区别 2、配置客户端 2.1、在客户端安装inotify-tools软件。以便提供inotifywait inotifywatch 辅助工具程序 2.2 验证&#xff1a;监控客户端/data_backup目录的变化 2.3 编写自动同步脚本 2.4 后台运行脚本 2.5 验证数据实时同步效果 1、定…

SpringCloud:服务拆分和远程调用

程序员老茶 &#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; P   S : 点赞是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#…