在高级应用程序中使用 GPIO
重要
这是 Azure Sphere(旧版)文档。 Azure Sphere(旧版)将于 2027 年 9 月 27 日停用,用户此时必须迁移到 Azure Sphere(集成)。 使用位于 TOC 上方的版本选择器查看 Azure Sphere(集成)文档。
Azure Sphere 支持 GPIO(常规用途输入/输出)。 GPIO 是集成电路上一类可编程的数字引脚。 GPIO 没有预定义的功能,其行为可以通过应用程序进行自定义。 GPIO 的一些常见用途包括:更改硬件设备的状态、控制 LED、读取开关的状态。
注意
本主题介绍如何在高级应用程序中使用 GPIO。 有关在 RTApp 中使用 GPIO 的信息,请参阅在支持实时的应用程序中使用外围设备。
Azure Sphere 高级应用程序可以通过调用 Applibs GPIO API 与 GPIO 通信。 GPIO_HighLevelApp 示例演示了如何在 MT3620 设备上与 GPIO 通信。
GPIO 支持以下操作:
- 读取输入
- 将输出设置为高或低
- 轮询/软件中断
GPIO 要求
与 GPIO 通信的应用程序必须包含适当的 GPIO 头文件,并将 GPIO 设置添加到应用程序清单。
所有应用程序都必须设置其目标硬件,并包括相应的硬件定义头文件。
标头文件
#include <applibs/gpio.h>
#include "path-to-your-target-hardware.h"
将“path-to-your-target-hardware.h”替换为硬件头文件的路径。
应用程序清单设置
应用程序清单中的 GPIO 设置列出应用程序访问的 GPIO。 一次只有一个应用程序可以使用 GPIO。 若要配置这些设置,必须将 Gpio
功能添加到应用程序清单,然后将每个 GPIO 添加到该功能。 Azure Sphere 应用程序清单 具有更多详细信息。
在代码中,使用为硬件定义的常量来识别 GPIO。 生成应用时,编译器会将这些值转换为原始值。
以下是一个应用程序的应用程序清单摘录,该应用程序将 MT3620 参考开发板 (RDB)设为目标且需要三个 GPIO(1、8 和 12):
"Gpio": [ "$MT3620_RDB_HEADER1_PIN6_GPIO", "$MT3620_RDB_LED1_RED", "$MT3620_RDB_BUTTON_A" ]
以下摘录显示了如何在以 Avnet MT3620 初学者工具包为目标的应用程序中指定相同的 GPIO:
"Gpio": [ "$AVNET_MT3620_SK_GPIO1", "$AVNET_MT3620_SK_USER_LED_RED", "$AVNET_MT3620_SK_USER_BUTTON_A" ]
将 GPIO 作为输入打开
如果需要从 GPIO 读取,但不需向其写入,则可将其作为输入打开。 请调用 GPIO_OpenAsInput 将 GPIO 打开,然后将其设置为输入。 这样会检索 GPIO 上的操作的文件描述符。 将 GPIO 设置为输入以后,可以从其读取,但不能向其写入。 如果将 GPIO 设置为输入,则必须先将其关闭,然后才能将其设置为输出。
将 GPIO 作为输出打开
如果需向 GPIO 写入,则必须将其作为输出打开。 请调用 GPIO_OpenAsOutput 将 GPIO 打开,然后将其设置为输出。 这样会检索 GPIO 上的操作的文件描述符,然后设置输出模式和初始值。 将 GPIO 设置为输出以后,既可向其写入,也可从其读取。 如果将 GPIO 设置为输出,则必须先将其关闭,然后才能将其设置为输入。
轮询 GPIO
当 GPIO 处于打开状态时,可以通过监视它来获取事件,例如按钮事件。 为此,需设置一个计时器来轮询 GPIO。 不支持在 Azure Sphere 上执行针对 GPIO 的硬件中断操作,因此需使用轮询。 GPIO 示例演示了如何轮询 GPIO。
从 GPIO 读取
若要从 GPIO 读取,请调用 GPIO_GetValue。
向 GPIO 写入
若要向 GPIO 写入,请调用 GPIO_SetValue。
设置 GPIO 的驱动器强度
GPIO 引脚的驱动器强度是指用于驱动它的当前量。 通常,此数量的当前值设置为默认值。 但是,某些方案(如更亮的 LED 或增强的传感器电源)需要将驱动器强度调整到某些 GPIO 引脚。
若要设置驱动器强度,请先使用 gpiopin_request 结构为一个或多个 GPIO 引脚指定驱动器强度配置。 接下来,在 IOCTL 调用中传递 gpiopin_request
和 GPIO_SET_PIN_CONFIG_IOCTL 。
以下代码片段演示如何设置在结构数组中指定的 lineoffsets
两个 GPIO 引脚的 gpiopin_request
驱动器强度。
//get chip file descriptor
int chipfd = __z_azsp_open("/dev/gpiochip0", O_CLOEXEC);
//set drive strength for the requested pins
struct gpiopin_request pinreq;
memset(&pinreq, 0, sizeof(pinreq));
pinreq.linecount = 2;
pinreq.lineoffsets[0] = SAMPLE_RGBLED_BLUE;
pinreq.lineoffsets[1] = SAMPLE_RGBLED_RED;
pinreq.config_type = PIN_CONFIG_DRIVE_STRENGTH;
pinreq.config_arg = 16;
result = ioctl(chipfd, GPIO_SET_PIN_CONFIG_IOCTL, &pinreq);
if (result < 0) {
close(chipfd);
return -1;
}
//do other work like setting pins as output
struct gpiohandle_request request;
memset(&request, 0, sizeof(request));
request.flags = GPIOHANDLE_REQUEST_OUTPUT;
request.lines = 2;
request.lineoffsets[0] = SAMPLE_RGBLED_BLUE;
request.lineoffsets[1] = SAMPLE_RGBLED_RED;
request.default_values[0] = 1;
request.default_values[1] = 1;
result = ioctl(chipfd, GPIO_GET_LINEHANDLE_IOCTL, &request);
if (result < 0) {
close(chipfd);
return -1;
}
关闭 GPIO
若要关闭 GPIO,请调用 POSIX 函数 close()。
MT3620 支持
MT3620 芯片支持的 GPIO 功能列在 MT3620 支持状态中。 MT3620 开发板用户指南介绍了 MT3620 RDB 上的引脚布局和引脚功能。
Microsoft Azure Sphere SDK 安装目录中的 HardwareDefinitions 文件夹包含常见 Azure Sphere 开发板、模块和芯片的定义。 它包含标头和 JSON 文件,这些文件定义 MT3620、MT3620 RDB 和其他 MT3620 硬件的主接口。 HardwareDefinitions 文件夹的默认位置位于 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
Windows 和 /opt/azurespheresdk/HardwareDefinitions
Linux 上。
GitHub 上的 Azure Sphere 示例存储库包含标头和 JSON 文件,用于定义 MT3620 芯片和 MT3620 RDB 的 SPI 主接口,以及其他 MT3620 硬件。->