涂鸦蓝牙SDK开发系列教程——8.Board API 说明

Posted 三明治开发社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了涂鸦蓝牙SDK开发系列教程——8.Board API 说明相关的知识,希望对你有一定的参考价值。

Board 层 API 是涂鸦抽象各芯片硬件外设,封装的一层标准接口。您可以调用这些 API 来使用相应外设,快速实现产品功能,也可以根据需要直接调用原厂外设接口。


Board 层功能模块列表如下:

名称API 文件功能说明
PINty_pin.hGPIO 外设相关函数的使用说明
PWMty_pwm.hPWM 外设相关函数的使用说明
ADCty_adc.hADC 外设相关函数的使用说明
I2Cty_i2c.hI2C 外设相关函数的使用说明
FLASHty_flash.hFlash 外设相关函数的使用说明

API Demo 获取:tuya_ble_board_api_demo


一. PIN

1.1 文件说明

API 文件

PIN 相关 API 位于 ty_pin.h 文件中,芯片平台关联的驱动代码位于 ty_pin_xxxx.c 文件中。

tuya_ble_sdk_demo
└── board
     ├── include
     |    └── ty_pin.h
     ├── xxxx                      /* xxxx 为芯片平台,如 TLSR825x */
     |    └── ty_board_xxxx        /* xxxx 为芯片平台,如 ty_board_tlsr825x */
     |         └── ty_pin_xxxx.c   /* xxxx 为芯片平台,如 ty_pin_tlsr825x.c */
     └── board.h

Demo 文件

tuya_board_api_demo 的 PIN Demo 文件结构如下:

tuya_ble_sdk_demo
├── app  /* API 应用示例 */
|    ├── include
|    |    └── ty_board_demo
|    |    |    ├── demo_config.h        /* demo 配置文件 */
|    |    |    └── ty_pin_demo.h        /* pin 模块示例代码 */
|    |    ├── tuya_ble_board_api_demo.h /* board api 示例程序入口 */
|    |    └── tuya_ble_sdk_demo.h       /* tuya_ble_sdk 应用入口 */
|    └── src
|         ├── ty_board_demo
|         |    └── ty_pin_demo.c        /* pin 模块示例代码 */
|         ├── tuya_ble_board_api_demo.c /* board api 示例程序入口 */
|         └── tuya_ble_sdk_demo.c       /* tuya_ble_sdk 应用入口 */
└── board /* 部分 API 修改示例 */

修改 demo_config.h 文件即可切换到 PIN 模块示例程序:

#define BOARD_API_DEMO          BOARD_API_PIN

1.2 API 列表

函数名称功能描述
ty_pin_init初始化引脚模式
ty_pin_set设置引脚的电平
ty_pin_get读取引脚的电平
ty_pin_control引脚相关控制
ty_pin_uninit关闭引脚模块

1.3 API 说明

ty_pin_init

函数名ty_pin_init
函数原型uint32_t ty_pin_init(uint8_t pin, ty_pin_mode_t mode);
功能概述初始化引脚模式
参数pin [in]:引脚编号
mode [in]:引脚模式,由 ty_pin_mode_t 类型定义
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值

ty_pin_set

函数名ty_pin_set
函数原型uint32_t ty_pin_set(uint8_t pin, ty_pin_level_t level);
功能概述设置引脚的电平
参数pin [in]:引脚编号
level [in]:引脚电平,由 ty_pin_level_t 类型定义
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值

ty_pin_get

函数名ty_pin_get
函数原型uint32_t ty_pin_get(uint8_t pin, ty_pin_level_t* p_level);
功能概述读取引脚的电平
参数pin [in]:引脚编号
p_level [out]:引脚电平,由 ty_pin_level_t 类型定义
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值

ty_pin_control

函数名ty_pin_control
函数原型uint32_t ty_pin_control(uint8_t pin, uint8_t cmd, void* arg);
功能概述控制引脚
参数pin [in]:引脚编号
cmd [in]:控制命令
arg [in]:命令参数
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值

ty_pin_uninit

函数名ty_pin_uninit
函数原型uint32_t ty_pin_uninit(uint8_t pin, ty_pin_mode_t mode);
功能概述设置引脚的电平
参数pin [in]:引脚编号
mode [in]:引脚模式
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值改

1.4 数据结构

ty_pin_mode_t

/* ! 与 SDK 中不一致是因为此处省略了部分代码 */
typedef enum 
    //PU  ->  pull up
    //PD  ->  pull dowm
    //FL  ->  floating
    //PP  ->  push pull
    //OD  ->  open drain
    //hiz ->  high-impedance level
    /* 输入 */
    TY_PIN_MODE_IN_PU,              /* 上拉输入 */
    TY_PIN_MODE_IN_PD,              /* 下拉输入 */
    TY_PIN_MODE_IN_FL,              /* 浮空输入 */
    /* 外部中断 */
    TY_PIN_MODE_IN_IRQ_RISE,        /* 上升沿触发 */
    TY_PIN_MODE_IN_IRQ_FALL,        /* 下降沿触发 */
    TY_PIN_MODE_IN_IRQ_RISE_FALL,   /* 双边沿触发 */
    TY_PIN_MODE_IN_IRQ_LOW,         /* 低电平触发 */
    TY_PIN_MODE_IN_IRQ_HIGH,        /* 高电平触发 */
    /* 推挽输出 */
    TY_PIN_MODE_OUT_PP_LOW,         /* 初期低电平 */
    TY_PIN_MODE_OUT_PP_HIGH,        /* 初期高电平 */
    /* 推挽输出,带上拉 */
    TY_PIN_MODE_OUT_PP_PU_LOW,      /* 初期低电平 */
    TY_PIN_MODE_OUT_PP_PU_HIGH,     /* 初期高电平 */
    /* 推挽输出,带下拉 */
    TY_PIN_MODE_OUT_PP_PD_LOW,      /* 初期低电平 */
    TY_PIN_MODE_OUT_PP_PD_HIGH,     /* 初期高电平 */
    /* 开漏输出 */
    TY_PIN_MODE_OUT_OD_LOW,         /* 初期低电平 */
    TY_PIN_MODE_OUT_OD_HIZ,         /* 初期高阻态 */
    /* 开漏输出,带上拉 */
    TY_PIN_MODE_OUT_OD_PU_LOW,      /* 初期低电平 */
    TY_PIN_MODE_OUT_OD_PU_HIGH,     /* 初期高电平 */
 ty_pin_mode_t;

ty_pin_level_t

typedef enum 
    TY_PIN_LOW = 0, /* 低电平 */
    TY_PIN_HIGH     /* 高电平 */
 ty_pin_level_t;

1.5 API 示例

以 TLSR825x 平台为例,可参考以下代码补充 PIN 模块的 API 函数,或者直接在应用代码中调用芯片原厂提供的 API 来实现相关功能。

ty_pin.h

/* ! pin的类型默认为uint8_t,需要根据芯片平台进行修改 */
uint32_t ty_pin_init(uint16_t pin, ty_pin_mode_t mode);
uint32_t ty_pin_set(uint16_t pin, ty_pin_level_t level);
uint32_t ty_pin_get(uint16_t pin, ty_pin_level_t* p_level);

ty_pin_tlsr825x.c

uint32_t ty_pin_init(uint16_t pin, ty_pin_mode_t mode)

    gpio_set_func(pin, AS_GPIO);

    if ((mode & TY_PIN_INOUT_MASK) <= TY_PIN_IN_IRQ) 
        gpio_set_input_en(pin, 1);
        gpio_set_output_en(pin, 0);
     else 
        gpio_set_input_en(pin, 0);
        gpio_set_output_en(pin, 1);
    

    switch (mode) 
    case TY_PIN_MODE_IN_PU:
        gpio_setup_up_down_resistor(pin, PM_PIN_PULLUP_10K);
        break;
    case TY_PIN_MODE_IN_PD:
        gpio_setup_up_down_resistor(pin, PM_PIN_PULLDOWN_100K);
        break;
    case TY_PIN_MODE_IN_FL:
        gpio_setup_up_down_resistor(pin, PM_PIN_UP_DOWN_FLOAT);
        break;
    case TY_PIN_MODE_OUT_PP_LOW:
        gpio_write(pin, 0);
        break;
    case TY_PIN_MODE_OUT_PP_HIGH:
        gpio_write(pin, 1);
        break;
    default:
    	break;
    

#if(GPIO_WAKEUP_MODULE_POLARITY == 1)
    cpu_set_gpio_wakeup (WAKEUP_MODULE_GPIO, Level_High, 1);
    GPIO_WAKEUP_MODULE_LOW;
#else
    cpu_set_gpio_wakeup (WAKEUP_MODULE_GPIO, Level_Low, 1);
    GPIO_WAKEUP_MODULE_HIGH;
#endif

    return 0;


uint32_t ty_pin_set(uint16_t pin, ty_pin_level_t level)

    gpio_write(pin, level);
    return 0;


