在高级应用程序中使用 GPIO
Azure Sphere 支持 GPIO (常规用途输入/输出) 。 GPIO 是集成电路上的一种可编程数字引脚。 GPIO 没有预定义的功能,应用程序可以自定义其行为。 GPIO 的一些常见用途是更改硬件设备的状态、控制 LED 以及读取交换机的状态。
注意
本主题介绍如何在高级应用程序中使用 GPIO。 有关在 RTApps 中使用 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) 的应用程序的应用程序清单摘录, (1、8 和 12) 获取其三个 GPIO:
"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 设置为 input,必须先 关闭 它,然后才能将其设置为输出。
打开 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 开发板、模块和芯片的定义。 它包含用于定义 MT3620、MT3620 RDB 以及其他 MT3620 硬件的主接口的标头和 JSON 文件。 HardwareDefinitions 文件夹的默认位置在 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
Windows 和 /opt/azurespheresdk/HardwareDefinitions
Linux 上。
GitHub 上的 Azure Sphere 示例存储库包含标头和 JSON 文件,这些文件为 MT3620 芯片 和 MT3620 RDB以及其他 MT3620 硬件定义 SPI 主接口。-->