GPIO

更新时间:2022-11-24 09:20:18下载pdf

API 列表

函数名称 功能描述
gpio_raw_init 配置GPIO函数
gpio_raw_input_read_status 读取输入 GPIO状态
gpio_raw_output_write_status 改变GPIO写入状态
gpio_output_init GPIO口输出初始化
gpio_button_init GPIO口输入初始化

API 说明

gpio_raw_init

函数原型

extern void gpio_raw_init(gpio_config_t pin);

参数说明

参数名称 参数类型 说明
pin gpio_config_t gpio_config_t 枚举中的值

gpio_raw_input_read_status

函数原型

extern uint8_t gpio_raw_input_read_status( GPIO_PORT_T port, GPIO_PIN_T pin);;

参数说明

参数名称 参数类型 说明
port GPIO_PORT_T GPIO_PORT_T 枚举中的值
pin GPIO_PIN_T GPIO_PIN_T 枚举中的值

gpio_raw_output_write_status

函数原型

extern void gpio_raw_output_write_status(  GPIO_PORT_T port, GPIO_PIN_T pin, uint8_t value);

参数说明

参数名称 参数类型 说明
port GPIO_PORT_T GPIO_PORT_T 枚举中的值
pin GPIO_PIN_T GPIO_PIN_T 枚举中的值
pin uint8_t 0为低电平,1为高电平

gpio_output_init

函数原型

void gpio_output_init(gpio_config_t *config, uint8_t sum);

参数说明

参数名称 参数类型 说明
*config gpio_config_t IO口配置信息
sum uint8 IO配置信息组数

gpio_button_init

函数原型

void gpio_button_init(gpio_config_t *config, uint8_t sum, uint32_t jitter_time, key_func_t key_func);

参数说明

参数名称 参数类型 说明
*config gpio_config_t IO口配置信息
sum uint8 IO配置信息组数
jitter_time uint32_t 按键防反跳时间
key_func key_func_t 按键中断回调函数

结构体说明

GPIO_PORT_T

结构体原型

//通用GPIO port口定义;
typedef enum {
    PORT_A = 0x00,
    PORT_B,
    PORT_C,
    PORT_D,
    PORT_E,
    PORT_F,
    PORT_H,
    PORT_I,
    PORT_J,
    PORT_K
}GPIO_PORT_T;

GPIO_PIN_T

结构体原型

//通用GPIO pin口定义
typedef enum {
    PIN_0 = 0x00,
    PIN_1,
    PIN_2,
    PIN_3,
    PIN_4,
    PIN_5,
    PIN_6,
    PIN_7,
    PIN_8,
    PIN_9,
    PIN_10,
    PIN_11,
    PIN_12,
    PIN_13,
    PIN_14,
    PIN_15,
}GPIO_PIN_T;

GPIO_MODE_T

结构体原型

//通用GPIO输入输出模式定义
typedef enum {
    GPIO_MODE_INPUT_HIGH_IMPEDANCE = 0,
    GPIO_MODE_INPUT_PULL,
    GPIO_MODE_OUTPUT_PP,
    GPIO_MODE_OUTPUT_OD,
    GPIO_MODE_OUTPUT_OD_PULL_UP,
    GPIO_MODE_OUTPUT_OD_PULL_DOWN,
}GPIO_MODE_T;

gpio_config_t;

结构体原型

//GPIO配置
typedef struct {
    GPIO_PORT_T port;//
    GPIO_PIN_T pin;//
    GPIO_MODE_T mode;// 输入输出模式
    GPIO_DOUT_T out;// 输出电平
    GPIO_LEVEL_T drive_flag; //什么电平有效
} gpio_config_t;

GPIO 使用例程

hal_gpio.h 文件有详细的接口定义,此章节通过一个例子来展示使用方法。

基本 GPIO 使用

#define LED_1_PORT  PORT_A
#define LED_1_PIN   PIN_4
#define LED_1_MODE  GPIO_MODE_OUTPUT_PP ///< 设置成输出模式
#define LED_1_DOUT  GPIO_DOUT_LOW       ///< 第一次初始化输出默认电平
#define LED_1_DRIVE GPIO_DOUT_HIGH      ///< 输出高有效,高级用法时有用
 
#define KEY_1_PORT  PORT_A
#define KEY_1_PIN   PIN_3
#define KEY_1_MODE  GPIO_MODE_INPUT_PULL ///< 输入上拉或者下拉,通过KEY_1_DOUT来确定
#define KEY_1_DOUT  GPIO_DOUT_HIGH       ///< 输入上拉
#define KEY_1_DRIVE GPIO_LEVEL_LOW       ///< 低有效,高级用法时有用
 
static void __gpio_int_func_t(GPIO_PORT_T port, GPIO_PIN_T pin)
{
    uint8_t vol_level = gpio_raw_input_read_status(KEY_1_PORT, KEY_1_PIN); ///< 读取输入电平
}
 
