概述
陈拓 chentuo@ms.xab.ac.cn 2020/02/19-2020/03/31
1. 概述
ESP8266的开发工具是在linux系统下运行的,树莓派的官方操作系统是Linux系统。如果你手头刚好有一块树莓派,就可以用它进行ESP8266的开发。下面我们在树莓派3B+上安装ESP8266的开发环境。所用的树莓派安装官方操作系统版本是:
2019-09-26-raspbian-buster-lite.img。树莓派的存储用16G的TF卡。
电脑通过Putty连接树莓派,看看树莓派操作系统系统版本:
有关putty的使用,见参考文档《电脑连接树莓派3B+》
电脑连接树莓派3B+_晨之清风-CSDN博客_电脑连接树莓派3b
看到第3节,网线访问树莓派3B+就可以了,不用WiFi连接,网线连接可靠性好。
1.1 ESP8266开发工具的分类
在官方文档《ESP8266 SDK入门指南》中有关于开ESP8266发工具的分类。
https://www.espressif.com/sites/default/files/documentation/2a-esp8266-sdk_getting_started_guide_cn.pdf
乐鑫SDK官方开发工具下载网址:
https://www.espressif.com/en/support/download/sdks-demos
我们编译的工具链esp-open-sdk默认情况下安装ESP8266_NONOS_SDK-2.1.0,安装完成后我们将安装最新版本的ESP8266_NONOS_SDK-3.0.x。如果你有需要也可以再安装ESP8266_RTOS_SDK。多个SDK可以同时存在。
1.2 官方关于ESP8266_NONOS_SDK的说明
https://github.com/espressif/ESP8266_NONOS_SDK
README.md
1.3 其他说明
- 为什么不安装ESP-IDF
乐鑫最新的开发环境是ESP-IDF (Espressif IoT Development Framework)
见乐鑫的官方文档:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/get-started/index.html
但是在树莓派上安装ESP-IDF,编译时会出现错误:
Error: selected processor does not support 'mls r1,r4,r8,r11' in ARM mode
所选择的处理器在ARM模式中不支持'mls r1,r4,r8,r11'
这是树莓派操作系统本身的问题,可以看看下面链接的一篇文章:
http://silicone.homelinux.org/2017/03/05/raspberry-pi-3-as-desktop-computer/
- 下载安装问题
由于网络问题,工具链和相关依赖包的下载非常困难,常规安装很难完成。因此我们将更换apt的源,并且将github上的一些仓库克隆到gitee上,以加快下载速度。你也可以通过代理下载。
- 电脑配置要求
我用的电脑操作系统是32位版的win7,这应该是目前电脑的最低配置了。
2. 更新apt源
- 更新apt 源:sudo apt-get update
树莓派的官网连接问题,常用的解决方法就是换源。
- 更换apt源
需要修改的地方有两处:
/etc/apt/sources.list
/etc/apt/sources.list.d/raspi.list
查看系统版本:lsb_release -a
- 修改 /etc/apt/sources.list
下面我们要经常使用Linux的命令行文本编辑器nano,如果不熟悉先上网学学。
sudo nano /etc/apt/sources.list
在下面的语句前面加#注释掉这行:
#deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
据说阿里源比较快,我们就用阿里源:
deb http://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi
- 修改/etc/apt/sources.list.d/raspi.list
sudo nano /etc/apt/sources.list.d/raspi.list
在下面的语句前面加#注释掉这行:
#deb http://archive.raspberrypi.org/debian/ buster main
在这里可以添加阿里的源:
deb http://mirrors.aliyun.com/archive.raspberrypi.org/debian/ buster main ui
但经过测试,阿里源同步的不及时,所以我这里用科大源
deb http://mirrors.ustc.edu.cn/archive.raspberrypi.org/debian/ buster main ui
- 更新apt 源
sudo apt-get update
完成。
3. 编译工具链xtensa-lx106-elf
因为ESP8266功能太弱,不足以支持开发工作,所以需要在其他平台上进行开发。现在我们就要在树莓派上将ESP8266的程序代码编译链接成ESP8266可执行的文件,再将编译好的文件烧写到ESP8266上运行,这个过程就是交叉编译,交叉编译所需的软件工具叫做工具链toolchain。
我们需要的工具链是一个lx106编译器,可以为各种以lx106为内核的器件开发程序,也包括ESP8266。
因为树莓派资源也有限,还有前面说过的树莓派操作系统本身的问题,我们没有采用乐鑫最新的编程架构ESP-IDF。而使用较老的ESP8266开发工具esp-open-sdk为树莓派编译一个工具链xtensa-lx106-elf。
安装编译工具链的说明见:
https://gitee.com/chentuo2000/esp-open-sdk/README.md
3.1 安装依赖项
- 安装gcc g++库
sudo apt-get install make unrar-free autoconf automake libtool gcc g++ gperf
flex bison texinfo gawk ncurses-dev libexpat-dev python-dev python python-serial
sed git unzip bash help2man wget bzip2
……
- 安装libtool-bin
sudo apt-get install libtool-bin
3.2 克隆下载esp-open-sdk源码
- 创建并进入下载安装工具链目录
用putty登录树莓派
mkdir -p ~/esp/
cd ~/esp/
- 在码云gitee上克隆esp-open-sdk
可以用git clone命令直接从github上克隆esp-open-sdk:
git clone --recursive https://github.com/pfalcon/esp-open-sdk.git
由于网络原因,下载速度很慢。
我们先在码云gitee上克隆一个esp-open-sdk。
再从码云上克隆esp-open-sdk到本地,这样会快很多。
esp-open-sdk还有几个子模块也需要一并克隆到码云上。
看看子模块在哪里:
在esp-open-sdk仓库页面打开文件.gitmodules
其中有4个子模块的下载地址,用这4个下载地址在gitee上克隆它们。
修改url:
这样在在克隆esp-open-sdk的时候带上参数--recursive,子模块也就一并克隆了。
因为要用git克隆下载esp-open-sdk,所以先安装git。
- 安装git
sudo apt-get install git
测试git --version
关于Git的使用可以看《树莓派使用Git》
https://blog.csdn.net/chentuo2000/article/details/104834522
- 从码云克隆esp-open-sdk
git clone --recursive https://gitee.com/chentuo2000/esp-open-sdk.git
查看ls –l
3.3 编译esp-open-sdk
- 先在gitee上克隆ESP8266_NONOS_SDK
从https://github.com/espressif/ESP8266_NONOS_SDK克隆ESP8266_NONOS_SDK到gitee
- 编辑Makefile文件
cd esp-open-sdk/
cp Makefile Makefile.bak
nano Makefile
就是两处github.com/espressif修改成gitee.com/chentuo2000。
- 编译选项
README.md文件中有关于make命令的说明,我们用默认编译命令make。
- 编译
make
错误信息:error: could not find bash >= 3.1
- 修改configure.ac
要求bash的版本 >= 3.1,查看当前的bash版本bash --version
5.0.3 > 3.1,满足条件。
解决方法(https://github.com/pfalcon/esp-open-sdk/issues/365):
修改/home/pi/esp/esp-open-sdk/crosstool-NG/configure.ac
nano /home/pi/esp/esp-open-sdk/crosstool-NG/configure.ac
找到行|$EGREP '^GNU bash, version (3.[1-9]|4)')
改成:|$EGREP '^GNU bash, version ([0-9.]+)')
保存,退出。
- 继续编译make
出现错误:
查看日志cat ./crosstool-NG/build.log
看日志中的这一句:
Not at this location: https://ftp.gnu.org/gnu/gmp/gmp-6.0.0a
- 手工下载gcc的依赖库gmp-6.0.0a
先看看GMP的官网The GNU MP Bignum Library。
查看gmp的全部版本
Index of /download/gmp/
在列表中找到gmp-6.0.0a.tar.xz
右击gmp-6.0.0a.tar.xz复制链接地址,下载:
wget https://gmplib.org/download/gmp/gmp-6.0.0a.tar.xz
下载完成:
如果下载中断,可以多试几次,或者找它的镜像网站,或者通过代理。
看看错误信息,找出下载的资源包放在什么目录中。
Build failed in step 'Retrieving needed toolchain components' tarballs'
查找tarballs(源压缩文档)目录的位置find . -name "tarballs"
所有下载的资源包都放在这里。
将gmp-6.0.0a.tar.xz复制到./crosstool-NG/.build/tarballs目录中:
cp gmp-6.0.0a.tar.xz ./crosstool-NG/.build/tarballs
- 继续编译make
你会遇到11个要下载的资源包,仿照上面的方法都下载下来放在./crosstool-NG/.build/tarballs目录中。
列表看看ls -l ./crosstool-NG/.build/tarballs
下载这些资源包很麻烦,tarballs目录中的11个资源包我已经上传到CSDN上了,见《ESP8266开发工具的依赖包》ESP8266开发工具的依赖包-C文档类资源-CSDN下载。
下载tarballs.rar,解压缩,再复制到目录 ./crosstool-NG/.build/tarballs
现在一切都准备好了,正式开始编译,大约2个小时。
继续make
完成编译!
编译成功后会在esp-open-sdk文件夹出现xtensa-lx106-elf、esptool和 ESP8266_NONOS_SDK三个文件夹,分别是编译器、烧录工具和ESP8266的非操作系统开发工具NONOS_SDK。
SDK的目录名字ESP8266_NONOS_SDK-2.1.0-18-g61248df太长了,用起来很麻烦,所以你看到有一个软链接sdk代替了那个很长的名字。
3.4 使用工具链
完成工具链构建后,带有Xtensa HAL库的工具链,也就是交叉编译器位于
/home/pi/esp/esp-open-sdk/xtensa-lx106-elf
子目录中。
将xtensa-lx106-elf/bin/子目录添加到PATH 环境变量以运行xtensa-lx106-elf-gcc和其他工具。在构建过程结束时,crosstool-NG将根据你的环境给出正确的PATH设置命令。上图中工具链构建结束时提示,我的环境变量这样设置:
export PATH=/home/pi/esp/esp-open-sdk/xtensa-lx106-elf/bin:$PATH
这个命令每次开机都要重新设置,很麻烦,下面我们将环境变量写到.bashrc中,这样每次开机时环境变量就自动设置了。
- 设置环境变量
回到家目录,就是我们登录的目录
cd ~
查看当前环境变量echo $PATH
看看有没有文件.bashrc
编辑这个文件nano ~/.bashrc
将
export PATH=/home/pi/esp/esp-open-sdk/xtensa-lx106-elf/bin:$PATH
添加到最后一行。
重新启动树莓派sudo reboot,重新登录树莓派,再查看环境变量echo $PATH
工具链的路径已经在里面了。
- 运行xtensa-lx106-elf-gcc -v来验证安装
OK!
3.5 升级SDK
上面的安装过程中安装的SDK版本是ESP8266_NONOS_SDK-2.1.0-18-g61248df,
现在我们安装最新的ESP8266_NONOS_SDK。
- 克隆ESP8266_NONOS_SDK
cd ~/esp
git clone https://gitee.com/chentuo2000/ESP8266_NONOS_SDK.git
- 看安装位置:
- 安装tree命令,查看目录树(可以在任何目录位置安装)
1) wget http://mama.indstate.edu/users/ice/tree/src/tree-1.7.0.tgz
2) tar zxvf tree-1.7.0.tgz
3) cd tree-1.7.0
4) make
5) make install
6) 查看目录结构tree -L 1
4. 树莓派串口连接ESP8266
我们用ESP8266-01/ESP8266-01S模块为例与树莓派串口进行连接。
4.1 树莓派串口硬件设置
树莓派的串口需要设置才能使用。
看看默认情况下设备文件和串口的映射关系:ls -l /dev
我们需要的映射关系是这样的:
有关串口的设置请看文章《树莓派串口的使用》
https://blog.csdn.net/chentuo2000/article/details/104711494
设置好的串口对应的引脚是Pin8(TXD, GPIO14)和Pin10(RXD, GPIO15)。
4.2 串口工具软件Minicom的安装和使用
乐鑫官方文档建议使用Minicom作为串口调试工具。
- 安装串口工具Minicom
sudo apt-get install minicom
查看版本:
- 执行以下命令在minicom中对串口进行配置
sudo minicom -s
在弹出的菜单中选择“Serial port setup”,将默认设置
改成:
回车:
保存Save setup as df1,退出Exit from Minicom。
常用命令:
Ctrl+A W:当显示的内容超过一行之后自动换行
Ctrl+A X:退出minicom
4.3 ESP8266-01参数
4.4 树莓派3B+和ESP8266-01的引脚图
4.5 ESP8266-01的引脚说明
4.6 树莓派3B+和ESP8266-1的连接
- 正常运行程序时的连接
树莓派3B+ | 3.3V | Pin1 | Pin5 | VCC | ESP-01 |
3.3V | Pin17 | Pin7 | CH_PD | ||
TXD | Pin8 | Pin4 | RXD | ||
RXD | Pin10 | Pin8 | TXD | ||
GND | Pin9 | Pin1 | GND |
用杜邦线按照表中的对应关系连接树莓派和ESP8266-01。
如果使用的是ESP8266-01S模块CH-PD可以不接。
两者的外观区别是:ESP8266-01S天线区域右下角只有一个指示灯,ESP8266-01天线区域右下角有两个指示灯。另外ESP8266-01上有个LED在工作时一直亮着,这对于要求低功耗的场合很不利。
在烧写程序时模块上的GPIO0需要接低电平(默认为高电平)。
4.7 ESP8266-01 AT命令测试
ESP8266-01模块自带AT命令支持,用minicom可以测试。
- minicom
- 插拔VCC重新启动模块
- 树莓派用minicom发送AT指令说明
AT 指令是一行一行发送给设备的,每一行以 rn 结尾,而我们在电脑上敲的回车键通过putty传到树莓派上只有 n没有 r。所以AT命令的结束不能用回车键,要用组合键Ctrl+M和Ctrl+J。
对应关系:
r - Ctrl+M
n - Ctrl+J
例如发送查看固件版本指令AT+GMR是这样的:
AT+GMR Ctrl+M Ctrl+J
看测试是否正常,以检测模块的好坏,连线是否正确。
5. 编译一个项目
乐鑫官方文档:
- ESP8266 SDK入门指南
https://www.espressif.com/sites/default/files/documentation/2a-esp8266-sdk_getting_started_guide_cn.pdf
- ESP8266 Non-OS SDK API参考
https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_cn.pdf
5.1 官方编程规范
5.2 编译第一个ESP8266程序
- 查看ESP8266_NONOS_SDK目录
查看ESP8266_NONOS_SDK/examples子目录
在examples目录中有一个esp_mqtt_proj子目录,我们就从这里起步。
- 复制目录
把esp_mqtt_proj目录复制到和examples目录平级,并改名为i_mqtt。
cp -r ./examples/esp_mqtt_proj ./i_mqtt
- 修改代码
进入i_mqtt目录
nano user/user_main.c
找到void user_init(void)函数,保留:
uart_init(BIT_RATE_115200, BIT_RATE_115200);
添加:
os_printf("SDK version:%sn", system_get_sdk_version());
其他语句都注释掉。
- 编译
运行gen_misc.h并回答5个问题:
./gen_misc.sh
选择5个参数
编译过程开始:
编译结果放在~/esp/ESP8266_NONOS_SDK/bin目录中:
cd ../bin/
ls -l
红框中的4个文件要烧写到ESP8266的Flash中。
- 简化编译过程
每次运行gen_misc.sh都要选择输入比较麻烦,可以根据上面的选择输入写一个文件input.esp-01,其中记录了上面的回答。
nano esp01
存盘退出,下次编译用下面的输入重定向自动输入选项就可以了。
./gen_misc.sh < esp01
6. 烧写ESP8266 Flash
要烧写4个文件。先熟悉一下ESP8266 Flash的布局,再确定每个文件的烧写地址。
6.1 ESP8266 Flash布局
6.2 ESP8266 FM(固件)
ESP8266 HDK就是指ESP8266模块,我们用ESP8266-01。
ESP8266-01的flash 存储器为8Mbit,也就是1MB。
6.3 确定烧写地址
- 查固件地址表blank.bin位于0xfb00和0xfe000
- 查固件地址表esp_init_data_default_v08.bin位于0xfc000
- eagle.flash.bin位于0x00000
- eagle.irom0text.bin位于0x10000
注意,其中除了flash.bin和irom0text.bin每次都需要下载,blank.bin和esp_init_data_default_v08.bin只需要保证flash里面下载过就行了,对应版本的SDK只需要下载一次,并且要对照着上述地址下载。
6.4 烧写flash
- 接线
用1条杜邦线连接ESP8266-01的GPIO0和树莓派引脚Pin6(GND)。
- 烧写flash的工具在这里
/home/pi/esp/esp-open-sdk/esptool/esptool.py,在前面我们已经设置了工具链的环境变量,可以直接使用。
- 查看串口设备
确认前面设置的串口设备
ls -l /dev
serial0 -> ttyAMA0
- 构造烧写命令
1) 第一次烧写命令
esptool.py --port /dev/ttyAMA0 write_flash 0x00000 eagle.flash.bin 0x10000 eagle.irom0text.bin 0xfb000 blank.bin 0xfc000 esp_init_data_default_v08.bin 0xfe000 blank.bin
2) 之后的烧写命令
esptool.py --port /dev/ttyAMA0 write_flash 0x00000 eagle.flash.bin 0x10000 eagle.irom0text.bin
- ESP8266 flash烧写操作流程
1) VCC断电
2) 连接GPIO0和GND
3) VCC上电
4) 执行上面准备好的烧写命令
5) VCC断电
6) 断开GPIO0和GND
7) 运行minicom
注意:开多个putty窗口时,一定要烧写完成后再运行minicom,否则串口被占着,烧写会失败!!!
8) 上电运行程序
OK!
- 制作ESP8266-01烧写转接板
烧写过程挺麻烦的,如果经常烧写可以做一个电路板简化烧写过程。其实在烧写过程中GPIO0和GND的连线不用一直连着,在上电进入烧写模式之后就可以拿掉了,烧写完成后将RST拉低一下模块就进入程序运行模式。这里有一张网上找的电路图可以参考。
在参考文档《ESP8266-01 Programming Breakout Board》中有详细的制作说明。
- 擦除芯片命令
如果模块烧写后运行异常,可以擦除芯片重新烧写。通常直接烧写就可以,不用擦除。
esptool.py --port /dev/ttyAMA0 erase_flash
6.5 程序调试方法
官方给出的程序调试方法:
7. 更多的例子
在ESP8266-01S上面有一个蓝色的LED接GPIO2引脚,我们下面用程序控制这个LED闪烁。
注意:如果使用ESP8266-01需要自己在GPIO2引脚上外接一个LED。
- 修改代码nano user_main.c
1) 添加2个变量
static const int pin = 2;
static volatile os_timer_t some_timer;
2) 添加一个定时函数
void some_timerfunc(void *arg)
{
//Do blinky stuff
if (GPIO_REG_READ(GPIO_OUT_ADDRESS) & (1 << pin)) {
// set gpio low
gpio_output_set(0, (1 << pin), 0, 0);
} else {
// set gpio high
gpio_output_set((1 << pin), 0, 0, 0);
}
}
3) 在函数void user_init(void)中添加
// init gpio subsytem
gpio_init();
// configure UART TXD to be GPIO1, set as output
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
gpio_output_set(0, 0, (1 << pin), 0);
// setup timer (500ms, repeating)
os_timer_setfn(&some_timer, (os_timer_func_t *)some_timerfunc, NULL);
os_timer_arm(&some_timer, 500, 1);
- 编译
./gen_misc.sh < esp01
- 烧写
esptool.py --port /dev/ttyAMA0 write_flash 0x00000 eagle.flash.bin 0x10000 eagle.irom0text.bin
- 运行烧写完成后程序自动运行,可以看到led闪烁。
参考文档:
- 电脑连接树莓派3B+
电脑连接树莓派3B+_晨之清风-CSDN博客_电脑连接树莓派3b - esp8266 SDK开发之环境搭建
esp8266 SDK开发之环境搭建 - mmmmar - 博客园 - ESP8266 Community Forum
Everything ESP8266 - Prebuilt Windows Toolchain for PowerPC
Prebuilt GNU toolchain for PowerPC - How to set up manually the GCC toolchain and SDK
toolchain [ESP8266 Support WIKI] - esp8266-wiki
https://github.com/esp8266/esp8266-wiki/wiki - esp-link
https://github.com/jeelabs/esp-link - ESP8266_NONOS_SDK 3.0
https://github.com/espressif/ESP8266_NONOS_SDK/releases/tag/v3.0 - ESP8266
ESP8266 - Fixme.ch - ESP8266-01 Programming Breakout Board
ESP8266-01 Programming Breakout Board | Martyn Currey - 乐鑫官方文档
技术文档 | 乐鑫科技 - 树莓派使用Git
树莓派使用Git_晨之清风-CSDN博客_树莓派安装git
最后
以上就是天真高山为你收集整理的树莓派安装ESP8266 NON-OS SDK开发环境的全部内容,希望文章能够帮你解决树莓派安装ESP8266 NON-OS SDK开发环境所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复