原创 比特 找小黑
让我们一起用esp8266做一些好玩的东西吧
再次认识ESP8266
ESP8266EX内置超低功耗 Tensilica L106 32-bit RISC 处理理器器,CPU 时钟速度最⾼高可达160 MHz,⽀支持实时操作系统 (RTOS) 和 Wi-Fi 协议栈。
ESP8266EX内置64KB iRAM(用来执行代码)和96K dRAM(用来存储数据)。
ESP8266EX使用外置 SPI flash 存储⽤户程序和数据。理论上最⼤可⽀持 16 MB 的存储。
ESP8266EX 支持 TCP/IP 协议,完全遵循 802.11 b/g/n WLAN MAC 协议,支持 STA (连接路由器)和 SoftAP (作为热点,手机可以连接)。
有各种外设接口:GPIO、SDIO、SPI、IIC、IIS、UART(串口)、PWM、IR 遥控接⼝、ADC(模/数转换器器)。
和任何一个单片机一样,我们用编程控制它拥有的资源,也就是利用CPU和内存执行程序控制外设,可通过8266的引脚相连更多的设备。关于CPU+内存的原理,如果有不了解的可以看我之前的文章[我-计算机](公众号首页->计算机->原理)。
和一般单片机最大的不同就是,它支持wifi,稍微夸张的说:它将无所不能。
最后说一点,市面上有很多esp8266的模块,都是集成了ESP8266EX,只是样子不同、引出的引脚多少不同、外接的Flash大小不同、或者集成了USB转串口芯片(如果你有USB转串口模块这个就没必要,我就不喜欢集成USB转串口的板子,额外占了空间)
顺便说说我使用的USB转串口:CP2102
搭建开发环境
ESP8266目前支持很多种开发方式,我们这里关注的是官方推荐idf风格的开发。idf方式开发有很多优点:
这是最原生的开发方式,可以控制的资源最多,也最灵活。
相比很多MicroPython、lua等脚本语言开发运行效率高很多,之前用脚本语言开发,明显感觉卡顿。
乐鑫最新的ESP32也是使用idf风格,所以熟悉了8266的开发,几乎可无缝平移到ESP32。
产品开发基本使用idf方式,所以为找工作带来优势。
最重要的是,这种原生的开发,能学到很多原理,如果搞个图形界面,你可能开发了很多应用,还是有很多不清楚的地方。
我们接下来就开始在ubuntu linux下搭建ESP8266开发环境。
(windows和mac的用户可以参考官方教程:https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html)
1. 安装工具链(就是把代码编译成能烧写到8266的bin文件的工具)
#安装依赖
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-serial
#从下列地址下载工具链
for 64-bit Linux:
https://dl.espressif.com/dl/xtensa-lx106-elf-linux64-1.22.0-100-ge567ec7-5.2.0.tar.gz
for 32-bit Linux:
https://dl.espressif.com/dl/xtensa-lx106-elf-linux32-1.22.0-100-ge567ec7-5.2.0.tar.gz
#下载并解压工具
mkdir -p ~/esp
cd ~/esp
tar -xzf ~/Downloads/xtensa-lx106-elf-linux64-1.22.0-100-ge567ec7-5.2.0.tar.gz
#将工具链加入环境变量
#在 ~/.bashrc 最后加入下面一行
export PATH="$PATH:$HOME/esp/xtensa-lx106-elf/bin"
#为了更方便的使用USB转串口,执行下面命令
sudo usermod -a -G dialout $USER
sudo chmod -R 777 /dev/ttyUSB0
2. 下载SDK (idf风格)
#下载SDK
cd ~/esp
git clone --recursive https://github.com/espressif/ESP8266_RTOS_SDK.git
#配置PATH
#在 ~/.bashrc 最后加入下面一行
export IDF_PATH="$HOME/esp/ESP8266_RTOS_SDK"
#然后执行
python -m pip install --user -r $IDF_PATH/requirements.txt
3. 创建一个工程
#拷贝官方的hello world工程
cd ~/esp //这个是拷贝到 esp目录下,实际上可以拷贝到任何地方
cp -r $IDF_PATH/examples/get-started/hello_world ./
#配置项目
cd ~/esp/hello_world
make menuconfig
make menuconfig会看到这样的界面
可以在蓝色的选项中选择flash的大小(这里是选择编译的目标板子信息,选的比实际小就没问题,不能比实际大),为了加快烧写速度,可以将串口波特率改为921600(默认115200)。
4. 编译并烧写(具体连接方法见后文)
#用USB转串口连接好ESP8266
make flash
5. 查看log(连线方式有别于步骤4,详情见后文)
#改变连线,重启后运行
make monitor
接线方式
看上面的原理图,虽然写的07/08/12E的最小系统,前面说过其实所有的模块都一样。
22引脚为8266 TX引脚-----连接-----USB转串口RX引脚
21引脚为8266 RX引脚-----连接-----USB转串口TX引脚
8266的地线------------------连接-----USB转串口的地线
这样就可以传输数据了,我一般会把8266电源正极接USB转串口3.3V为其供电。
这里要说的是:
如果GPIO0(18引脚)接地上电,8266就会进入烧写模式,对应以上步骤4。
如果GPIO0(18引脚)不接地上电,8266就会正常启动,对应以上步骤5。
在网上找了个01模块的连线图(是不是都一样阿)
启动流程和Flash分区
这里不打算详细的说明,只要明白大概的执行流程就行。
模块上电默认执行内部ROM的程序,根据GPIO0(也有其他)的状态判断进入哪种模式,
如果进入烧写模式就接收串口来的数据,写入flash;
如果正常启动就会执行0地址处的bootloader,bootloader根据0x8000处的分区表执行0x10000处的用户APP(这里可能不严谨,但不影响使用)。
三块橙色的分别为bootloaer、分区表、我们自己编译的程序(APP)。
关于分区表更详细的内容后面再说。
----------我是比特,一个想把问题搞清楚的青年才俊----------
公众号:find_xiaohei
及时更新,博客不定期更新