本节介绍:
ESP8266 SDK介绍
FreeRTOS工作原理
第一个任务hello word
第二个任务点灯
WiFi-STATION&AP连接(esp8266作为路由器,作为入网节点)
一。ESP8266的SDK介绍
1.SDK目录结构研究
我们需要了解一下的内容来达到我们对SDK目录熟悉的目的
2.对上述目录的解释
(1)Bin目录
1.编译生成的目录,直接下载到wifi中
2.特点:
根目录下为官方提供的bin文件,可以有一个upgrade文件夹,这个文件夹用来远程升级代码,具体升级可以类比打个比方(经常有人走的车道,如何修路)
(2)documents目录
这是参考文档的存放地,我们通过他来了解API的使用方式。
(3)driver_lib目录
驱动目录,例如GPIO,I2C,UART
(4)example目录
这是实例代码存放地,例如mqtt协议使用代码,OpenSSL功能代码,wps的wifi保护设置实例代码等等,需要自己摸索。我使用的是智能联网实例代码(Smart_config)
(5)extra_include目录/include目录
内核接口/freeRtos,LWIP等
使用方法:声明头文件就可以使用
(6)ld目录
编译时链接所需要的脚本,这个makefile时会自动处理他(makefile就是可以连续执行一系列指令,这样人就不需要一步一步编译代码,即代码生成bin一步到位)
(7)lib目录
我们经常见到.a的文件后缀,这是不开源的源码库,我们可以使用,但是却无法看到里面的代码
(8)third_party目录
第三方开源源码
(8)tool目录
编译BIN文件所需目录
2.SDK提供的API接口
经常有人说ESP8266简单,那就是因为我们只需要根据参考文件使用API就可以实现项目。
Documents文件夹中查找参考文件,使用即可
3.如何生成可烧录的代码:
(0)前提准备
2.打开第一节下载的虚拟机
(1)实验步骤
创建--》注意这里会使用快捷键,补全的快捷键Tab(类似于java后端IDEA的Alt+insert)
1.创建APP目录(建立自己的工程文件)
(0)进入上一节创建的共享文件夹下
(发现刚刚复制的文件)
(1)SDK目录下新建app目录
cd进入工程,创建app文件夹
(2)cd到examples目录下
(3)拷贝smart_config下所以文件到app目录下
使用Tab补全键会方便很多
(4)cd到app目录下查看文件是否拷贝成功
进入刚刚创建的app文件夹下查看是否有数据
2.修改gen_misc.sh(修改shell文件)
继续在app文件下运行
补充:为什么修改shell文件?
工程文件与SDK文件是分离的,需要配置路径,下面makefile配置也一样。
(1)vim打开gen_misc.sh进行边编辑
(2)修改SDK_PATH为当前的SDK路径(绝对路径)
(3)修改BIN_PATH为当前BIN路径(绝对路径)
(4)wq保存退出
3.修改makefile(vim Makefile)
(1)编译前指定路径(sdk与工程文件连接)
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
补充:我们也可以直接在文件下修改,不用指令
编译
./gen_misc.sh运行脚本进行编译
最后一个使用4096K
运行结果:
生成bin文件
二。Freertos在wifi中的使用
1.在后台上使用while无线循环,在前台上使用中断来处理
2.RTOS
(1)RTOS简介
RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。
在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的一部分,每个任务都是一个很简单的程序,通常是一个死循环。
RTOS操作系统:FreeRTOS,UCOS,RTX,RT-Thread,DJYOS等。
(2)RTOS任务特性
抢占,有优先级,每个任务都要分配内存导致RAM使用量大,如果使用抢占要仔细考虑重入
三。实验:wifi打印hello word
实验要求:Freertos新建一个任务,定时1s,串口打印hello world
(0)前提准备
windows下无法查看代码,所以使用Source Insight可以在windows系统下查看API
(1)新建hello word工程目录
1.在SDK目录下新建hello word
2.拷贝app目录下所有文件到helloworld
(1)进入到共享文件夹的SDK下
(2)创建helloword文件夹,拷贝app文件夹中内容
(3)cd进入helloworld文件夹中,发现拷贝完成
(2)SourceInsight下设置
SourceInsight文件放在默认路径下
C:\Users\Administrator\Documents\Source Insight 4.0\Projects
1.右键--》新建project
2.文件在默认路径下,创建hellowordword文件
3.项目的源文件夹使用D盘建立的共享文件夹的SDK工程文件
4.添加所需要的文件
5.成功之后点击close
(3)SourceInsight的初步设置
1.同步文件(选择project的Synchronize)
2.同步之后,打开List
3.结果
补充:初步的使用
(4)代码的编写
<1>Freertos任务函数的加入
1.打开Freertos的中文指南
复制一个任务模版到user_main中
放在user_init上面
任务名称的修改,注释的添加
<2>代码编写
1.任务中加入printf(这里忘记加入延迟函数)
printf("hello world!!\n"); vTaskDelay(500);
2.在下方的user_init中创建代码
xTaskCreate(ATaskHelloWorld, "hello world", 256, NULL, 2, NULL);
3.user_init中不使用的代码注释掉
4.保存:ctrl+s
(5)运行代码
<1>编译:
1.在Oracle VM中进入helloworld文件夹中
2.在helloworld中运行./gen_misc.sh
3.编译设置
Y 1 2 3 4
(我回头修改了一下,下面的就是设置了1,使用user1.bin)
<2>烧写
1.打开烧写工具,使用esp8266
2.参数选择
共享文件夹中
<1>第一个参数 boot
<2>第二个参数 用户数据
<3>第三个参数 默认参数
<4>第四个参数
<5>第五个参数
这是云端升级用到的,我们用不到,所以不设置
插入esp8266,烧录
使用DOUT
运行成功:
1.波特率的修改
2.RTS关闭
四。实验:wifi点灯
(0)实验要求:
使用freeRTOS新建一个任务,使nodeMcu板上LED灯,1秒钟闪烁一次
(1)实现分析
GPIO16为低亮
(2)实践流程
新建led工程
1.共享文件夹下的SDK目录下新建led目录
2.拷贝helloword目录下所有文件到led目录下
cp -rf helloworld/* led/
添加外设驱动文件(led驱动)
1.led目录下新建driver目录
2.拷贝driver_lib/dirver下所有文件到led/driiver下
首先进入sdk文件根目录下
cp -rf driver_lib/driver/* led/driver/
3.拷贝driver_lib/include下所有文件到led/include下
cp -rf driver_lib/include/* led/include
修改Makefile
在led工程中,vim Makefile
1.添加工程编译子目录driver
2.生成libdriver.a静态库
记住上一个都需要加斜杠
3.wq保存
Sourceinsight配置
1.在之前的工程中,移除helloword文件夹
移除helloworld
2.添加led文件夹
代码修改
1.进入user_main.c编写led_init初始化灯函数,ATaskLed任务函数
注意加上:头文件#include “gpio.h”
/****************************************************************************** * FunctionName : led_init * Description : led初始化 * Parameters : none * Returns : none *******************************************************************************/ void led_init(){ gpio16_output_conf(); gpio16_output_set(0); } /****************************************************************************** * FunctionName : ATaskLed * Description : 任务函数Led * Parameters : none * Returns : none *******************************************************************************/ void ATaskLed( void *pvParameters ){ int iVariableExample = 0; /* 任务通常实现在一个死循环中。 */ for( ;; ) { /* 完成任务功能的代码将放在这里。 */ //gpio16_output_conf(); printf("off\n"); gpio16_output_set(1); vTaskDelay(500); gpio16_output_set(0); printf("on\n"); vTaskDelay(500); } /* 如果任务的具体实现会跳出上面的死循环,则此任务必须在函数运行完之前删除。传入NULL参数表示删除 的是当前任务 */ vTaskDelete( NULL ); }
2.进入user_main添加任务
这是用户的初始化,在这里初始化任务,后续运行
(3)代码运行
1.oracle Vm中运行成功、
2.烧录
(4)运行成功:wifi一闪一灭
补充:
问题:下面两个指令有什么区别,第一个是cp -rf driver_lib/driver/* led/driver/ ,第二个是cp -rf driver_lib/driver led/driver?
四。实验:WiFi-Station&AP连接(入网)
1.功能分析
配置WiFi为Station模式,连接到本地的WiFi网络里。(Station模式,wifi去入网)
配置WiFi为AP模式,PC机连接到WiFi AP下。(AP模式,PC连入wifi)
2.Station功能实现
(1)WiFi Station入网条件
SSID:WiFi网络名称 PASSWORD:WiFi入网密码
即:需要设置wifi名称,wifi密码
(2)WiFi Station入网流程
1.配置WiFi为Station
2.动态内存分配配置参数结构体
3.赋值SSID&PASSWORD到参数中
4.设置参数 到寄存器
5.释放内存
6.开启WiFi连接
3.具体功能实现
(1)新建Station工程目录
1.在SDK目录下新建Station目录
2.拷贝led目录下所有文件到Station目录下
这一次直接在windows下拷贝
(2)Sourcesight配置
1.在之前的工程中,移除led文件夹
2.添加Station文件夹
(3)代码实现
1.在user_init下完成WiFi Station功能开发
注意:这里建议连接自己的手机热点(名称+密码),当然可以用路由器,但是如果加密了话,wifi是连接不上的。
#define SSID "wangjianghui" #define PASSWORD "makeru@4006670108" 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); //使用Config作为接口,之后消除 wifi_station_set_config(config); free(config); //启用wifi的自动连接 wifi_station_set_auto_connect(TRUE);
2.编译
3.烧写
(4)验证测试
1.烧写固件
2.复位查看串口日志,获取到路由器分配的IP,连接成功
五。实验:AP功能的实现
1.WiFi AP建立条件
1.SSID:WiFi网络名称(定义为自己的名字)
2.PASSWORD:WiFi入网密码(123456789)
3.加密模式:WAP2_PSK
2.WiFi AP建立流程(代码)
1.配置WiFi为 AP
2.动态内存分配配置参数结构体
3.获取当前参数到内存
4.赋值SSID&PASSWORD到参数中
5.配置加密模式为WAP2_PSK
6.配置SSID长度为0
7.配置最大站点连接数为4
8.设置参数到寄存器
3.具体实现
(1)新建AP工程目录
1.在SDK目录下新建AP目录
2.拷贝Station目录下所有文件到AP目录下(windows下更方便)
(2)Sourcesight配置
1.在之前的工程中,移除Station文件夹
2.添加AP文件夹
SourceInsight---》project---》Add and Remove
(3)代码实现
1.在user_init下完成WiFi AP功能开发
1.配置WiFi为 AP
2.动态内存分配配置参数结构体
3.获取当前参数到内存
4.赋值SSID&PASSWORD到参数中
5.配置加密模式为WAP2_PSK
6.配置SSID长度为0
7.配置最大站点连接数为4
8.设置参数到寄存器
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 = 4; wifi_softap_set_config(config); free(config);
结果:PC连入WIFI
1.烧写固件
2.复位查看串口日志,PC连接AP,获取AP分配的IP地址
补充:查找已经连接的wifi密码
1.点网络设置
2.点击更改适配器选项
3.找到对应的wifi(上面有名称,对应一下)
4.右键----》状态--》无线属性--》安全--》显示字符
这下就找到已经连接的wifi密码了