下载地址:https://pan.baidu.com/s/1-oGcJ0p-iV4WZ9d6lL0KaA
提取码:7v35
Espressif4_4_1 精简便携式 :https://download.csdn.net/download/qq_29246181/86399639
VSCode1.61_嵌入式便捷式_含必备插件:https://download.csdn.net/download/qq_29246181/86244991
一、将压缩包文件解压到C盘根目录
C:\prog
- 将[settings.json],复制到"C:\Users\用户名\AppData\Roaming\Code\User"
二、 安装VScode插件 Espressif IDF
三、编译例程,并调试
-
使用VScode打开 C:\prog\Espressif\esp-idf\examples\peripherals\gpio\generic_gpio
-
选择对应芯片型号,再执行编译
-
编译完毕后,执行烧录
-
打开观察窗口,查看串口log
第二种:更换任意盘符
需要添加的环境变量如下:
IDF_PATH D:\prog\Espressif
IDF_PYTHON_ENV_PATH %IDF_PATH%\tools\python_env\idf4.4_py3.8_env
IDF_TOOLS_PATH %IDF_PATH%\tools
PATH添加如下:
手动一次添加
%IDF_PATH%;
%IDF_TOOLS_PATH%\tools\idf-python\3.8.7;
%IDF_TOOLS_PATH%\tools\xtensa-esp32-elf\esp-2021r2-patch3-8.4.0\xtensa-esp32-elf\bin;
%IDF_TOOLS_PATH%\tools\xtensa-esp32s2-elf\esp-2021r2-patch3-8.4.0\xtensa-esp32s2-elf\bin;
%IDF_TOOLS_PATH%\tools\xtensa-esp32s3-elf\esp-2021r2-patch3-8.4.0\xtensa-esp32s3-elf\bin;
%IDF_TOOLS_PATH%\tools\riscv32-esp-elf\esp-2021r2-patch3-8.4.0\riscv32-esp-elf\bin;
%IDF_TOOLS_PATH%\tools\esp32ulp-elf\2.28.51-esp-20191205\esp32ulp-elf-binutils\bin;
%IDF_TOOLS_PATH%\tools\esp32s2ulp-elf\2.28.51-esp-20191205\esp32s2ulp-elf-binutils\bin;
%IDF_TOOLS_PATH%\tools\cmake\3.20.3\bin;
%IDF_TOOLS_PATH%\tools\openocd-esp32\v0.11.0-esp32-20211220\openocd-esp32\bin;
%IDF_TOOLS_PATH%\tools\ninja\1.10.2\;
%IDF_TOOLS_PATH%\tools\idf-exe\1.0.3\;
%IDF_TOOLS_PATH%\tools\ccache\4.3\ccache-4.3-windows-64;
%IDF_TOOLS_PATH%\tools\dfu-util\0.9\dfu-util-0.9-win64;
%IDF_TOOLS_PATH%\python_env\idf4.4_py3.8_env\Scripts;
在末尾;直接添加
%IDF_PATH%;%IDF_PATH%\tools;%IDF_TOOLS_PATH%\tools\idf-python\3.8.7;%IDF_TOOLS_PATH%\tools\xtensa-esp32-elf\esp-2021r2-patch3-8.4.0\xtensa-esp32-elf\bin;%IDF_TOOLS_PATH%\tools\xtensa-esp32s2-elf\esp-2021r2-patch3-8.4.0\xtensa-esp32s2-elf\bin;%IDF_TOOLS_PATH%\tools\xtensa-esp32s3-elf\esp-2021r2-patch3-8.4.0\xtensa-esp32s3-elf\bin;%IDF_TOOLS_PATH%\tools\riscv32-esp-elf\esp-2021r2-patch3-8.4.0\riscv32-esp-elf\bin;%IDF_TOOLS_PATH%\tools\esp32ulp-elf\2.28.51-esp-20191205\esp32ulp-elf-binutils\bin;%IDF_TOOLS_PATH%\tools\esp32s2ulp-elf\2.28.51-esp-20191205\esp32s2ulp-elf-binutils\bin;%IDF_TOOLS_PATH%\tools\cmake\3.20.3\bin;%IDF_TOOLS_PATH%\tools\openocd-esp32\v0.11.0-esp32-20211220\openocd-esp32\bin;%IDF_TOOLS_PATH%\tools\ninja\1.10.2\;%IDF_TOOLS_PATH%\tools\idf-exe\1.0.3\;%IDF_TOOLS_PATH%\tools\ccache\4.3\ccache-4.3-windows-64;%IDF_TOOLS_PATH%\tools\dfu-util\0.9\dfu-util-0.9-win64;%IDF_TOOLS_PATH%\python_env\idf4.4_py3.8_env\Scripts;
三 使idf支持c++17
x\Espressif\tools\cmake\build.cmake
四 不定长接收串口数据
x\Espressif\components\driver\uart.c
//read any size, only added two line to fucntion uart_read_bytes, marked with mk
int uart_read_frame(uart_port_t uart_num, uint8_t* buf, TickType_t ticks_to_wait) {
//mk: set to 1 so that it will pass the while
uint32_t length = 1;
uint8_t* data = NULL;
size_t size;
size_t copy_len = 0;
int len_tmp;
if(xSemaphoreTake(p_uart_obj[uart_num]->rx_mux,(portTickType)ticks_to_wait) != pdTRUE) {
return -1;
}
while(length) {
if(p_uart_obj[uart_num]->rx_cur_remain == 0) {
data = (uint8_t*) xRingbufferReceive(p_uart_obj[uart_num]->rx_ring_buf, &size, (portTickType) ticks_to_wait);
//mk: get actual length received
length = p_uart_obj[uart_num]->rx_buffered_len;
if(data) {
p_uart_obj[uart_num]->rx_head_ptr = data;
p_uart_obj[uart_num]->rx_ptr = data;
p_uart_obj[uart_num]->rx_cur_remain = size;
} else {
//When using dual cores, `rx_buffer_full_flg` may read and write on different cores at same time,
//which may lose synchronization. So we also need to call `uart_check_buf_full` once when ringbuffer is empty
//to solve the possible asynchronous issues.
if(uart_check_buf_full(uart_num)) {
//This condition will never be true if `uart_read_bytes`
//and `uart_rx_intr_handler_default` are scheduled on the same core.
continue;
} else {
xSemaphoreGive(p_uart_obj[uart_num]->rx_mux);
return copy_len;
}
}
}
if(p_uart_obj[uart_num]->rx_cur_remain > length) {
len_tmp = length;
} else {
len_tmp = p_uart_obj[uart_num]->rx_cur_remain;
}
memcpy((uint8_t *)buf + copy_len, p_uart_obj[uart_num]->rx_ptr, len_tmp);
UART_ENTER_CRITICAL(&(uart_context[uart_num].spinlock));
p_uart_obj[uart_num]->rx_buffered_len -= len_tmp;
uart_pattern_queue_update(uart_num, len_tmp);
p_uart_obj[uart_num]->rx_ptr += len_tmp;
UART_EXIT_CRITICAL(&(uart_context[uart_num].spinlock));
p_uart_obj[uart_num]->rx_cur_remain -= len_tmp;
copy_len += len_tmp;
length -= len_tmp;
if(p_uart_obj[uart_num]->rx_cur_remain == 0) {
vRingbufferReturnItem(p_uart_obj[uart_num]->rx_ring_buf, p_uart_obj[uart_num]->rx_head_ptr);
p_uart_obj[uart_num]->rx_head_ptr = NULL;
p_uart_obj[uart_num]->rx_ptr = NULL;
uart_check_buf_full(uart_num);
}
}
xSemaphoreGive(p_uart_obj[uart_num]->rx_mux);
return copy_len;
}