基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制PWM外设

描述

1、案例简介

本案例是在小凌派-RK2206开发板上使用IoT库PWM接口,进行PWM编程开发。

例程将创建一个任务,每隔5秒将PWM0~10依次启用,输出1000Hz。

例程源代码:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/tree/master/vendor/lockzhiner/rk2206/samples/b16_iot_pwm

2、基础知识

PWM在日常设备中非常常见,以下我们将演示IoT库的PWM接口如何进行PWM控制。

2.1、头文件

base/iot_hardware/peripheral/interfaces/kits/iot_pwm.h

2.2、初始化PWM设备:IoTPwmInit

unsigned int IoTPwmInit(unsigned int port);

描述:

初始化PWM设备。

参数:

参数类型描述
portunsigned intPWM端口号

其中,port对应于如下表所示:

portGPIO
0GPIO_PB4
1GPIO_PB5
2GPIO_PB6
3GPIO_PC0
4GPIO_PC1
5GPIO_PC2
6GPIO_PC3
7GPIO_PC4
8GPIO_PC5
9GPIO_PC6
10GPIO_PC7

返回值:

返回值描述
IOT_SUCCESS成功
IOT_FAILURE失败

实现:

hal_iot_pwm.c文件在device/rockchip/rk2206/adapter/hals/iot_hardware/wifiiot_lite目录下。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

unsigned int IoTPwmInit(unsigned int port){    unsigned int ret = 0;    if (port >= EPWMDEV_MAX) {        PRINT_ERR("port(%d) >= EPWMDEV_MAX(%d)\n", port, EPWMDEV_MAX);        return IOT_FAILURE;    }    PinctrlSet(m_pwm_bus_info[port].pwm_bus.pwm.gpio,        m_pwm_bus_info[port].pwm_bus.pwm.func,        m_pwm_bus_info[port].pwm_bus.pwm.type,        m_pwm_bus_info[port].pwm_bus.pwm.drv);    PwmIoInit(m_pwm_bus_info[port].pwm_bus);    LzPwmInit(m_pwm_bus_info[port].port);    return IOT_SUCCESS;}

2.3、取消初始化PWM设备:IoTPwmDeinit

unsigned int IoTPwmDeinit(unsigned int port);

描述:

取消初始化PWM设备。

参数:

参数类型描述
portunsigned intPWM端口号

其中,port对应于如下表所示:

portGPIO
0GPIO_PB4
1GPIO_PB5
2GPIO_PB6
3GPIO_PC0
4GPIO_PC1
5GPIO_PC2
6GPIO_PC3
7GPIO_PC4
8GPIO_PC5
9GPIO_PC6
10GPIO_PC7

返回值:

返回值描述
IOT_SUCCESS成功
IOT_FAILURE失败

实现:

hal_iot_pwm.c文件在device/rockchip/rk2206/adapter/hals/iot_hardware/wifiiot_lite目录下。

unsigned int IoTPwmDeinit(unsigned int port)
{
    if (port >= EPWMDEV_MAX) {
        PRINT_ERR("port(%d) >= EPWMDEV_MAX(%d)\n"portEPWMDEV_MAX);
        return IOT_FAILURE;
    }

    LzGpioDeinit(m_pwm_bus_info[port].pwm_bus.pwm.gpio);

    LzPwmDeinit(m_pwm_bus_info[port].port);
  
    return IOT_SUCCESS;
}

2.4、开始PWM信号输出:IoTPwmStart

unsigned int IoTPwmStart(unsigned int portunsigned short dutyunsigned int freq);

描述:

开始PWM信号输出。

参数:

参数类型描述
portunsigned intPWM端口号
dutyunsigned short高电平的占空比,范围为1~99
frequnsigned int频率

其中,port对应于如下表所示:

portGPIO
0GPIO_PB4
1GPIO_PB5
2GPIO_PB6
3GPIO_PC0
4GPIO_PC1
5GPIO_PC2
6GPIO_PC3
7GPIO_PC4
8GPIO_PC5
9GPIO_PC6
10GPIO_PC7

返回值:

返回值描述
IOT_SUCCESS成功
IOT_FAILURE失败

实现:

hal_iot_pwm.c文件在device/rockchip/rk2206/adapter/hals/iot_hardware/wifiiot_lite目录下。

