打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

下载地址: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
在这里插入图片描述

  1. 将[settings.json],复制到"C:\Users\用户名\AppData\Roaming\Code\User"
    2.

二、 安装VScode插件 Espressif IDF

在这里插入图片描述
在这里插入图片描述

三、编译例程,并调试

  1. 使用VScode打开 C:\prog\Espressif\esp-idf\examples\peripherals\gpio\generic_gpio

  2. 选择对应芯片型号,再执行编译在这里插入图片描述
    在这里插入图片描述

  3. 编译完毕后,执行烧录在这里插入图片描述
    在这里插入图片描述

  4. 打开观察窗口,查看串口log在这里插入图片描述
    在这里插入图片描述

第二种:更换任意盘符

  1. 便携式vscode v1.69.1,集成嵌入式常用插件(解压即用) 下载
  2. 便携式Espressif v4.4.1,解压后,编写环境变量即可。下载:

需要添加的环境变量如下:
在这里插入图片描述
方法一,依次添加
方法二,末尾直接粘贴

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;
}

posted on 2022-08-13 11:00  xuejianqiang  阅读(417)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033