uint32_t ty_pin_get(uint16_t pin, ty_pin_level_t* p_level)

    *p_level = gpio_read(pin);
    return 0;


1.6 应用示例

功能概述

按键按下 (Low),LED 点亮 (High);按键释放 (High),LED 熄灭 (Low)。

代码示例

以 TLSR825x 平台为例:

#include "ty_pin_demo.h"
#include "ty_pin.h"
#include "tuya_ble_log.h"
#include "tuya_ble_port.h"

/***********************************************************
************************micro define************************
***********************************************************/
#define KEY_PIN             GPIO_PA0
#define LED_PIN             GPIO_PD7
#define KEY_SCAN_TIME_MS    10

/***********************************************************
***********************variable define**********************
***********************************************************/
static tuya_ble_timer_t sg_pin_timer;

/***********************************************************
***********************function define**********************
***********************************************************/
/**
 * @brief pin timer callback
 * @param none
 * @return none
 */
void __pin_timer_cb(void)

    ty_pin_level_t pin_level = 0;
    ty_pin_get(KEY_PIN, &pin_level);
    ty_pin_set(LED_PIN, !pin_level);


/**
 * @brief ty_pin api demo init
 * @param none
 * @return none
 */
void ty_pin_demo_init(void)

    uint32_t res;
    /* key pin init */
    res = ty_pin_init(KEY_PIN, TY_PIN_MODE_IN_PU);
    if (res) 
        TUYA_APP_LOG_ERROR("ty_pin_init KEY_PIN failed, error code: %d", res);
        return;
    
    /* led pin init */
    res = ty_pin_init(LED_PIN, TY_PIN_MODE_OUT_PP_LOW);
    if (res) 
        TUYA_APP_LOG_ERROR("ty_pin_init KEY_PIN failed, error code: %d", res);
        return;
    
    /* timer init */
    tuya_ble_timer_create(&sg_pin_timer, KEY_SCAN_TIME_MS, TUYA_BLE_TIMER_REPEATED, (tuya_ble_timer_handler_t)__pin_timer_cb);
    tuya_ble_timer_start(sg_pin_timer);


二. PWM

2.1 文件说明

API 文件

PWM 相关 API 位于 ty_pwm.h 文件中,芯片平台关联的驱动代码位于 ty_pwm_xxxx.c 文件中。

tuya_ble_sdk_demo
└── board
     ├── include
     |    └── ty_pwm.h
     ├── xxxx                      /* xxxx 为芯片平台,如 TLSR825x */
     |    └── ty_board_xxxx        /* xxxx 为芯片平台,如 ty_board_tlsr825x */
     |         └── ty_pwm_xxxx.c   /* xxxx 为芯片平台,如 ty_pwm_tlsr825x.c */
     └── board.h

Demo 文件

tuya_board_api_demo 的 PWM Demo 文件结构如下:

tuya_ble_sdk_demo
├── app  /* API 应用示例 */
|    ├── include
|    |    └── ty_board_demo
|    |    |    ├── demo_config.h        /* demo 配置文件 */
|    |    |    └── ty_pwm_demo.h        /* pwm 模块示例代码 */
|    |    ├── tuya_ble_board_api_demo.h /* board api 示例程序入口 */
|    |    └── tuya_ble_sdk_demo.h       /* tuya_ble_sdk 应用入口 */
|    └── src
|         ├── ty_board_demo
|         |    └── ty_pwm_demo.c        /* pwm 模块示例代码 */
|         ├── tuya_ble_board_api_demo.c /* board api 示例程序入口 */
|         └── tuya_ble_sdk_demo.c       /* tuya_ble_sdk 应用入口 */
└── board /* 部分 API 修改示例 */

修改 demo_config.h 文件即可切换到 PWM 模块示例程序:

#define BOARD_API_DEMO          BOARD_API_PWM

2.2 API 列表

函数名称功能描述
ty_pwm_init初始化 PWM 模块
ty_pwm_start启动 PWM 输出
ty_pwm_stop停止 PWM 输出
ty_pwm_control控制 PWM 模块
ty_pwm_uninit关闭 PWM 模块

2.3 API 说明

ty_pwm_init

函数名ty_pwm_init
函数原型uint32_t ty_pwm_init(ty_pwm_t* p_pwm);
功能概述初始化 PWM 模块
参数p_pwm [in]:pwm 参数,由 ty_pwm_t 类型定义
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值

ty_pwm_start

