接口讲解
GPIO初始化
/**
* @brief gpio 初始化
*
* @param[in] pin_id: 需要初始化的GPIO编号, 对应TUYA_GPIO_NUM_E枚举
* @param[in] cfg: gpio 配置
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tkl_gpio_init(TUYA_GPIO_NUM_E pin_id, CONST TUYA_GPIO_BASE_CFG_T *cfg);
TUYA_GPIO_BASE_CFG_T 中进行GPIO模式、方向和电平高低的配置。
mode参数支持如下:
- TUYA_GPIO_PULLUP 输入上拉
- TUYA_GPIO_PULLDOWN 输入下拉
- TUYA_GPIO_HIGH_IMPEDANCE 高阻输入
- TUYA_GPIO_FLOATING 浮空输入
- TUYA_GPIO_PUSH_PULL 推完输出
- TUYA_GPIO_OPENDRAIN 开漏输出
- TUYA_GPIO_OPENDRAIN_PULLUP 开漏内部上拉输出
direct参数支持如下:
- TUYA_GPIO_INPUT 输入方向
- TUYA_GPIO_OUTPUT 输出方向
level参数支持如下:
- TUYA_GPIO_LEVEL_LOW 低电平
- TUYA_GPIO_LEVEL_HIGH 高电平
GPIO反初始化
/**
* @brief gpio 反初始化
*
* @param[in] pin_id: 需要初始化的GPIO编号, 对应TUYA_GPIO_NUM_E枚举
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tkl_gpio_deinit(TUYA_GPIO_NUM_E pin_id);
外部中断操作
外部中断初始化
/**
* @brief gpio 中断操作初始化
* NOTE: 单独调用此API不会使能GPIO 中断操作,需要调用tkl_gpio_irq_enable来使能中断
*
* @param[in] pin_id: 需要初始化的GPIO编号, 对应TUYA_GPIO_NUM_E枚举
* @param[in] cfg: gpio 中断配置
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tkl_gpio_irq_init(TUYA_GPIO_NUM_E pin_id, CONST TUYA_GPIO_IRQ_T *cfg);
TUYA_GPIO_IRQ_T 配置中可以进行中断模式、回调函数以及自定义参数的配置
mode参数如下所示:
- TUYA_GPIO_IRQ_RISE 上升沿中断
- TUYA_GPIO_IRQ_FALL 下降沿中断
- TUYA_GPIO_IRQ_RISE_FALL 双边沿中断
- TUYA_GPIO_IRQ_LOW 低电平中断
- TUYA_GPIO_IRQ_HIGH 高电平中断
GPIO状态写入
/**
* @brief gpio write
*
* @param[in] pin_id: 需要操作的GPIO编号, 对应TUYA_GPIO_NUM_E枚举
* @param[in] level: GPIO需要写入的电平值
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tkl_gpio_write(TUYA_GPIO_NUM_E pin_id, TUYA_GPIO_LEVEL_E level);
level参数支持如下:
- TUYA_GPIO_LEVEL_LOW 低电平
- TUYA_GPIO_LEVEL_HIGH 高电平
GPIO状态读取
/**
* @brief gpio read
*
* @param[in] pin_id: 需要操作的GPIO编号, 对应TUYA_GPIO_NUM_E枚举
* @param[out] level: GPIO需要读取的电平值
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tkl_gpio_read(TUYA_GPIO_NUM_E pin_id, TUYA_GPIO_LEVEL_E *level);
level参数支持如下:
- TUYA_GPIO_LEVEL_LOW 低电平
- TUYA_GPIO_LEVEL_HIGH 高电平
GPIO 简单应用Demo
VOID_T app_led_init(VOID_T) //GPIO write相关操作
{
TUYA_GPIO_BASE_CFG_T led_cfg = {
.mode = TUYA_GPIO_PUSH_PULL,
.direct = TUYA_GPIO_OUTPUT,
.level = TUYA_GPIO_LEVEL_HIGH};
tkl_gpio_init(LED_PIN, &led_cfg);
set_led_status(cur_led_status);
return;
}
VOID_T set_led_status(LED_STATUS_E led_status)
{
if (LED_ON == led_status) {
tkl_gpio_write(LED_PIN, TUYA_GPIO_LEVEL_HIGH);
}
else {
tkl_gpio_write(LED_PIN, TUYA_GPIO_LEVEL_LOW);
}
cur_led_status = led_status;
return;
}
VOID_T app_key_init(VOID_T) //gpio read 相关操作
{
/* init key gpio */
TUYA_GPIO_BASE_CFG_T key_cfg = {
.mode = TUYA_GPIO_PULLUP,
.direct = TUYA_GPIO_INPUT,
.level = TUYA_GPIO_LEVEL_HIGH};
tkl_gpio_init(KEY_PIN, &key_cfg);
}
VOID_T get_key_val()
{
OPERATE_RET op_ret = OPRT_OK;
TUYA_GPIO_LEVEL_E read_level = TUYA_GPIO_LEVEL_HIGH;
UINT32_T time_start = 0, timer_end = 0;
tkl_gpio_read(KEY_PIN, &read_level); //读取GPIO电平值
if (TUYA_GPIO_LEVEL_HIGH == read_level)
{
tal_system_sleep(3);
tkl_gpio_read(KEY_PIN, &read_level);
time_start = tal_system_get_millisecond();
while (TUYA_GPIO_LEVEL_HIGH == read_level)
{
tkl_gpio_read(KEY_PIN, &read_level);
tal_system_sleep(50); //延时等待
}
timer_end = tal_system_get_millisecond(); //获取当前时间
if (timer_end - time_start >= LONE_PRESS_TIME)
{ // 长按操作
}
else if (timer_end - time_start > 20)
{ // 短按操作
}
}
}
GPIO 外部中断
#define TEST_PIN3 16 //irq
static void pin_irq_cb(void *arg)
{
tkl_log_output("pin %d irq arg[%d]\r\n",TEST_PIN3, (int)arg);
}
VOID_T gpio_irq_test(void)
{
int value = 4567;
TUYA_GPIO_IRQ_T cfg = {
.mode = TUYA_GPIO_IRQ_RISE,
.cb = pin_irq_cb,
.arg = (void*)value //callback中传递的arg参数
};
tkl_gpio_irq_init(TEST_PIN3,&cfg);
}
- 效果图: