ML302 共用22个可用的GPIO口,详细定义见 [sdk_root]/inc/cm/cm_gpio.h
文件中的 cm_gpio_id_t
结构体。
typedef enum {
CM_GPIO_0,//可用
CM_GPIO_1,//可用
CM_GPIO_2,//可用
CM_GPIO_3,//可用
CM_GPIO_4,//可用
CM_GPIO_5,//可用
CM_GPIO_6,
CM_GPIO_7,
CM_GPIO_8,
CM_GPIO_9,//可用
CM_GPIO_10,
CM_GPIO_11,//可用
CM_GPIO_12,//可用
CM_GPIO_13,
CM_GPIO_14,//可用
CM_GPIO_15,//可用
CM_GPIO_16,
CM_GPIO_17,//可用
CM_GPIO_18,
CM_GPIO_19,//可用
CM_GPIO_20,//可用
CM_GPIO_21,//可用
CM_GPIO_22,//可用
CM_GPIO_23,//可用
CM_GPIO_24,//可用
CM_GPIO_25,//可用
CM_GPIO_26,//可用
CM_GPIO_27,//可用
CM_GPIO_28,//可用
CM_GPIO_29,
CM_GPIO_30,
CM_GPIO_31,
CM_GPIO_END,
}cm_gpio_id_t;
GPIO初始化配置之前要先填充结构体 cm_gpio_cfg_t
:
typedef struct{
cm_gpio_id_t id; /// GPIO号
cm_gpio_dir_t dir; // GPIO方向
unsigned char irq_enable; //中断使能
unsigned char level_or_edge; // 边沿触发
unsigned char rising; // 高电平触发
unsigned char falling; // 低电平触发
cm_gpio_cb cb; // 中断回调函数
void * param; // 其他自定义参数
}cm_gpio_cfg_t;
GPIO 中断回调函数定义为:
void gpio_irq_cb(void *param)
{
}
填充好结构体 cm_gpio_cfg_t
后需调用函数 int cm_gpio_init(cm_gpio_cfg_t *cfg);
来初始化GPIO。GPIO的去初始化调用函数 void cm_gpio_deinit(cm_gpio_id_t gpio);
即可。
下面以 CM_GPIO_4
为例演示GPIO的输入、输出以及中断功能。
1. GPIO输出
void gpio_write_test(void)
{
cm_gpio_cfg_t cfg; // 定义GPIO初始化配置结构体
cfg.id = CM_GPIO_4; // 设置管脚号
cfg.dir = CM_GPIO_OUT; // 设置GPIO方向为输出
cfg.irq_enable = 0; // 禁止GPIO中断
cm_gpio_init(&cfg); // GPIO设置初始化
cm_gpio_pull_config(cfg.id, CM_GPIO_PULL_UP); //设置引脚为上拉
cm_gpio_write(cfg.id,CM_GPIO_HIGH); // 输出高电平
}
2. GPIO输入
int gpio_write_test(void)
{
int gpio_val = 0;
cm_gpio_cfg_t cfg; // 定义GPIO初始化配置结构体
cfg.id = CM_GPIO_4; // 设置管脚号
cfg.dir = CM_GPIO_IN; // 设置GPIO方向为输入
cfg.irq_enable = 0; // 禁止GPIO中断
cm_gpio_init(&cfg); // GPIO设置初始化
cm_gpio_pull_config(cfg.id, CM_GPIO_PULL_UP); //设置引脚为下拉
gpio_val = cm_gpio_read(cfg.id); // 读取管脚输入
return gpio_val;
}
3. GPIO中断
int test_gpio = 0;
// GPIO 中断回调函数
void gpio_irq_cb(void *param)
{
cm_printf("[GPIO_IRQ]%s:%d INTERRUPT\n",param, test_gpio);
}
void gpio_irq_test(void)
{
cm_gpio_cfg_t cfg; // 定义GPIO初始化配置结构体
cfg.id = CM_GPIO_4; // 设置管脚号
test_gpio = cfg.id;
cfg.dir = CM_GPIO_IN; // 设置GPIO方向为输入
cfg.irq_enable = 1; // 使能GPIO中断
// 设置触发类型
cfg.level_or_edge = 0;
cfg.rising = 1;
cfg.falling = 1;
cfg.cb= gpio_irq_cb; // 调用中断回调函数
cfg.param = "GPIO"; // 其他自定义参数
cm_gpio_init(&cfg); // GPIO设置初始化
cm_gpio_pull_config(cfg.id, CM_GPIO_PULL_UP); //设置引脚为下拉
}