函数名ty_pwm_start
函数原型uint32_t ty_pwm_start(ty_pwm_t* p_pwm);
功能概述启动 PWM 输出
参数p_pwm [in]:pwm 参数,由 ty_pwm_t 类型定义
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值

ty_pwm_stop

函数名ty_pwm_stop
函数原型uint32_t ty_pwm_stop(ty_pwm_t* p_pwm);
功能概述停止 PWM 输出
参数p_pwm [in]:pwm 参数,由 ty_pwm_t 类型定义
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值

ty_pwm_control

函数名ty_pwm_control
函数原型uint32_t ty_pwm_control(ty_pwm_t* p_pwm, uint8_t cmd, void* arg);
功能概述控制 PWM 模块
参数p_pwm [inout]:pwm 参数,由 ty_pwm_t 类型定义
cmd [in]:控制命令,由 ty_pwm_cmd_t 类型定义
arg [in]:命令参数,取决于控制命令
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值

ty_pwm_uninit

函数名ty_pwm_uninit
函数原型uint32_t ty_pwm_uninit(ty_pwm_t* p_pwm);
功能概述关闭 PWM 模块
参数p_pwm [in]:pwm 参数,由 ty_pwm_t 类型定义
返回值0:成功;其他:失败
备注可根据芯片平台按需补充或修改函数内容、参数及返回值

2.4 数据结构

ty_pwm_t

typedef struct 
    GPIO_PinTypeDef pin;            /* 引脚编号 */
    pwm_id id;                      /* PWM ID */
    uint8_t polarity;               /* 极性 */
    uint32_t freq;                  /* 周期 */
    uint8_t duty;                   /* 占空比 */
 ty_pwm_t;

ty_pwm_cmd_t

typedef enum 
    TY_PWM_CMD_SET_POLARITY = 0,    /* 极性 */
    TY_PWM_CMD_SET_FREQ,            /* 周期 */
    TY_PWM_CMD_SET_DUTY,            /* 占空比 */
 ty_pwm_cmd_t;

ty_pwm_set_polarity_t

typedef struct 
    uint8_t  polarity;              /* 极性(0-H, 1-L) */
 ty_pwm_set_polarity_t;

ty_pwm_set_freq_t

typedef struct 
    uint32_t freq;                  /* 周期(us) */
 ty_pwm_set_freq_t;

ty_pwm_set_duty_t

typedef struct 
    uint8_t  duty;                  /* 占空比(%) */
 ty_pwm_set_duty_t;

2.5 API 示例

以 TLSR825x 平台为例,可参考以下代码补充 PWM 模块的 API 函数,或者直接在应用代码中调用芯片原厂提供的 API 来实现相关功能。

ty_pwm.h

/* 根据TLSR825x的pwm通道和引脚对应关系,修改参数id为func */
typedef struct 
    GPIO_PinTypeDef pin;            /* 引脚编号 */
    GPIO_FuncTypeDef func;          /* 引脚功能 */
    uint8_t polarity;               /* 极性 */
    uint32_t freq;                  /* 周期 */
    uint8_t duty;                   /* 占空比 */
 ty_pwm_t;

ty_pwm_tlsr825x.c

/****************************************************
    PWM0   :  PA2.  PC1.  PC2.  PD5.
    PWM1   :  PA3.  PC3.
    PWM2   :  PA4.  PC4.
    PWM3   :  PB0.  PD2.
    PWM4   :  PB1.  PB4.
    PWM5   :  PB2.  PB5.
    PWM0_N :  PA0.  PB3.  PC4.	PD5.
    PWM1_N :  PC1.  PD3.
    PWM2_N :  PD4.
    PWM3_N :  PC5.
    PWM4_N :  PC0.  PC6.
    PWM5_N :  PC7.
 ****************************************************/

uint32_t ty_pwm_init(ty_pwm_t* p_pwm)

    if (p_pwm == NULL) 
        return 1;
    
    if (p_pwm->duty < 0 || p_pwm->duty > 100) 
        return 2;
    
    if (p_pwm->func < AS_PWM0 || p_pwm->func > AS_PWM5_N) 
        return 3;
    

    pwm_set_clk(CLOCK_SYS_CLOCK_HZ, CLOCK_SYS_CLOCK_HZ);
    gpio_set_func(p_pwm->pin, p_pwm->func);
    pwm_id id = (p_pwm->func < AS_PWM0_N) ? (p_pwm->func - AS_PWM0) : (p_pwm->func - AS_PWM0_N);
    pwm_set_mode(id, PWM_NORMAL_MODE);
    pwm_polo_enable(id, p_pwm->polarity);
    pwm_set_cycle_and_duty(id, (uint16_t)(p_pwm->freq * CLOCK_SYS_CLOCK_1US),
                               (uint16_t)(p_pwm->freq * CLOCK_SYS_CLOCK_1US * p_pwm->duty / 100));

    return 0;


