一、开发环境搭建
SDK开发工具集选择乐鑫配置:VirtualBox + Linux +交叉编译工具
使用的是以下这块开发板
VirtualBox下载地址
Lubuntu 镜像下载地址Lubuntu是一个轻量级系统(由乐鑫官方提供)
source insight 编辑代码
为了便于我们开发,需要在window下
D盘下新建VM共享目录
VM下新建share目录
挂载共享目录
ls:查看当前目录文件
./mount.ch:运行shell脚本
输入root密码:espressif
在Share目录下,新建文件夹demo
在window下查看是否同步
没成功可以参考这篇文章,写得挺全的
二、本次实验的目的:
1、配置WiFi为Station模式,连接到本地的WiFi网络里
2、配置WiFi为AP模式,PC机连接到WiFi AP下
三、熟悉FreeRTOS,实现打印“Hello world!” ,并闪烁LED
1,搭建app目录
将SDK放在共享目录下
在SDK目录下新建app目录
cd 到examples目录下
拷贝smart_config下所有文件到app目录下
cd 到app目录下查看文件是否拷贝成功
2,修改gen_misc.sh
vim 打开gen_misc.sh进行编辑
修改SDK_PATH为当前SDK路径(绝对)
修改BIN_PATH为当前BIN路径(绝对)
输入:x
保存退出
3,修改Makefile
因为分离了sdk和project目录,所以编译之前必须先指定一个 SDK_PATH 和 BIN_PATH,修改 ESP8266_RTOS_SDK/app 目录下的 makefile,添加以下内容
parent_dir:=$(abspath $(shell pwd)/$(lastword $(MAKEFILE_LIST)))
parent_dir:=$(shell dirname $(parent_dir))
parent_dir:=$(shell dirname $(parent_dir))
SDK_PATH=$(parent_dir)
BIN_PATH=$(SDK_PATH)/bin
4,编译和配置
./gen_misc.sh
运行gen_misc脚本进行编译
编译成功显示如下
工程模板编译好后,就可以开始写功能了
使用freeRTOS新建2个任务:
1,定时1秒,串口打印hello word
2,nodeMcu板上LED灯,1秒钟闪烁一次
5,打开sourceInsight 新建工程
5.1 新建工程Untitled_app工程
5.2 选择源文件
5.3添加需要的文件
5.4 新生成的文件树需要同步一下文件
5.5 打开文件目录,输入user_main.c,找到该文件进行编码
6,在user_main.c中加入打印函数
void ATaskHelloworld( void *pvParameters )
{
int iVariableExample = 0;
for( ;; )
{
printf("Hello world!\n");
vTaskDelay(100);
}
vTaskDelete( NULL );
}
user_init(void)
{
printf("SDK version:%s\n", system_get_sdk_version());
/* need to set opmode before you set config */
// wifi_set_opmode(STATION_MODE);
// xTaskCreate(smartconfig_task, "smartconfig_task", 256, NULL, 2, NULL);
xTaskCreate(ATaskHelloworld, "hello world", 256, NULL, 2, NULL);
}
7,保存进入虚拟机在app目录下进行编译和配置
然后再Windows中打开下载工具添加bin文件进行下载
打印结果
8,再加入led控制函数
8.1 先查阅原理图
知道LED1由GPIO16控制,GPIO16输出高电平灯灭,GPIO16输出低电平灯亮
9,添加外设驱动文件
9.1 app目录下新建driver目录
9.1.1 拷贝driver_lib/driver下所有文件到app/driver下
9.1.2 拷贝driver_lib/include下所有文件到app/include下
10,修改Makefile
10.1 添加工程编译子目录driver和生成libdriver.a静态库
SUBDIRS= \
user \
dirver
COMPONENTS_eagle.app.v6 = \
user/libuser.a \
driver/libdriver.a
11,进入source insight,同步一下文件,然后加入LED初始化函数以及驱动函数
void LED_Init(void)
{
gpio16_output_conf();
gpio16_output_set(1);
}
void ATaskled( void *pvParameters )
{
int iVariableExample = 0;
for( ;; )
{
gpio16_output_set(0);
printf("ledon!\n");
vTaskDelay(100);
gpio16_output_set(1);
printf("ledoff!\n");
vTaskDelay(100);
}
vTaskDelete( NULL );
}
user_init(void)
{
printf("SDK version:%s\n", system_get_sdk_version());
LED_Init();
/* need to set opmode before you set config */
// wifi_set_opmode(STATION_MODE);
// xTaskCreate(smartconfig_task, "smartconfig_task", 256, NULL, 2, NULL);
xTaskCreate(ATaskHelloworld, "hello world", 256, NULL, 2, NULL);
xTaskCreate(ATaskled, "LED", 256, NULL, 3, NULL);
}
12,保存编译
打印结果,实物LED在闪烁,输出内容如下
四,WIFI Station功能实现
1,WIFI Station入网条件
1.1 本地有WiFi网络
SSID:wifi网络名称
PASSWORD:WiFi入网密码
2,WIFI Station入网流程
3,新建Sration工程目录
3.1 新建Station目录,拷贝app目录下所有文件到Station目录下
4,Sourceinsight配置
移除之前app文件夹,加入Station文件夹
5,代码实现
在user_Init里面实现wifi station功能开发
#define SSID "ApolloPi-314E"
#define PASSWORD "apollopi"
user_init(void)
{
printf("SDK version:%s\n", system_get_sdk_version());
LED_Init();
wifi_set_opmode(STATION_MODE);
struct station_config *config = (struct station_config *) \
zalloc(sizeof(struct station_config));
sprintf(config->ssid,SSID);
sprintf(config->password,PASSWORD);
wifi_station_set_config(config);
free(config);
wifi_station_connect();
// xTaskCreate(smartconfig_task, "smartconfig_task", 256, NULL, 2, NULL);
xTaskCreate(ATaskHelloworld, "hello world", 256, NULL, 2, NULL);
xTaskCreate(ATaskled, "LED", 256, NULL, 3, NULL);
// xTaskCreate(ATaskprintf, "printf", 256, NULL, 3, NULL);
}
6,验证测试
烧写固件,复位查看串口日志,获取到路由器分配的IP
五, WIFI AP 功能实现
1,WIFI AP建立条件
SSID:WIFI网络名称(定义为自己的名字)
PASSWORD:WiFi入网密码
加密模式:WAP2_PSK
2,WIFI AP建立流程
3,新建AP工程目录
4,Sourceinsight配置
移除之前Station文件,加入AP文件,同步文件
5,代码实现
在user_Init下完成wifi AP功能开发
#define SSID "testwifi"
#define PASSWORD "123456789"
user_init(void)
{
printf("SDK version:%s\n", system_get_sdk_version());
LED_Init();
wifi_set_opmode(SOFTAP_MODE);
struct softap_config *config = (struct softap_config *) \
zalloc(sizeof(struct softap_config));
wifi_softap_get_config(config);
sprintf(config->ssid,SSID);
sprintf(config->password,PASSWORD);
config->authmode = AUTH_WPA_WPA2_PSK;
config->ssid_len = 0;
config->max_connection = 10;
wifi_softap_set_config(config);
free(config);
// wifi_station_connect();
// xTaskCreate(smartconfig_task, "smartconfig_task", 256, NULL, 2, NULL);
xTaskCreate(ATaskHelloworld, "hello world", 256, NULL, 2, NULL);
xTaskCreate(ATaskled, "LED", 256, NULL, 3, NULL);
// xTaskCreate(ATaskprintf, "printf", 256, NULL, 3, NULL);
}
6,验证测试
烧写固件,复位查看串口日志,PC连接AP,获取AP分配的IP地址