unsigned int IoTPwmStart(unsigned int portunsigned short dutyunsigned int freq)
{
#define DUTY_MIN        1
#define DUTY_MAX        99
#define SEC_TO_NSEC     (1000000000UL)
    unsigned int duty_ns;
    unsigned int cycle_ns;
  
    if (port >= EPWMDEV_MAX) {
        PRINT_ERR("port(%d) >= EPWMDEV_MAX(%d)\n"portEPWMDEV_MAX);
        return IOT_FAILURE;
    }
    if ((duty < DUTY_MIN|| (DUTY_MAX < duty)) {
        PRINT_ERR("duty(%d) out of the range(%d ~ %d)\n"dutyDUTY_MINDUTY_MAX);
        return IOT_FAILURE;
    }
    if (freq == 0) {
        PRINT_ERR("freq(%d) is invalid!\n"freq);
        return IOT_FAILURE;
    }
    if (freq > SEC_TO_NSEC) {
        PRINT_ERR("freq(%d) > SEC_TO_NSEC(%d)\n"freqSEC_TO_NSEC);
        return IOT_FAILURE;
    }

    cycle_ns = SEC_TO_NSEC / freq;
    duty_ns = cycle_ns * duty / 100;

    LzPwmStart(m_pwm_bus_info[port].portduty_nscycle_ns);

    return IOT_SUCCESS;
}

2.5、停止PWM信号输出:IoTPwmStop

unsigned int IoTPwmStop(unsigned int port);

描述:

停止PWM信号输出。

参数:

参数类型描述
portunsigned intPWM端口号

其中,port对应于如下表所示:

portGPIO
0GPIO_PB4
1GPIO_PB5
2GPIO_PB6
3GPIO_PC0
4GPIO_PC1
5GPIO_PC2
6GPIO_PC3
7GPIO_PC4
8GPIO_PC5
9GPIO_PC6
10GPIO_PC7

返回值:

返回值描述
IOT_SUCCESS成功
IOT_FAILURE失败

实现:

hal_iot_pwm.c文件在device/rockchip/rk2206/adapter/hals/iot_hardware/wifiiot_lite目录下。

unsigned int IoTPwmStop(unsigned int port)
{
    if (port >= EPWMDEV_MAX) {
        PRINT_ERR("port(%d) >= EPWMDEV_MAX(%d)\n"portEPWMDEV_MAX);
        return IOT_FAILURE;
    }

    LzPwmStart(m_pwm_bus_info[port].port00);

    return IOT_SUCCESS;
}

3、程序设计

在pwm_example函数中,创建一个任务。

void pwm_example()
{
    unsigned int thread_id;
    TSK_INIT_PARAM_S task = {0};
    unsigned int ret      = LOS_OK;

    task.pfnTaskEntry = (TSK_ENTRY_FUNC)pwm_thread;
    task.uwStackSize  = 2048;
    task.pcName       = "pwm_thread";
    task.usTaskPrio   = 20;
    ret               = LOS_TaskCreate(&thread_id&task);
    if (ret != LOS_OK) {
        printf("Falied to create pwm_thread ret:0x%x\n"ret);
        return;
    }
}

pwm_thread任务中调用IOT库的PWM接口控制PWM。

void pwm_thread()
{
    unsigned int ret;
    /* PWM端口号对应于参考文件:
     * device/rockchip/rk2206/adapter/hals/iot_hardware/wifiiot_lite/hal_iot_pwm.c
     */
    unsigned int port = 0;

    while (1) {
        printf("===========================\n");
        printf("PWM(%d) Init\n"port);
        ret = IoTPwmInit(port);
        if (ret != 0) {
            printf("IoTPwmInit failed(%d)\n");
            continue;
        }

        printf("PWM(%d) Start\n"port);
        ret = IoTPwmStart(port501000);
        if (ret != 0) {
            printf("IoTPwmStart failed(%d)\n");
            continue;
        }

        LOS_Msleep(5000);

        printf("PWM(%d) end\n"port);
        ret = IoTPwmStop(port);
        if (ret != 0) {
            printf("IoTPwmStop failed(%d)\n");
            continue;
        }

        ret = IoTPwmDeinit(port);
        if (ret != 0) {
            printf("IoTPwmInit failed(%d)\n");
            continue;
        }

        printf("\n");

        port++;
        if (port >= 11) {
            port = 0;
        }
    }
}

4、编译调试

修改 vendor/lockzhiner/rk2206/sample 路径下 BUILD.gn 文件,指定 iot_pwm_example 参与编译。

"./b16_iot_pwm:iot_pwm_example",

修改 device/lockzhiner/rk2206/sdk_liteos 路径下 Makefile 文件,添加 -liot_pwm_example 参与编译。

hardware_LIBS = -lhal_iothardware -lhardware -lshellcmd -liot_pwm_example

5、运行结果

示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,任务每隔5s控制不同PWM输出。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

entering kernel init...hilog will init.[MAIN:D]Main: LOS_Start ...Entering schedulerOHOS # hiview init success.===========================PWM(0) Init[GPIO:D]LzGpioInit: id 12 is initialized successfullyPWM(0) StartPWM(0) end[GPIO:D]LzGpioDeinit: id 12 is released successfully===========================PWM(1) Init[GPIO:D]LzGpioInit: id 13 is initialized successfullyPWM(1) StartPWM(1) end[GPIO:D]LzGpioDeinit: id 13 is released successfully...


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分