风清扬_emKuO6 · 2022年01月04日

【XR806开发板试用】使用指示灯指示wifi连接状态

近期有幸申请到XR806开发板的试用,从拿到板子烧录编译好的镜像以后,就一直在忙,今天临时抽空做了一个小测试:使用指示灯指示wifi连接状态。

STA模式控制代码

XR806开发板提供了一系列控制wifi的控制台命令:

hm net sta enable:使能STA模式
hm net sta scan:搜索周边热点,并返回搜索到的热点。
hm net sta connect < ssid > < psk >:连接指定热点,ssid表示要连接的wifi名称,psk表示连接WiFi需要填充的密钥
hm net sta disconnect:断开wifi连接
hm net sta disable:退出STA模式

对应的代码在device/xradio/xr806/adapter/console/src/cmd\\\_hm\\\_net\\\_sta.c文件。
上述命令对应的实现函数如下:

enable       --> cmd_net_sta_enable_exec  
scan         --> cmd_net_scan_once_exec  
connect      --> cmd_net_connect_exec  
disconnect   --> cmd_net_disconnect_exec  
disable      --> cmd_net_sta_disable_exec

实现思路

实现思路比较简单:

  1. 当使能STA模式时,初始化GPIO,并把GPIO配置为Output模式
  2. 当禁用STA模式时,deinit GPIO
  3. 使用connect命令连接WiFi成功后,创建并启用一个线程,这个线程会间隔进行点灯、关灯的动作,表示WiFi此时处理连接状态
  4. 使用disconnect命令关闭WiFi连接后,销毁创建的闪灯线程

代码实现

diff --git a/xr806/adapter/console/src/cmd_hm_net_sta.c b/xr806/adapter/console/src/cmd_hm_net_sta.c
index e18cfce..e5a40f4 100755
--- a/xr806/adapter/console/src/cmd_hm_net_sta.c
+++ b/xr806/adapter/console/src/cmd_hm_net_sta.c
@@ -33,10 +33,15 @@
 #include "common/cmd/cmd.h"
 #include "wifi_device.h"
 #include "cmd_hm_net_ap.h"
+#include "iot_gpio.h"
+
+#define GPIO_ID_PA21 21

 #define cmd_nitems(a) (sizeof((a)) / sizeof((a)[0]))
 #define WIFI_DEVICE_SCAN_RESULT_MAX (30)

+static OS_Thread_t led_thread;
+
 static WifiEvent sta_event;
 WifiScanInfo scan_results[WIFI_DEVICE_SCAN_RESULT_MAX];
 static unsigned int scan_num = 0;
@@ -118,6 +123,9 @@ static enum cmd_status cmd_net_sta_enable_exec(char *cmd)
                return CMD_STATUS_FAIL;
        }

+       IoTGpioInit(GPIO_ID_PA21);
+       IoTGpioSetDir(GPIO_ID_PA21, IOT_GPIO_DIR_OUT);
+
        return CMD_STATUS_OK;
 }

@@ -133,6 +141,8 @@ static enum cmd_status cmd_net_sta_disable_exec(char *cmd)
                return CMD_STATUS_FAIL;
        }

+       IoTGpioDeinit(GPIO_ID_PA21);
+
        return CMD_STATUS_OK;
 }

@@ -224,6 +234,16 @@ static enum cmd_status cmd_net_auto_connect_exec(char *cmd)
        return CMD_STATUS_OK;
 }

+static void led_thread_func(void *arg)
+{
+         while (1) {
+                 IoTGpioSetOutputVal(GPIO_ID_PA21, 1);
+                 OS_MSleep(500);
+                 IoTGpioSetOutputVal(GPIO_ID_PA21, 0);
+                 OS_MSleep(500);
+         }
+}
+
 static enum cmd_status cmd_net_connect_exec(char *cmd)
 {
        WifiErrorCode error;
@@ -289,6 +309,9 @@ static enum cmd_status cmd_net_connect_exec(char *cmd)
        }
        printf("ConnectTo Success\n");

+       if (OS_ThreadCreate(&led_thread, "LedThread", led_thread_func, NULL,
+                       OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK)
+
        return CMD_STATUS_OK;
 }

@@ -350,6 +373,8 @@ static enum cmd_status cmd_net_disconnect_exec(char *cmd)
                return CMD_STATUS_FAIL;
        }

+       OS_ThreadDelete(&led_thread);
+
        return CMD_STATUS_OK;
 }

上述代码中定义了两个全局变量:GPIO\\_ID\\_PA21表示GPIO号;led\\_thread用于点灯的handle。
led\\_thread\\_func函数是点灯的主函数体,间隔500ms点灯、熄灯,实现闪烁的效果。
OS\\_ThreadCreate用于创建闪灯的线程,OS\\_ThreadDelete则用于销毁闪灯的线程。

代码编译

修改完成代码后,进行编译,注意修改程序后,会造成bin互相覆盖的情况:
 title=
解决方案:
1、寻找.img.cfg所在的文件位置
    device/xradio/xr806/xr\_skylark/project/demo/wlan\_ble\_demo/image/xr806/.image.cfg
2、.image.cfg文件实际上是由image\_wlan\_ble.cfg文件生成的,因此把image\_auto\_cal.cfg替换image\_wlan\_ble.cfg后,重新执行hb build编译即可

烧录程序并运行

在windows下使用phoenixMC\_v3.1.21014b.exe程序烧录编译的image,然后在控制台执行相关命令,连接成功后,效果如下(这里放不了动画,使用两张图替代):
447551df-5f4d-4a1b-878b-50a426258871.jpg63f3164f-e615-4d78-88ad-0928a439f131.jpg

推荐阅读
关注数
13823
内容数
139
全志XR806开发板相关的知识介绍以及应用专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息