ESP32-USB Serial/JTAG Controller使用

这篇具有很好参考价值的文章主要介绍了ESP32-USB Serial/JTAG Controller使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

ESP32-c3内部带有1个USB Serial/JTAG控制器,可用于下载flash程序、JTAG调试、虚拟串口通信等功能。硬件框图如下:
esp32 c3 usb,# ESP32,单片机
其主要特性如下:

  • 支持usb全速设备(12Mbps),不支持高速(480Mbps)
  • 固定为CDC-ACM设备(Communication Device Class - Abstract Control Model)
  • 64byte硬件缓冲区
  • 大多数操作系统即插即用

CDC-ACM功能描述

由下表可见,ESP32-C3只能响应主机设置RTS/DTR指令,以实现芯片复位和程序下载,设置波特率无效。
esp32 c3 usb,# ESP32,单片机
RTS/DTR状态说明:
esp32 c3 usb,# ESP32,单片机
esp32-c3通过内部APB总线与CDC-ACM连接,cpu通过读写寄存器判断USB_SERIAL_JTAG_SERIAL_OUT_EP_DATA_AVAIL1(表示接收buf有数据)接收主机发来的数据;并可通过判断USB_REG_SERIAL_IN_EP_DATA_FREE1(表示发送buf未满)可向发送buf写入数据,随后设置USB_SERIAL_JTAG_WR_DONE==1,以发送buf数据到主机。

环境说明

  • 软件采用IDF4.4.2版本
  • 硬件采用esp32-c3芯片
  • 硬件需具备usb和uart接口,uart配置用于控制台打印信息

注意: 使用该功能前需要禁止控制台打印到USB,否则控制台打印信息会和usb打印信息混在一起,配置如下:
esp32 c3 usb,# ESP32,单片机

硬件查询方式使用

关键函数说明

#include "hal/usb_serial_jtag_ll.h"

//检测接收buf是否有数据
static inline int usb_serial_jtag_ll_rxfifo_data_available(void)//返回:0-没数据  1-有数据

//从接收buf读取数据,返回值:实际接收的字节数
static inline int usb_serial_jtag_ll_read_rxfifo(
		uint8_t *buf, //接收数据指针
		uint32_t rd_len)//读取长度,最大64,当设置为最大值64时,会将接收buf读空,并返回读取的实际字节数

//写数据到发送buf
static inline uint32_t usb_serial_jtag_ll_write_txfifo(
		const uint8_t *buf, //发送数据指针
		uint32_t wr_len)//写入长度,最大64,如果写入过程中,发送buf满了,则函数退出并返回写入的实际字节数

//刷新发送buf
static inline void usb_serial_jtag_ll_txfifo_flush(void)//即发送buf数据到主机

示例代码

本示例代码采用uart0输出调试信息,基本功能是将usb发来的任意数据进行环回发出。该代码采用单任务循环检查接收buf,占用cpu资源,后期改成中断形式更佳,代码如下:

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"

#include "string.h"
#include "hal/usb_serial_jtag_ll.h"

void mytask1(void *pvParameter)
{
    uint8_t *rxbuf;
    int cnt;
    rxbuf = (uint8_t *)malloc(64);
    int rxcnt;
    while (1)
    {
        if (usb_serial_jtag_ll_rxfifo_data_available())//等待接收buf非空
        {
            rxcnt = usb_serial_jtag_ll_read_rxfifo(rxbuf, 64);//接收buf中的所有数据
            cnt = (int)usb_serial_jtag_ll_write_txfifo((const uint8_t *)rxbuf, rxcnt);//将接收数据回环发送
            usb_serial_jtag_ll_txfifo_flush();//刷新发送buf
            printf("Send %d characters to host \n", cnt);//在调试串口打印发送的数量
        }
        vTaskDelay(pdMS_TO_TICKS(10));
    }
    free(rxbuf);//与malloc成对使用
    vTaskDelete(NULL);
}
void app_main(void)
{
    xTaskCreate(mytask1, "mytask1", 1024 * 5, NULL, 1, NULL);

}

效果:
在调试接口打印信息:

Send 11 characters to host
Send 11 characters to host
Send 11 characters to host
Send 11 characters to host
Send 11 characters to host
Send 11 characters to host

在usb接口打印信息如下:

[21:28:37.884]发→◇hello world□
[21:28:37.884]收←◆hello world
[21:28:38.888]发→◇hello world□
[21:28:38.888]收←◆hello world
[21:28:39.886]发→◇hello world□
[21:28:39.886]收←◆hello world

