W800开发套件鸿蒙系统教程

W800开发套件鸿蒙系统教程


3.1.1 GPIO的使用

<p>我们这里的w800_liteos_sdk中使用的例子均来自联盛德官方SDK中的demo,即demo目录下的源码。gpio操作的示例源码位于<code>wm_gpio_demo.c</code>文件中。</p> <p>在<code>main.c</code>文件中打开<code>DEMO_CONSOLE</code>宏定义,使得程序进入demo示例流程执行;如果将宏定义<code>DEMO_CONSOLE</code>设置为0,则进入<code>switch_template_main</code>,这是Cozylife的主函数,将设备初始化为一个Cozylife的远程开关使用,详细Cozylife介绍请参考Cozylife一章。</p> <pre><code class="language-c">void UserMain(void) { printf("\n User task \n"); #if DEMO_CONSOLE CreateDemoTask(); #else switch_template_main(); #endif }</code></pre> <hr /> <p>GPIO的例子的运行需要修改<code>DEMO_GPIO</code>宏定义为1,在<code>wm_demo.h</code>头文件中设置如下:</p> <pre><code class="language-c">//demo console #define DEMO_CONSOLE DEMO_ON //gpio demo #define DEMO_GPIO (DEMO_ON &amp;&amp; DEMO_CONSOLE)</code></pre> <p>编译固件下载运行后,串口输出如下内容:</p> <center>![](https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6023fa33652386980a75cd9a1eed5a5a)</center> <p>在UpgradeTools(即之前介绍的固件烧录工具)下方串口发送数据框内输入:<code>t-gpio()</code>,点击“发送”按钮,即可执行GPIO操作,如下图:</p> <center>![](https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=12017482ae87023771b20181fa2abb33)</center> <p>执行gpio操作后输出结果如下:</p> <center>![](https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d163a15b00bf1bf983ac17137518bc45)</center> <p>代码依次对PB6和PB7管脚进行写入读取操作,下面是源码片段:</p> <pre><code class="language-c">//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("\ngpio%c[%d] default value==[%d]\n", (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("\ngpio%c[%d] floating high value==[%d]\n", (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("\ngpio%c[%d] floating low value==[%d]\n", (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("\ngpio%c[%d] pullhigh value==[%d]\n", (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("\ngpio%c[%d] pullhigh value==[%d]\n", (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("\ngpio%c[%d] pulllow value==[%d]\n", (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("\ngpio%c[%d] pulllow value==[%d]\n", (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; }</code></pre> <p>使用某个io时首先需要设置<code>tls_gpio_cfg(gpio_pin, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);</code>,第一个参数是管脚号,第二个是作为输入或输出方式,第三个是io的属性</p>

页面列表

ITEM_HTML