关于ESP8266的SDK……
从Espressif(乐鑫)的GitHub主页clone到的ESP8266的SDK,多数情况下master分支是无法正常工作的……
存在下列问题:
1. lx106-hal库不包含在repo内( (2018-01-06更新)-lhal
Link 不能)
2. 驱动库编译不能(各种玄学报错,多数是 undefined symbol )(2018-01-06更新)
3. 生成binary文件的时候会报错( Arch/Fedora 等 python -> python3
发行版专享错误)
解决方案:
1. 从 tommie/lx106-hal clone HAL API 库,按照文档编译生成 libhal.a
后复制到 $SDK_PATH/lib
下。
2. 无解。 driver_lib
源代码与 SDK 的 API 版本不匹配,清真操作失败,请使用lib目录内提供的libdriver.a 。
3. 修改 $SDK_PATH/Makefile
中与 $SDK_PATH/tools/gen_appbin.py
所有相关项的 @python
到 @python2
。
4. ESP-IDF真香!(
5. Python Interpreter可以在menuconfig里指定。
2017-12-25更新:
a. 编译驱动库失败原因是缺少hal
相关的头文件,复制include
到toolchain目录即可,或使用esp-open-sdk。但是链接驱动库时依然存在undefined symbol。
b. 现在有了一个更开放(deblob了一些开源组件,包括FreeRTOS,LwIP,mbedTLS等)的SDK,但是某些部分存在问题(无法进入light sleep模式等),值得尝试。地址在这里:SuperHouse/esp-open-rtos。
2018-01-06更新:
a. 官方SDK更新,驱动库现在可以正常编译了,但移除了WiFi-Mesh支持。
b. 使用官方帐号fork的 ct-ng 编译toolchain会自带HAL库(GCC 4.8)。
2018-03-27更新:
a. PWM组件依赖内部timer的溢出中断产生对应频率,在Light Sleep以上模式下部分中断会被屏蔽以及CPU进入停止状态不响应中断请求,导致PWM抖动或无法工作。依赖PWM时务必不要设置低功耗模式。PWM工作原理推测如下:
* 设置内部硬件timer为PWM频率 * 固定factor
* 在PWM溢出中断处理中判断占空比,翻转指定IO
此方式不依赖高级timer外设,简单计时器即可实现,处理中断占用CPU时间(80/160MHz的Xtensa来说不是大问题),中断被屏蔽或CPU睡眠不响应中断时无法工作。
b. 外部中断可以配置但GPIO0的外部中断会在每次下载结束复位时被触发,清除GPIO中断Flag寄存器无效,推测为CP2102的DTR/RST信号保持时间过长。
2018-05-08更新:
a. 官方SDK更新,部署形式变为ESP-IDF的Kconfig模式,components代码公开。
b. Python问题依然没解决
c. 特定HUB(小米USB-C)会干扰CP2102,目前没有定位到具体原因。
おまけ
- 他提供的lib经常有内部的串口打印(不会特别多),如不想看到他就换个串口,或者交换TX/RX(官方做法)。
- RTOS SDK 的API不完整,无法使用Task列出相关函数(应该是保护专有代码用),但可列出Task总数( Station 模式下大概7个左右)。
- 26MHz 晶振对应的初始化串口分频为 74880 baud, Linux 下面就别折腾了,常用应用很难让他正确显示。
- 新版的 esptool 下载默认启用压缩传输,速度有大概20%的提升。
- 既然大家都很愉快,为啥不把下载波特率设置到921600 baud呢(
- WiFi 不见了的时候他的内部 Task 会反复尝试重连,设备不会进入 Light Sleep 等低功耗模式。需在用户代码解决。
- 不管选了什么晶振频率, esptool 都会正确下载。
- 不要被Datasheet骗了,除了 SPI 和 UART 之外的外设都是软件( GPIO Bitbanging )实现的。
- 接上条,所以任何没被占的 GPIO 口都可以被配置为 I2C ,都可以用的……
- I2C延时用了一种很难受的方式硬编码在代码里,想加速的话就替换吧……
- 多数情况下板载 CP2102 的开发板都可以处理下载时的 GPIO 下拉,所以不用手动拉下去。
- 接上条,其他的模块都必须正确设置 GPIO0/2/15 。
- 他的
gen_misc.sh
本质上是设定 Makefile 参数,稍作修改可实现一键编译下载。 - 内置 FreeRTOS 的调度器在
user_init()
之前已经启动,如需要 Task 启动即 block 请使用奇技淫巧。 - SPI 硬件只支持 Master 模式,想 Slave 的请移步 GPIO Bitbanging SPI。
- 可以 OD 输出,重复一遍,可以 OD 输出……
- CPU 发热/功耗不大,射频巨大……
- esp-open-rtos提供了非常多的example,涵盖驱动到无线的各个部分,参见examples目录。
- 接上条,还有很多外设硬件库。
- UART0如果需要连接外设的话可以交换TX和RX,避免上电打印干扰,UART1引脚由于涉及启动流程选择所以尽量不要使用。
- ……如果想到会在下面补充。