uint32_t ty_pwm_start(ty_pwm_t* p_pwm)

    if (p_pwm == NULL) 
        return 1;
    
    if (p_pwm->duty < 0 || p_pwm->duty > 100) 
        return 2;
    
    if (p_pwm->func < AS_PWM0 || p_pwm->func > AS_PWM5_N) 
        return 3;
    

    pwm_id id = (p_pwm->func < AS_PWM0_N) ? (p_pwm->func - AS_PWM0) : (p_pwm->func - AS_PWM0_N);
    pwm_start(id);
    return 0;


uint32_t ty_pwm_stop(ty_pwm_t* p_pwm)

    if (p_pwm == NULL) 
        return 1;
    
    if (p_pwm->func < AS_PWM0 || p_pwm->func > AS_PWM5_N) 
        return 3;
    

    pwm_id id = (p_pwm->func < AS_PWM0_N) ? (p_pwm->func - AS_PWM0) : (p_pwm->func - AS_PWM0_N);
    pwm_stop(id);
    return 0;


uint32_t ty_pwm_control(ty_pwm_t* p_pwm, uint8_t cmd, void* arg)

    if ((p_pwm == NULL) || (arg == NULL)) 
        return 1;
    
    if (p_pwm->func < AS_PWM0 || p_pwm->func > AS_PWM5_N) 
        return 3;
    
    pwm_id id = (p_pwm->func < AS_PWM0_N) ? (p_pwm->func - AS_PWM0) : (p_pwm->func - AS_PWM0_N);

    switch(cmd) 
    case TY_PWM_CMD_SET_POLARITY: 
            ty_pwm_set_polarity_t* param = arg;
            p_pwm->polarity = param->polarity;
            pwm_polo_enable(id, p_pwm->polarity);
        
        break;
    case TY_PWM_CMD_SET_FREQ: 
            ty_pwm_set_freq_t* param = arg;
            p_pwm->freq = param->freq;
            pwm_set_cycle_and_duty(id, (uint16_t)(p_pwm->freq * CLOCK_SYS_CLOCK_1US),
                                       (uint16_t)(p_pwm->freq * CLOCK_SYS_CLOCK_1US * p_pwm->duty / 100));
        
        break;
    case TY_PWM_CMD_SET_DUTY: 
            ty_pwm_set_duty_t* param = arg;
            if (p_pwm->duty < 0 || p_pwm->duty > 100) 
                return 2;
            
            p_pwm->duty = param->duty;
            pwm_set_cmp(id, (uint16_t)(p_pwm->freq * CLOCK_SYS_CLOCK_1US * p_pwm->duty / 100));
        
        break;
    default:
        break;
    

    return 0;


uint32_t ty_pwm_uninit(ty_pwm_t* p_pwm)

    uint32_t res = ty_pwm_stop(p_pwm);
    if (res) 
        return res;
    
    gpio_set_func(p_pwm->pin, AS_GPIO);
    return 0;


2.6 应用示例

功能概述

初期输出周期 500us,占空比 50%,极性高电平的 PWM 波形;2s 后,更新占空比为 80%;再 2s 后,更新周期为 800us;再 2s 后,更新极性为低电平;再 2s 后,停止 PWM 输出并关闭 PWM 模块。

代码示例

以 TLSR825x 平台为例:

#include "ty_pwm_demo.h"
#include "ty_pwm.h"
#include "tuya_ble_log.h"
#include "tuya_ble_port.h"

/***********************************************************
************************micro define************************
***********************************************************/
#define PWM_PIN             GPIO_PB5
#define PWM_FUNC            AS_PWM5

#define PWM_POL             0
#define PWM_POL_UPDATE      1
#define PWM_FREQ            500
#define PWM_FREQ_UPDATE     800
#define PWM_DUTY            50
涂鸦蓝牙SDK开发系列教程——6.固件升级

涂鸦蓝牙SDK开发系列教程——3.环境搭建

涂鸦蓝牙SDK开发系列教程——7.SDK API 说明

涂鸦蓝牙SDK开发系列教程——5.应用开发

涂鸦蓝牙SDK开发系列教程——2.产品创建

涂鸦蓝牙SDK开发系列教程——4.烧录授权