W800开发套件鸿蒙系统教程

W800开发套件鸿蒙系统教程


3.1.1 GPIO的使用

我们这里的w800_liteos_sdk中使用的例子均来自联盛德官方SDK中的demo,即demo目录下的源码。gpio操作的示例源码位于wm_gpio_demo.c文件中。

main.c文件中打开DEMO_CONSOLE宏定义,使得程序进入demo示例流程执行;如果将宏定义DEMO_CONSOLE设置为0,则进入switch_template_main,这是Cozylife的主函数,将设备初始化为一个Cozylife的远程开关使用,详细Cozylife介绍请参考Cozylife一章。

void UserMain(void)
{
    printf("\n User task \n");

#if DEMO_CONSOLE
    CreateDemoTask();
#else 
    switch_template_main();
#endif

}

GPIO的例子的运行需要修改DEMO_GPIO宏定义为1,在wm_demo.h头文件中设置如下:

//demo console
#define DEMO_CONSOLE                DEMO_ON

//gpio demo
#define DEMO_GPIO                   (DEMO_ON && DEMO_CONSOLE)

编译固件下载运行后,串口输出如下内容:

<center></center>

在UpgradeTools(即之前介绍的固件烧录工具)下方串口发送数据框内输入:t-gpio(),点击“发送”按钮,即可执行GPIO操作,如下图:

<center></center>

执行gpio操作后输出结果如下:

<center></center>

代码依次对PB6和PB7管脚进行写入读取操作,下面是源码片段:

//gpio 测试程序
int gpio_demo(void)
{
    u16 gpio_pin;
    u16 ret;

    //测试gpioB 6,7
    for(gpio_pin = WM_IO_PB_06; gpio_pin &lt;= WM_IO_PB_07; gpio_pin ++)
    {
        tls_gpio_cfg(gpio_pin, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);
        ret = tls_gpio_read(gpio_pin);  /*先读默认状态*/
        printf(&quot;\ngpio%c[%d] default value==[%d]\n&quot;, (gpio_pin &gt;= WM_IO_PB_00) ?'B':'A', (gpio_pin &gt;= WM_IO_PB_00) ?(gpio_pin - WM_IO_PB_00):gpio_pin,ret);

        /*During gpio's floating attribute, output high or low test*/
        tls_gpio_cfg(gpio_pin, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
        tls_gpio_write(gpio_pin,1);         /*写高*/
        ret = tls_gpio_read(gpio_pin);
        printf(&quot;\ngpio%c[%d] floating high value==[%d]\n&quot;, (gpio_pin &gt;= WM_IO_PB_00) ? 'B':'A', (gpio_pin &gt;= WM_IO_PB_00) ?(gpio_pin - WM_IO_PB_00):gpio_pin,ret);

        tls_gpio_cfg(gpio_pin, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
        tls_gpio_write(gpio_pin,0);         /*写低*/
        ret = tls_gpio_read(gpio_pin);
        printf(&quot;\ngpio%c[%d] floating low value==[%d]\n&quot;, (gpio_pin &gt;= WM_IO_PB_00) ? 'B':'A', (gpio_pin &gt;= WM_IO_PB_00) ?(gpio_pin - WM_IO_PB_00):gpio_pin,ret);

        /*During gpio's pullup attribute, output high or low test*/
        tls_gpio_cfg(gpio_pin, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLHIGH);
        tls_gpio_write(gpio_pin,1);         /*写高*/
        ret = tls_gpio_read(gpio_pin);
        printf(&quot;\ngpio%c[%d] pullhigh value==[%d]\n&quot;, (gpio_pin &gt;= WM_IO_PB_00) ?'B':'A', (gpio_pin &gt;= WM_IO_PB_00) ?(gpio_pin - WM_IO_PB_00):gpio_pin,ret);

        tls_gpio_cfg(gpio_pin, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLHIGH);
        tls_gpio_write(gpio_pin,0);         /*写低*/
        ret = tls_gpio_read(gpio_pin);
        printf(&quot;\ngpio%c[%d] pullhigh value==[%d]\n&quot;, (gpio_pin &gt;= WM_IO_PB_00) ? 'B':'A', (gpio_pin &gt;= WM_IO_PB_00) ?(gpio_pin - WM_IO_PB_00):gpio_pin,ret);

        /*During gpio's pulldown attribute, output high or low test*/
        tls_gpio_cfg(gpio_pin, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLLOW);
        tls_gpio_write(gpio_pin,1);         /*写高*/
        ret = tls_gpio_read(gpio_pin);
        printf(&quot;\ngpio%c[%d] pulllow value==[%d]\n&quot;, (gpio_pin &gt;= WM_IO_PB_00) ?'B':'A', (gpio_pin &gt;= WM_IO_PB_00) ?(gpio_pin - WM_IO_PB_00):gpio_pin,ret);

        tls_gpio_cfg(gpio_pin, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLLOW);
        tls_gpio_write(gpio_pin,0);         /*写低*/
        ret = tls_gpio_read(gpio_pin);
        printf(&quot;\ngpio%c[%d] pulllow value==[%d]\n&quot;, (gpio_pin &gt;= WM_IO_PB_00) ? 'B':'A', (gpio_pin &gt;= WM_IO_PB_00) ?(gpio_pin - WM_IO_PB_00):gpio_pin,ret);

    }

    return WM_SUCCESS;
}

使用某个io时首先需要设置tls_gpio_cfg(gpio_pin, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);,第一个参数是管脚号,第二个是作为输入或输出方式,第三个是io的属性

页面列表

ITEM_HTML