前期准备工作
1、更新Python3版本
python版本必须在3.8.x以上,否则莫名奇妙的错。
2、安装pip
sudo apt install python-pip
python -m pip install pyyaml xlrd
注意这里有python和python3的问题,缺什么就装什么。
具体步骤
//============================================================
环境:Ubuntu20
Step 1
git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git
Step 2
git clone https://gitee.com/EspressifSystems/esp-idf.git
或:指定版本
git clone -b release/v4.3 https://gitee.com/EspressifSystems/esp-idf.git
Step 3 更新 submodules
方式一:
进入 esp-gitee-tools 目录,export submodule-update.sh 所在路径,方便后期使用,如:
cd esp-gitee-tools
export EGT_PATH=$(pwd)
进入 esp-idf 目录执行 submodule-update.sh 脚本:
cd esp-idf
$EGT_PATH/submodule-update.sh
方式二:
submodule-update.sh
脚本支持将待更新 submodules 的工程路径作为参数传入,例如:submodule-update.sh PATH_OF_PROJ
。
假如 Step 2 中 clone 的 esp-idf 位于 ~/git/esp32-sdk/esp-idf 目录,可使用以下方式来更新:
cd esp-gitee-tools
./submodule-update.sh ~/git/esp32-sdk/esp-idf
//============================================================
1、通过ssh拉取esp-idf源码(下载压缩包解压不可以)
git clone -b release/v4.2 git@github.com:espressif/esp-idf.git
2、安装一些必要的工具
cd ~/esp/esp-idf
export IDF_GITHUB_ASSETS="dl.espressif.com/github_assets"
./install.sh esp32
. ./export.sh
配置环境变量
获取esp-idf当前路径
hulyi@FS-DS-SW-DAVID:/mnt/d/ESP32/ESP_AT/esp-idf$ pwd
/mnt/d/ESP32/ESP_AT/esp-idf
vim ~/.bashrc
alias get_idf='. $HOME/esp/esp-idf/export.sh'
export IDF_PATH=/mnt/d/ESP32/ESP_AT/esp-idf
source ~/.bashrc
3、尝试编译自带工程
cd examples/get-started/hello_world/
make
make clean
如果有build.py,执行
./build.py menuconfig
./build.py build
4、回退到ESP_AT目录下
添加esp-idf路径
vim ~/.profile
export IDF_PATH=~/ESP_AT/esp-idf
export PATH="$IDF_PATH/tools:$PATH"
source ~/.profile
5、通过ssh下载esp-at源代码
git clone -b release/v2.2.0.0_esp32 git@github.com:espressif/esp-at.git
6、把esp-idf 拷贝到esp-at文件夹中
cp -r esp-idf/ esp-at
cd esp-at
7、在当前窗口使用ESP-IDF
cd esp-at
. $HOME/ESP_AT/esp-idf/export.sh
cd ..
7.1、可以在任何终端窗口中运行 get_idf
来设置或刷新 esp-idf 环境
vim ~/.bashrc
alias get_idf='. $HOME/ESP_AT/esp-idf/export.sh
source ~/.bashrc
此操作将清除并初始化项目之前的编译和配置(刚买回的模组,不进行此操作,程序烧录成功后会无限重启)
idf.py set-target esp32
hulyi@FS-DS-SW-DAVID:/mnt/d/ESP32/ESP_AT/esp-at$ ./build.py menuconfig
Platform name:
1. PLATFORM_ESP32
2. PLATFORM_ESP8266
3. PLATFORM_ESP32S2
4. PLATFORM_ESP32C3
choose(range[1,4]):1
Module name:
1. WROOM-32
2. WROVER-32
3. PICO-D4
4. SOLO-1
5. MINI-1 (description: ESP32-U4WDH chip inside)
6. ESP32-D2WD (description: 2MB flash, No OTA)
7. ESP32_QCLOUD (description: QCLOUD TX:17 RX:16)
choose(range[1,7]):2
Enable silence mode to remove some logs and reduce the firmware size?
0. No
1. Yes
choose(range[0,1]):0
....
....
此步骤可能遇到的问题
1、找不到cmake
sudo apt install cmake
cmake --version
8、编译
./build.py build
9、烧录
./build.py -p (PORT) flash
9.1、在 Linux 中添加用户到 dialout
当前登录用户应当可以通过 USB 对串口进行读写操作。在多数 Linux 版本中,您都可以通过以下命令,将用户添加到 dialout 组,从而获许读写权限:
sudo usermod -a -G dialout $USER
reboot 重启后生效
请重新登录,确保串口读写权限生效。
重启后无用
sudo chmod -R 777 /dev/ttyUSB0
9.2、烧录固件
开发板使用串口连接到Linux主机,在linux下串口设备号以 /dev/tty
开始,通过插拔前后的不同找出设备号:
找出设备号后,使用下面的命令烧录:
idf.py -p /dev/ttyUSB0 flash
打开监视器
idf.py -p PORT flash monitor
可使用快捷键 Ctrl+]
,退出 IDF 监视器。
重打开工程
1、在esp-at路径下执行
. $HOME/ESP_AT/esp-idf/export.sh
或 get_idf (前提是配置了别名 步骤7.1)
2、build
./build.py build
3、如果失败,可尝试(此操作将清除并初始化项目之前的编译和配置)
./build.py set-target esp32
硬件连接
此模组烧录用usb
AT指令发送通过usb->ttl连接引脚
ESP-AT 二次开发
说明:此次工作是要将Quecthing移植到ESP-AT工程中。
在ESP-AT工程中的更改点会在程序后加 /*adapter:*/
在ESP-AT中添加一个组件quecSDK,用于存放Quecthing结构
注:在ESP-AT工程最外层的 CMakeLists.txt 中添加一下代码(不加会编译不过)
set(EXTRA_COMPONENT_DIRS ./quecSDK) #/*adapter:*/
-ESP-AT/
-quecSDK/
-Inc/
-test.h
-Src
-test.c
CMakeLists.txt
quecthing.mk
test.h
#ifndef __TEST_H__
#define __TEST_H__
void test_func(void);
#endif
test.c
#include <stdio.h>
#include "test.h"
void test_func(void)
{
printf("This is a test!\r\n");
}
CMakeLists.txt
idf_component_register(SRCS "./Src/test.c"
INCLUDE_DIRS "./Inc")
quecthing.mk
QUECTHING_ADD_INCLUDEDIRS := Inc
QUECTHING_SRCDIRS := Src
此结构已完整,在ESP-AT工程的主函数中创建一个任务,延时1s调用test_func();
-app_main.c
void test_task(void)
{
while(1)
{
test_func();
vTaskDelay(1000);
}
}
void app_main()
{
//...
//...
xTaskCreate(test_task , "at_sdio_recv_task" , 4096 , NULL , 2 , NULL);
}
移植Quecthing
过程
quecSDK/CMakeLists.txt
file(GLOB_RECURSE srcs *.c)
idf_component_register(SRCS ${srcs}
INCLUDE_DIRS "."
"./cloud"
"./cloud/at"
"./cloud/common"
"./cloud/mqtt"
"./driverLayer"
"./kernel"
"./thirdLib/mqtt"
REQUIRES "components"
)
遇到的问题
1、在esp-at文件夹下创建quecSDK文件夹用于存放quecthing,在做适配层的时候,qhal_Dev.c中需要调用esp-at/components/at/include/esp_at_core.h中声明的API,然后会报 .h文件找不到。
解决:在quecSDK的CMakeLists.txt文件中添加components的组件依赖。
REQUIRES "components"
参见上面CMakeLists.txt中的添加位置。
2、esp-at 发送AT指令时,后面要加回车换行
但是在发送透传数据时,数据后不能加
AT+QIOTSEND=1,3 //后边要加回车换行。当发送AT指令没反应时,首先考虑是不是这个问题, //忘了加回车换行
>
123 //发送这个数据时后边不能加
3、received_len += esp_at_port_read_data(buf + received_len, buf_len - received_len);
因 esp_at_port_read_data 读取的数据最大长度不知道,所以要在循环里读取设备的数据,读完才可以。
4、切换ESP32的WiFi后,重连不上,先考虑是不是WiFi名和密码设置错误,不要加双引号。
5、esp32 使用mqtt连接登录不上
经过查看代码日志,发现创建完socket后,传入read函数的sockFD传成了其地址。 :(
宏开关的应用
使用宏开关,需要在工程根目录下的CMakeLists.txt文件中操作:
esp-at/CMakeLists.txt
option(VERSION_FIRMWARE "VERSION_FIRMWARE ENABLE" ON)
option(QUEC_ENABLE_AT "AT ENABLE" ON)
option(CLOUD_ENABLE_QUEC_LAN "LAN ENABLE" ON)
option(CLOUD_ENABLE_QUEC_MQTT "MQTT ENABLE" ON)
option(THIRDLIB_ENABLE_MBEDTLS "MBEDTLS ENABLE" ON)
configure_file ("$ENV{ESP_AT_PROJECT_PATH}/components/quecSDK/config.h.in"
"$ENV{ESP_AT_PROJECT_PATH}/components/quecSDK/config.h")
如果没有定义option中相关宏的值为ON,则生成的为#undef XXXX。
在quecSDK文件夹下创建文件 config.h.in
#cmakedefine VERSION_FIRMWARE "1_0_0"
#cmakedefine QUEC_ENABLE_AT
#cmakedefine CLOUD_ENABLE_QUEC_LAN
#cmakedefine CLOUD_ENABLE_QUEC_MQTT
#cmakedefine THIRDLIB_ENABLE_MBEDTLS
运行后会在configure_file()的第二个参数路径下生成config.h文件。
在使用到宏的文件中添加头文件config.h。
内存分区表修改
quec_partitions_table.csv
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
phy_init,data,phy,0xf000,4K,
otadata,data,ota,0x10000,8K,
nvs,data,nvs,0x12000,48K,
quec_cfg,data,fat,0x1e000,4K,
quec_cfg_bak,data,fat,0x1f000,4K,
at_customize,64,0,0x20000,896K,
ota_0,app,ota_0,0x100000,1536K,
ota_1,app,ota_1,0x280000,1536K,
Create factory bin...
0x8000,partition_table/partition-table.bin
0x10000,ota_data_initial.bin
0xf000,phy_init_data.bin
0x1000,bootloader/bootloader.bin
0x100000,esp-at.bin
0x20000,at_customize.bin
0x21000,customized_partitions/ble_data.bin
0x24000,customized_partitions/server_cert.bin
0x26000,customized_partitions/server_key.bin
0x28000,customized_partitions/server_ca.bin
0x2a000,customized_partitions/client_cert.bin
0x2c000,customized_partitions/client_key.bin
0x2e000,customized_partitions/client_ca.bin
0x37000,customized_partitions/mqtt_cert.bin
0x39000,customized_partitions/mqtt_key.bin
0x3b000,customized_partitions/mqtt_ca.bin
0x30000,customized_partitions/factory_param.bin
Create /home/esp-at/ESP_AT/esp-at/build/factory/factory_WROOM-32.bin for WROOM-32 finished
生成二进制分区表
./build.py partition_table
idf.py partition_table
./build.py -p /dev/ttyUSB0 partition_table-flash
idf.py -p /dev/ttyUSB0 partition_table-flash
注:执行完 ./build.py set-target esp32 esp32 后,分区表的配置会重置为默认,需要重新配置。
移植过程中对 menuconfig 的一些配置
1、使用mqtts连接DMP时,握手时,看到握手函数的宏开关需要一些配置:
2
任务打印需要一些配置
void state_task(void *pvParameters)
{
static char InfoBuffer[512] = {0};
while (1)
{
vTaskList((char *)&InfoBuffer);
printf("+---------------+------+--------+---------+\r\n");
printf("\r\n%s\r\n", InfoBuffer);
vTaskDelay(8000);
}
vTaskDelete(NULL);
}
注意:
使用 vTaskList() 前需使能:
make menuconfig -> Component config -> FreeRTOS -> Enable FreeRTOS trace facility
make menuconfig -> Component config -> FreeRTOS -> Enable FreeRTOS trace facility -> Enable FreeRTOS stats formatting functions
通过上面配置,等同于使能 FreeRTOSConfig.h 中如下两个宏:
configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS
BLE
问题:
1、蓝牙配置ssid和password时:
ssid和password不加引号