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