GPIO 驱动
概述
GPIO(General Purpose Input/Output)通用输入输出接口是微控制器最基本的数字接口,用于控制外部设备和读取外部信号。BK7239N 提供丰富的 GPIO 资源,支持多种配置和功能。
功能描述
多通道支持:支持多个 GPIO 通道同时工作
输入输出模式:支持输入和输出模式配置
上拉下拉:支持内部上拉、下拉电阻配置
中断支持:支持上升沿、下降沿、双边沿中断
唤醒功能:支持 GPIO 唤醒低功耗模式
复用功能:支持 GPIO 复用为其他外设功能
驱动能力:支持多种驱动能力配置
低功耗保持:支持低功耗模式下状态保持
外部 LDO 控制:支持外部 LDO 控制功能
时钟控制:支持时钟引脚控制
开发指引
初始化流程 - 调用 bk_gpio_driver_init() 初始化 GPIO 驱动 - 配置 GPIO 模式(输入/输出) - 根据需要配置上拉/下拉电阻 - 配置中断和唤醒功能
基本使用 - 使用 bk_gpio_enable_output() 配置为输出模式 - 使用 bk_gpio_enable_input() 配置为输入模式 - 使用 bk_gpio_set_output_high() 和 bk_gpio_set_output_low() 控制输出 - 使用 bk_gpio_get_input() 读取输入状态
中断处理 - 配置中断类型(上升沿/下降沿/双边沿) - 注册中断服务函数 - 启用/禁用中断
唤醒功能 - 配置 GPIO 为唤醒源 - 设置唤醒条件 - 处理唤醒事件
注意事项
确保在调用其他 GPIO API 前先调用 bk_gpio_driver_init()
GPIO 复用功能需要与硬件设计匹配
中断配置需要与硬件连接匹配
使用唤醒功能时注意功耗管理
注意 GPIO 的电气特性和驱动能力
低功耗模式下 GPIO 状态可能改变
API 说明
主要 API 函数:
bk_gpio_driver_init() - 初始化 GPIO 驱动
bk_gpio_driver_deinit() - 反初始化 GPIO 驱动
bk_gpio_set_value() - 设置 GPIO 值
bk_gpio_get_value() - 获取 GPIO 值
bk_gpio_enable_output() - 启用输出模式
bk_gpio_disable_output() - 禁用输出模式
bk_gpio_enable_input() - 启用输入模式
bk_gpio_disable_input() - 禁用输入模式
bk_gpio_pull_up() - 配置上拉
bk_gpio_pull_down() - 配置下拉
bk_gpio_set_config() - 设置 GPIO 配置
bk_gpio_set_output_high() - 设置输出高电平
bk_gpio_set_output_low() - 设置输出低电平
bk_gpio_get_input() - 获取输入状态
bk_gpio_set_capacity() - 设置驱动能力
bk_gpio_set_interrupt_type() - 设置中断类型
bk_gpio_enable_interrupt() - 启用中断
bk_gpio_disable_interrupt() - 禁用中断
bk_gpio_clear_interrupt() - 清除中断
bk_gpio_register_isr() - 注册中断服务函数
bk_gpio_unregister_isr() - 注销中断服务函数
bk_gpio_set_wakeup_source() - 设置唤醒源
bk_gpio_clear_wakeup_source() - 清除唤醒源
bk_gpio_low_power_keep_status() - 低功耗保持状态
bk_gpio_external_ldo_control() - 外部 LDO 控制
bk_gpio_clock_pin_control() - 时钟引脚控制
bk_gpio_retention() - GPIO 保持功能
示例代码
基本使用示例:
#include <driver/gpio.h>
void gpio_example(void)
{
// 初始化 GPIO 驱动
bk_gpio_driver_init();
// 配置 GPIO0 为输出模式
bk_gpio_enable_output(GPIO_0);
bk_gpio_set_output_high(GPIO_0);
// 配置 GPIO1 为输入模式
bk_gpio_enable_input(GPIO_1);
bk_gpio_pull_up(GPIO_1);
// 读取输入状态
uint32_t input_state = bk_gpio_get_input(GPIO_1);
printf("GPIO1 Input: %d\n", input_state);
}
中断处理示例:
static void gpio_interrupt_handler(gpio_id_t id)
{
printf("GPIO %d interrupt triggered\n", id);
// 清除中断标志
bk_gpio_clear_interrupt(id);
}
void gpio_interrupt_example(void)
{
// 配置 GPIO2 为输入模式
bk_gpio_enable_input(GPIO_2);
bk_gpio_pull_up(GPIO_2);
// 配置下降沿中断
bk_gpio_set_interrupt_type(GPIO_2, GPIO_INT_TYPE_FALLING_EDGE);
// 注册中断服务函数
bk_gpio_register_isr(GPIO_2, gpio_interrupt_handler);
// 启用中断
bk_gpio_enable_interrupt(GPIO_2);
}
唤醒功能示例:
void gpio_wakeup_example(void)
{
// 配置 GPIO3 为输入模式
bk_gpio_enable_input(GPIO_3);
bk_gpio_pull_up(GPIO_3);
// 配置下降沿唤醒
bk_gpio_set_interrupt_type(GPIO_3, GPIO_INT_TYPE_FALLING_EDGE);
// 设置唤醒源
bk_gpio_set_wakeup_source(GPIO_3);
// 进入低功耗模式
// 系统将在 GPIO3 下降沿时唤醒
}
复用功能示例:
void gpio_mux_example(void)
{
// 配置 GPIO4 为 UART TX 功能
bk_gpio_set_config(GPIO_4, GPIO_CONFIG_UART_TX);
// 配置 GPIO5 为 SPI CLK 功能
bk_gpio_set_config(GPIO_5, GPIO_CONFIG_SPI_CLK);
}
低功耗保持示例:
void gpio_low_power_example(void)
{
// 设置 GPIO6 在低功耗模式下保持状态
bk_gpio_low_power_keep_status(GPIO_6, true);
// 进入低功耗模式
// GPIO6 状态将被保持
}
常见问题
GPIO 状态不正确:检查 GPIO 模式配置、上拉/下拉设置
中断未触发:确认中断类型设置、中断启用状态
唤醒失败:检查唤醒源配置、GPIO 状态
复用功能不工作:确认 GPIO 复用配置与硬件设计匹配
实战示例
外部中断按键示例(下降沿触发)
static void key_isr(gpio_id_t id) {
// 处理按键事件
bk_gpio_clear_interrupt(id);
}
bk_gpio_enable_input(GPIO_KEY);
bk_gpio_pull_up(GPIO_KEY);
bk_gpio_set_interrupt_type(GPIO_KEY, GPIO_INT_TYPE_FALLING_EDGE);
bk_gpio_register_isr(GPIO_KEY, key_isr);
bk_gpio_enable_interrupt(GPIO_KEY);
常见错误码说明
BK_ERR_GPIO_CHAN_ID:GPIO 号非法
BK_ERR_GPIO_NOT_INPUT_MODE:当前非输入模式却调用读取/中断等接口
BK_ERR_GPIO_INVALID_INT_TYPE:中断类型非法或不支持