GPIO 驱动
基于 lisa_device 框架的 GPIO 设备驱动,为 ARCS 平台提供统一的 GPIO 操作接口。
功能特性
设备支持: GPIOA、GPIOB 两个 GPIO 控制器
引脚配置: 支持输入/输出模式、上下拉电阻、去抖动
IO 操作: 引脚电平读写
中断支持: 多种触发模式(上升沿、下降沿、双边沿、高低电平)
配置选项
在 prj.conf 中启用驱动:
CONFIG_LISA_GPIO_DEVICE=y
CONFIG_LISA_GPIOA=y # 启用 GPIOA 设备
CONFIG_LISA_GPIOB=y # 启用 GPIOB 设备
根据需要选择启用 GPIOA 或 GPIOB 设备。
API 接口
引脚配置
int lisa_gpio_configure(lisa_device_t *dev, uint32_t pin, lisa_gpio_flags_t flags);
int lisa_gpio_get_config(lisa_device_t *dev, uint32_t pin, lisa_gpio_flags_t *flags);
IO 操作
int lisa_gpio_read_pin(lisa_device_t *dev, uint32_t pin); // 返回 LISA_GPIO_LOW/HIGH
int lisa_gpio_write_pin(lisa_device_t *dev, uint32_t pin, uint32_t value);
中断管理
int lisa_gpio_configure_irq(lisa_device_t *dev, uint32_t pin, lisa_gpio_irq_mode_t mode,
lisa_gpio_irq_callback_t callback, void *user_data);
int lisa_gpio_enable_irq(lisa_device_t *dev, uint32_t pin);
int lisa_gpio_disable_irq(lisa_device_t *dev, uint32_t pin);
使用示例
输出模式
#include "lisa_gpio.h"
// 获取 GPIOA 设备
lisa_device_t *gpioa = lisa_device_get("gpioa");
if (!gpioa) {
return -1;
}
// 配置引脚 5 为输出模式,初始电平为高
lisa_gpio_configure(gpioa, 5, LISA_GPIO_OUTPUT | LISA_GPIO_OUTPUT_INIT_HIGH);
// 设置高电平
lisa_gpio_write_pin(gpioa, 5, LISA_GPIO_HIGH);
// 设置低电平
lisa_gpio_write_pin(gpioa, 5, LISA_GPIO_LOW);
输入模式
// 配置引脚 3 为输入上拉模式
lisa_gpio_configure(gpioa, 3, LISA_GPIO_INPUT | LISA_GPIO_PULL_UP);
// 配置引脚 4 为输入下拉模式,启用去抖动
lisa_gpio_configure(gpioa, 4, LISA_GPIO_INPUT | LISA_GPIO_PULL_DOWN | LISA_GPIO_DEBOUNCE);
// 读取引脚电平
int level = lisa_gpio_read_pin(gpioa, 3);
if (level == LISA_GPIO_HIGH) {
// 高电平处理
}
中断模式
// 中断回调函数
void gpio_irq_handler(uint32_t pin, void *user_data)
{
// 中断处理逻辑(在中断上下文中执行,应尽量简短)
printf("GPIO Pin %d interrupt triggered\n", pin);
}
// 配置引脚 10 为输入上拉模式
lisa_gpio_configure(gpioa, 10, LISA_GPIO_INPUT | LISA_GPIO_PULL_UP);
// 配置上升沿中断
lisa_gpio_configure_irq(gpioa, 10, LISA_GPIO_IRQ_EDGE_RISING,
gpio_irq_handler, NULL);
// 启用中断
lisa_gpio_enable_irq(gpioa, 10);
配置标志位
驱动使用标志位方式进行配置,可以通过按位或(|)组合多个标志:
方向标志
LISA_GPIO_INPUT- 输入模式(默认)LISA_GPIO_OUTPUT- 输出模式
上下拉标志
LISA_GPIO_PULL_UP- 启用上拉电阻LISA_GPIO_PULL_DOWN- 启用下拉电阻
去抖动标志
LISA_GPIO_DEBOUNCE- 启用去抖动
初始电平标志(仅用于输出模式)
LISA_GPIO_OUTPUT_INIT_LOW- 输出初始化为低电平LISA_GPIO_OUTPUT_INIT_HIGH- 输出初始化为高电平
示例组合
// 输入模式 + 上拉
LISA_GPIO_INPUT | LISA_GPIO_PULL_UP
// 输入模式 + 下拉 + 去抖动
LISA_GPIO_INPUT | LISA_GPIO_PULL_DOWN | LISA_GPIO_DEBOUNCE
// 输出模式 + 初始高电平
LISA_GPIO_OUTPUT | LISA_GPIO_OUTPUT_INIT_HIGH
中断触发模式
LISA_GPIO_IRQ_EDGE_RISING- 上升沿触发LISA_GPIO_IRQ_EDGE_FALLING- 下降沿触发LISA_GPIO_IRQ_EDGE_BOTH- 双边沿触发LISA_GPIO_IRQ_LEVEL_HIGH- 高电平触发LISA_GPIO_IRQ_LEVEL_LOW- 低电平触发
硬件配置
引脚复用配置
GPIO 驱动在初始化时会自动调用板型目录中定义的引脚复用函数,用于配置 GPIO 引脚的复用功能。
配置位置:
定义:
boards/<板型名>/pinmux.c中实现lisa_gpioa_pinmux()和lisa_gpiob_pinmux()函数声明:
boards/<板型名>/pinmux.h中声明void lisa_gpioa_pinmux()和void lisa_gpiob_pinmux()调用时机: GPIOA/GPIOB 设备初始化时自动调用
示例 (参考 boards/arcs_evb/pinmux.c):
void lisa_gpioa_pinmux()
{
// 配置 PA20 为 GPIO 功能(功能码 1)
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 20, 1);
// 配置 PA21 为 GPIO 功能(功能码 0,默认 GPIO)
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_A, 21, 0);
}
void lisa_gpiob_pinmux()
{
// 配置 PB08 为 GPIO 功能(功能码 0)
IOMuxManager_PinConfigure(CSK_IOMUX_PAD_B, 8, 0);
}
注意:
该函数由板型相关代码实现,不同板型的引脚配置可能不同
只需配置实际使用的 GPIO 引脚
功能码需根据芯片手册确定,通常 GPIO 功能对应功能码 0 或 1
注意事项
引脚范围: 每个 GPIO 控制器支持 0-31 共 32 个引脚
中断回调: 在中断上下文执行,应保持简短快速
线程安全: 驱动内部使用互斥锁保护中断配置操作
设备初始化: 使用前需确保设备已正确初始化
文件说明
lisa_gpio.h- 驱动头文件,包含所有 API 和类型定义lisa_gpio_arcs.c- ARCS 平台适配实现CMakeLists.txt- 构建配置Kconfig- 配置选项