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 && DEMO_CONSOLE)</code></pre>
<p>编译固件下载运行后,串口输出如下内容:</p>
<center></center>
<p>在UpgradeTools(即之前介绍的固件烧录工具)下方串口发送数据框内输入:<code>t-gpio()</code>,点击“发送”按钮,即可执行GPIO操作,如下图:</p>
<center></center>
<p>执行gpio操作后输出结果如下:</p>
<center></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 <= 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 >= WM_IO_PB_00) ?'B':'A', (gpio_pin >= 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 >= WM_IO_PB_00) ? 'B':'A', (gpio_pin >= 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 >= WM_IO_PB_00) ? 'B':'A', (gpio_pin >= 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 >= WM_IO_PB_00) ?'B':'A', (gpio_pin >= 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 >= WM_IO_PB_00) ? 'B':'A', (gpio_pin >= 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 >= WM_IO_PB_00) ?'B':'A', (gpio_pin >= 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 >= WM_IO_PB_00) ? 'B':'A', (gpio_pin >= 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>