rt-thread使用cherryusb实现虚拟串口

版本

rt-thread5.1.0标准版

keil

stm32cubemax 6.12.1

stm32f205vet6

env 1.5.2

代码优化等级0

cherryusb v1.4.1

操作流程

1.使用cubemax配置usb,全速,仅设备,使能USB中断

请添加图片描述

2.配置usb device,选择虚拟串口CDC

请添加图片描述

3.添加usb后,时钟树需要重新配置。配置完成后,点击生成代码。

请添加图片描述

4.由于时钟配置发生变化,将cubemax生成的main.c中的时钟配置拷贝到board.c中,进行替换

5.使用env配置cherryusb,保存配置,执行pkgs --update更新软件包

Enable usb device mode
	Select usb device speed(FS)
		FS
	Select usb device ip
		dwc2_st
	Enable usb cdc acm device
	Select usb device template
		cdc_acm

请添加图片描述

6.在软件版目录下,找到usb的配置文件,拷贝到工程目录下(为了方便直接拷贝到board目录下),并修改名称为usb_config.h
请添加图片描述

请添加图片描述

7.在env执行scons --target=mdk5,重新生成keil工程,将编译器修改为AC6,编译整个工程

请添加图片描述

8.在board.c文件中:(1)实现usb的底层初始化函数,将usbd_conf.c文件中void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle)和void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle)两个函数拷贝到board.c中,分别修改函数名为void usb_dc_low_level_init(uint8_t busid)和void usb_dc_low_level_deinit(uint8_t busid)。(2)添加中断处理函数。

void usb_dc_low_level_init(uint8_t busid)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */

    /* USER CODE END USB_OTG_FS_MspInit 0 */

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USB_OTG_FS GPIO Configuration
    PA11     ------> USB_OTG_FS_DM
    PA12     ------> USB_OTG_FS_DP
    */
    GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __HAL_RCC_USB_OTG_FS_CLK_ENABLE();

    /* Peripheral interrupt init */
    HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
    /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */

    /* USER CODE END USB_OTG_FS_MspInit 1 */
}

void usb_dc_low_level_deinit(uint8_t busid)
{
    /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */

    /* USER CODE END USB_OTG_FS_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_USB_OTG_FS_CLK_DISABLE();

    /**USB_OTG_FS GPIO Configuration
    PA11     ------> USB_OTG_FS_DM
    PA12     ------> USB_OTG_FS_DP
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12);

    /* Peripheral interrupt Deinit*/
    HAL_NVIC_DisableIRQ(OTG_FS_IRQn);

    /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */

    /* USER CODE END USB_OTG_FS_MspDeInit 1 */
}

void OTG_FS_IRQHandler(void)
{
  /* USER CODE BEGIN OTG_FS_IRQn 0 */

  /* USER CODE END OTG_FS_IRQn 0 */
//  HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
	extern void USBD_IRQHandler(uint8_t busid);
	USBD_IRQHandler(0);
  /* USER CODE BEGIN OTG_FS_IRQn 1 */

  /* USER CODE END OTG_FS_IRQn 1 */
}

9.修改usb_config.h文件

/* 添加头文件 */
#include <rtthread.h>

/* 更换为rt-thread中的打印函数 */
#define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__)

/* 将CONFIG_USBDEV_EP_NUM由8修改为4 */
#ifndef CONFIG_USBDEV_EP_NUM
#define CONFIG_USBDEV_EP_NUM 4
#endif

10.在main.c文件中添加测试函数

int main(void)
{
    extern void cdc_acm_init(uint8_t busid, uintptr_t reg_base);
	cdc_acm_init(0, USB_OTG_FS_PERIPH_BASE);

    while (1)
    {
        extern void cdc_acm_data_send_with_dtr_test(uint8_t busid);
		cdc_acm_data_send_with_dtr_test(0);
        rt_thread_mdelay(500);
    }

    return RT_EOK;
}

11.参照cubemax中的值修改VID和PID

请添加图片描述

12.编译程序,烧录代码,在设备管理器中可以看到USB被正确识别,在shell串口打印如下内容:

 \ | /
- RT -     Thread Operating System
 / | \     5.1.0 build Nov 18 2024 18:53:53
 2006 - 2024 Copyright by RT-Thread team
[I/USB] ========== dwc2 udc params ==========
[I/USB] CID:00001200
[I/USB] GSNPSID:4f54281a
[I/USB] GHWCFG1:00000000
[I/USB] GHWCFG2:229dcd20
[I/USB] GHWCFG3:020001e8
[I/USB] GHWCFG4:0ff08030
[I/USB] dwc2 fsphy type:1, hsphy type:0, dma support:0
[I/USB] dwc2 has 4 endpoints and dfifo depth(32-bit words) is 512, default config: 4 endpoints
[I/USB] =================================
msh >[I/USB] fifo0 size:0010, offset:0100
[I/USB] fifo1 size:0010, offset:0110
[I/USB] fifo2 size:0010, offset:0120
[I/USB] fifo3 size:0010, offset:0130

13.打开串口助手,选中usb串口,勾选DTR,打开串口,可以看到串口不断接收字节,并且在shell窗口中不断显示接收到字节。

请添加图片描述

14.资源占用

ROM : 56k -> 102K = 46k

RAM:7321 -> 7321 = 0

### RT-Thread虚拟串口使用与配置 #### 配置环境 为了在 RT-Thread实现使用虚拟串口功能,需要先完成开发环境的搭建以及必要的硬件支持。RT-Thread 是一款实时操作系统,其生态系统提供了丰富的组件来简化嵌入式系统的开发工作[^1]。 #### 版本兼容性 确保使用RT-Thread 版本支持所需求的功能模块。例如,在版本 `v5.1.0` 及之后的版本中引入了许多新特性和支持,因此建议开发者优先选用较新的稳定版以获得更好的体验和更全面的支持[^2]。 #### 实现虚拟串口的关键步骤 以下是基于 CherryUSB虚拟串口实现方法: 1. **初始化 USB 设备栈** 在项目中启用 USB 功能,并通过调用特定 API 来设置 CDC ACM 类型设备。CDC(Communication Device Class)定义了一种标准接口用于数据通信;ACM(Abstract Control Model)则进一步细化了针对串行端口的行为模式。 ```c extern void cdc_acm_init(uint8_t busid, uintptr_t reg_base); cdc_acm_init(0, USB_OTG_FS_PERIPH_BASE); ``` 2. **发送数据逻辑构建** 创建循环结构定期向主机传输信息片段。这里展示了一个简单的例子,其中每间隔半秒执行一次操作并向连接的计算机模拟终端写入字符流。 ```c while (1) { extern void cdc_acm_data_send_with_dtr_test(uint8_t busid); cdc_acm_data_send_with_dtr_test(0); rt_thread_mdelay(500); } ``` 3. **集成至主线程或其他任务流程里** 将上述代码片段整合到应用程序入口处或者独立的任务单元之中运行起来即可形成完整的解决方案[^3]。 #### 注意事项 - 确认目标板卡具备相应的物理资源比如 USB OTG 接口及其驱动程序已被正确加载。 - 如果遇到编译错误可能是因为缺少某些头文件声明或者是链接库未指定完全等问题需仔细排查解决办法。 ```python print("Virtual COM port configured successfully.") ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值