官方中断方式使用

关键函数说明

包含头文件

#include "driver/usb_serial_jtag.h"

安装卸载驱动

由于硬件buf为64byte,环形buf至少应能容纳主机一次发送的最大64byte数据,因此其大小应大于64字节。

//环形buf配置结构体
usb_serial_jtag_driver_config_t usb_cdc = {
    .rx_buffer_size = 65, //环形buf应大于64
    .tx_buffer_size = 65  //环形buf应大于64
};
//安装usb_serial_jtag驱动
esp_err_t usb_serial_jtag_driver_install(usb_serial_jtag_driver_config_t *usb_serial_jtag_config)//参数为环形buf配置的结构体地址

//卸载usb_serial_jtag驱动
esp_err_t usb_serial_jtag_driver_uninstall(void)

收发数据

收发数据函数实际读写环形buf,该驱动安装后会启用中断,对接收来说,当有数据到来时触发中断,并从硬件buf拷贝数据到环形buf。
当环形buf溢出时,主机仍能够发送数据,但会导致数据丢失。

//接收主机发送的数据,返回值为接收到的数据量
int usb_serial_jtag_read_bytes(
		void* buf, //接收数据指针
		uint32_t length, //接收数据长度
		TickType_t ticks_to_wait)//超时时间,portMAX_DELAY表示永久阻塞

//向主机发送数据,返回值为实际发送的数据量
int usb_serial_jtag_write_bytes(
		const void* src, //发送数据指针
		size_t size, //发送数据大小
		TickType_t ticks_to_wait)//超时时间,portMAX_DELAY表示永久阻塞

示例程序

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"

#include "string.h"
#include "driver/usb_serial_jtag.h"

void mytask1(void *pvParameter)
{
    uint8_t *rxbuf;
    int sendcnt;
    rxbuf = (uint8_t *)malloc(64);
    int rxcnt;
    while (1)
    {
        rxcnt = usb_serial_jtag_read_bytes((void *)rxbuf, 10, portMAX_DELAY); //阻塞当前任务,直到接收数据
        sendcnt = (int)usb_serial_jtag_write_bytes((const void *)rxbuf, rxcnt, portMAX_DELAY);
        printf("task1: Send %d characters to host \n", sendcnt);
        //vTaskDelay(pdMS_TO_TICKS(1000));
    }
    free(rxbuf); //释放缓冲区
}

void app_main(void)
{
    usb_serial_jtag_driver_config_t usb_cdc = {
        .rx_buffer_size = 65, //环形buf应大于64
        .tx_buffer_size = 65  //环形buf应大于64
    };
    TaskHandle_t task1_handler;
    ESP_ERROR_CHECK(usb_serial_jtag_driver_install(&usb_cdc)); //安装usb_serial驱动
    xTaskCreate(mytask1, "mytask1", 1024 * 5, NULL, 1, &task1_handler);
    printf("start loop back \n ");
    vTaskDelay(pdMS_TO_TICKS(30000)); //运行30s后退出任务1
    vTaskDelete(task1_handler);
    usb_serial_jtag_driver_uninstall(); //卸载usb_serial驱动
    printf("stop loop back \n ");
}

该程序在任务1中对usb接口进行了数据回环,启动后,主机可通过usb虚拟串口收发数据。

为验证环形buf溢出的情况,将任务1中的1s延迟打开,模拟处理时间,主机循环每10ms发1包数据,结果如下:

esp32 c3 usb,# ESP32,单片机
环形buf只开了65个字节,因此返回大量数据丢失。调试接口打印信息为:

start loop back
task1: Send 10 characters to host
task1: Send 10 characters to host
task1: Send 10 characters to host
task1: Send 10 characters to host
task1: Send 10 characters to host
task1: Send 10 characters to host
task1: Send 5 characters to host
task1: Send 7 characters to host
stop loop back文章来源地址https://www.toymoban.com/news/detail-704870.html