static void gpio_demo(void)
{
    const gpio_config_t gpio_ouput_config = {
        LED_1_PORT, LED_1_PIN, LED_1_MODE, LED_1_DOUT, LED_1_DRIVE,
    };  
 
    const gpio_config_t gpio_input_config = {
        KEY_1_PORT, KEY_1_PIN, KEY_1_MODE, KEY_1_DOUT, KEY_1_DRIVE,
    };
 
    gpio_raw_init(gpio_ouput_config);       ///< 设置PA4为输出模式,默认输出低
    
    gpio_raw_output_write_status(LED_1_PORT, LED_1_PIN, 1); ///< 改变输出电平到高
    
    gpio_raw_init(gpio_inputput_config);    ///< 设置PA3为输入模式,输入上拉,非中断模式
    gpio_int_register(&gpio_inputput_config, __gpio_int_func_t); ///< 设置PA3为输入模式,输入上拉,下降沿中断模式
}

高级 GPIO 使用


#define LED_1_PORT  PORT_A
#define LED_1_PIN   PIN_4
#define LED_1_MODE  GPIO_MODE_OUTPUT_PP ///< 设置成输出模式
#define LED_1_DOUT  GPIO_DOUT_LOW       ///< 第一次初始化输出默认电平
#define LED_1_DRIVE GPIO_DOUT_HIGH      ///< 输出高有效,高级用法时有用
 
#define LED_2_PORT  PORT_D
#define LED_2_PIN   PIN_15
#define LED_2_MODE  GPIO_MODE_OUTPUT_PP ///< 设置成输出模式
#define LED_2_DOUT  GPIO_DOUT_LOW       ///< 第一次初始化输出默认电平
#define LED_2_DRIVE GPIO_DOUT_HIGH      ///< 输出高有效,高级用法时有用
 
#define KEY_1_PORT  PORT_A
#define KEY_1_PIN   PIN_3
#define KEY_1_MODE  GPIO_MODE_INPUT_PULL ///< 输入上拉或者下拉,通过KEY_1_DOUT来确定
#define KEY_1_DOUT  GPIO_DOUT_HIGH       ///< 输入上拉
#define KEY_1_DRIVE GPIO_LEVEL_LOW       ///< 低有效,高级用法时有用
 
#define KEY_2_PORT  PORT_A
#define KEY_2_PIN   PIN_5
#define KEY_2_MODE  GPIO_MODE_INPUT_PULL ///< 输入上拉或者下拉,通过KEY_1_DOUT来确定
#define KEY_2_DOUT  GPIO_DOUT_HIGH       ///< 输入上拉
#define KEY_2_DRIVE GPIO_LEVEL_LOW       ///< 低有效,高级用法时有用
 
#define KEY_1_INDEX 0   ///< 初始化数组的索引
#define KEY_2_INDEX 1
 
#define LED_1_INDEX 0   ///< 初始化数组的索引
#define LED_2_INDEX 1
 
static void __dev_key_handle(uint32_t key_id, key_st_t key_st, uint32_t push_time)
{
    switch(key_id) {
        case KEY_1_INDEX: {
            if(key_st == KEY_ST_PUSH) { ///< 按钮处于按下状态
                if(push_time == 3000) { ///< 按钮按下持续了3000ms,后让LED2 开始闪烁
                     dev_led_start_blink(LED_2_INDEX, 500, 500, DEV_LED_BLINK_FOREVER, DEV_IO_OFF); ///< LED1输出500ms高,300ms低,交替输出,让灯闪烁
                }
            }
            else {
                if(push_time < 3000) { ///< 按钮按下持续了不到3000ms,做短按处理
                    //TODO:
                }
                else {
                    dev_led_stop_blink(LED_2_INDEX, DEV_IO_OFF); ///< LED2停止闪烁并灭掉
                    //TODO:
                }
            }
            break;
        }
        
        case KEY_2_INDEX: {
            //TODO:
            break;
        }
        
        default: {
            break;
        }
    }
}
 
static void gpio_demo(void)
{
    gpio_config_t gpio_ouput_config[] = {
        {LED_1_PORT, LED_1_PIN, LED_1_MODE, LED_1_DOUT, LED_1_DRIVE},
        {LED_2_PORT, LED_2_PIN, LED_2_MODE, LED_2_DOUT, LED_2_DRIVE},
    };  
 
    gpio_config_t gpio_input_config[] = {
        {KEY_1_PORT, KEY_1_PIN, KEY_1_MODE, KEY_1_DOUT, KEY_1_DRIVE},
        {KEY_2_PORT, KEY_2_PIN, KEY_2_MODE, KEY_2_DOUT, KEY_2_DRIVE},
    };
 
    gpio_button_init((gpio_config_t *)gpio_input_config, get_array_len(gpio_input_config), 50, __dev_key_handle); ///< 按钮初始化,过滤50ms抖动
    gpio_output_init((gpio_config_t *)gpio_ouput_config, get_array_len(gpio_ouput_config)); ///输出初始化,可以用更高级的函数来控制
 
    dev_led_start_blink(LED_1_INDEX, 500, 300, DEV_LED_BLINK_FOREVER, DEV_IO_OFF); ///< LED1输出500ms高,300ms低,交替输出,让灯闪烁
}