到了这里,关于ESP32-USB Serial/JTAG Controller使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ESP32之旅】ESP32C3 Arduino库使用方法

    目前官方已经支持了ESP32C3 的部分功能,可以在其官方wiki中看到: 官方提供了两个版本的安装连接,release和Dev。其中Release为稳定发布版本,Dev版本则支持更多的新特性。 Stable release link: Development release link: 安装方法也非常简单,打开Arduino IDE 然后在 文件 - 首选项 : 在附加

    2024年02月02日
    浏览(49)
  • 微信小程序可自定义单片机温湿度阈值(基于esp32c3+onenet+微信小程序)

    ​ 前段时间有个粉丝问我能不能出一个微信小程序调节阈值的教程,我就下班之余在原来的基础上改进一下,因为是修改阈值,这里我就用继电器控制风扇、温度达到一定阈值控制风扇启动来做例子。这个成功了,其他阈值修改都是依样画葫芦啦。 ​ 之前博客 :基于物联网

    2024年02月07日
    浏览(38)
  • 手把手使用Micropython+合宙Esp32c3(驱动安装,为合宙Esp32c3安装Micropython固件库,代码上传到ESP32C3中)含Thonny和vscode两种方法

    CH343驱动下载 下载最新版本就好 驱动下载好后,以管理员身份运行,并点击“安装” 安装完成之后连接设备就可以在设备管理器中看到自己设备及端口 MicroPython 是一种精简版的 Python 语言实现,专门用于嵌入式系统和物联网设备。它提供了一个适用于微控制器的交互式解释

    2024年02月10日
    浏览(62)
  • 物联网开发笔记(87)- 使用Micropython开发ESP32开发板之烧录合宙ESP32C3开发板

    一、目的         这一节我们学习如何使用我们的ESP32开发板来学习合宙ESP32C3开发板,该开发板有两种:一种是带串口通讯的,一种是通过使用USB通讯接口的。  二、环境         ESP32 + 合宙ESP32C3开发板 + USB转type-C线  + Win10 接线方法:         开发板通过USB线插到

    2024年02月14日
    浏览(50)
  • Conmi的正确答案——使用eclipse进行ESP32C3的debug

    eclipse IDE 版本:2023-12 参考大神的教程:【图文】手把手教你使用 Eclipse IDE 开发 ESP32 (这里是为了我下次回来速通才写的部分) 相关软件参数: 汉化(安装完成会提示重启应用): Name: Chinese Location: https://mirrors.nju.edu.cn/eclipse/technology/babel/update-site/latest/ 乐鑫(选中两个

    2024年01月19日
    浏览(42)
  • 新上架的简约版合宙ESP32C3使用arduino开发的教程

    经过两个月的缺货下架后,9块9包邮的合宙ESP32C3又重新上架了,真香。这一批都是没有带串口芯片的简约版(9块9要啥自行车)。在下架前,简约版要使用2.0.0版本的ESP32开发板库才能下载,而2.0.0版本有一些丢失arduino自带库的诡异BUG,所以一直没法用于下载。现在由于发布了2

    2024年02月05日
    浏览(87)
  • ESP32-C2开发板 ESP8684芯片 兼容ESP32-C3开发

    C2是一个芯片采用4毫米x 4毫米封装,与272 kB内存。它运行框架,例如ESP-Jumpstart和ESP造雨者,同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统,受到了全球用户的信赖。它由支持Espressif以及所有ESP32芯片的社区。ESP32-C2的ROM代码经过优化,减少了对

    2024年02月14日
    浏览(37)
  • 安信可 ESP_01SWIFI模块的使用 (电脑通过usb转tll模块连接wifi模块进行调试)

    一:需要用到的模块          (1)安信可的ESP_01wifi模块                        ESP-01是深圳安信可科技基于ESP8266芯片开发的串口wifi模块,模组集成了透传功能,即买即用,支持串口指令集,用户通过串口即可实现网络访问。           (2)usb转tll模块      

    2024年04月22日
    浏览(33)
  • 物联网开发笔记(89)- 使用Micropython开发ESP32开发板之合宙ESP32 C3开发板通过串口SPI控制st7789 TFT液晶屏1.3寸

    一、目的         这一节我们学习如何使用合宙的ESP32 C3开发板控制1.3寸彩色TFT显示屏模块,分辨率240*240,SPI接口,ST7789驱动芯片。 二、环境         ESP32  C3 + Thonny + 1.3寸 st7789液晶屏模块 + 几根杜邦线 + Win10 接线方法:   三、st7789 TFT显示屏驱动 st7789py.py   四、点亮

    2024年02月11日
    浏览(50)
  • 烧录esp32遇到No serial data received

    玩一个没人用的esp32,烧录时遇到错误No serial data received,   在网上搜啥要我EN脚接高电平,才可以烧录,然后我去看原理图EN在9号引脚,尴尬的是我找不到芯片9号角,找了半天。。。,然后我朋友又给我一块一样芯片的esp32,只是这个没串口通信,需要外置串口,我刚好有外

    2024年01月19日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包