stm32cubx-usb-cdc配置

stm32cubx-usb-cdc


发布版本: 1.0

文件密级: 公开资料


前言
概述

读者

本文档(本指南)主要使用于以下工程师:

软件开发工程师

产品版本 修订记录

日期版本作者/邮箱修订说明
2019-10-5V1.0wingceltis-c / wingceltis@aliyun.com初始版本

1. 简介

USB的CDC类是USB通信设备类 (Communication Device Class)的简称。CDC类是USB组织定义的一类专门给各种通信设备(电信通信设备和中速网络通信设备)使用的USB子类。根据CDC类所针对通信设 备的不同,CDC类又被分成以下不同的模型:USB传统纯电话业务(POTS)模型,USB ISDN模型和USB网络模型。其中,USB传统纯电话业务模型,有可分为直接线控制模型(Direct Line Control Model)、抽象控制模型(Abstract Control Model)和USB电话模型(USB Telephone Model),如图1所示。本文所讨论的虚拟串口就属于USB传统纯电话业务模型下的抽象控制模型。

通常一个CDC类又由两个接口子类组成通信接口类(Communication Interface Class)和数据接口类(Data Interface Class)。笔者主要通过通信接口类对设备进行管理和控制,而通过数据接口类传送数据。这两个接口子类占有不同数量和类型的终端点 (Endpoints),如图2所示。对于前面所述的不同CDC类模型,其所对应的接口的终端点需求也是不同的。如所需要讨论的抽象控制模型对终端点的需 求,通信接口类需要一个控制终端点(Control Endpoint)和一个可选的中断(Interrupt)型终端点,数据接口子类需要一个方向为输入(IN)的周期性(Isochronous)型终端 点和一个方向为输出(OUT)的周期性型终端点。其中控制终端点主要用于USB设备的枚举和虚拟串口的波特率和数据类型(数据位数、停止位和起始位)设置 的通信。输出方向的非同步终端点用于主机(Host)向从设备(Slave)发送数据,相当于传统物理串口中的TXD线(如果从单片机的角度看),输入方 向的非同步终端点用于从设备向主机发送数据,相当于传统物理串口中的RXD线。

2. cube配置

  1. USB CDC配置

    CDC配置比较简单,使能USB外设,并且选择CDC 设备就行了。有些开发板USB的 PD+引脚的上拉电阻是通过三极管控制的,需要单独使能GPIO来控制。
    在这里插入图片描述

  2. 时钟配置

    时钟配置最主要能保证USB总线的时钟是48MHz即可。
    在这里插入图片描述

  3. 工程配置

    USB设备需要大一点的堆栈,网上都是这样说,我也没具体研究过,可以先这样配置,等熟悉后再考虑减少堆栈大小,不然这里有问题话,还得查半天浪费时间。
    在这里插入图片描述

3. 功能验证

上面配置好后编译烧写到开发板PC端就会枚举出一个串口设备,没有出现枚举设备可以看下开发板的USB PD+是否有上拉电阻,有三极管控制的话控制引脚是否配置正确了。
如果PD+只有一个上拉电阻的情况下可以在系统时钟初始化后调用下面的方法模拟USB拔插让电脑识别。

USB_Port_Set(0);
HAL_Delay(1800);
USB_Port_Set(1);
HAL_Delay(1000);

//USB使能连接/断线  enabele:0 断开, 1 允许连接
void USB_Port_Set(uint8_t enable)
{
	LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);   //开启GPIOA时钟
	if(enable)_SetCNTR(_GetCNTR()&(~(1<<1)));	//退出断电模式
	else
	{
		_SetCNTR(_GetCNTR()|(1<<1));  			//断电模式
		GPIOA->CRH&=0XFFF00FFF;
		GPIOA->CRH|=0X00033000;
		LL_GPIO_ResetOutputPin(GPIOA, GPIO_PIN_12);
	}
}

在usbd_cdc_if.c中,接收函数中添加CDC_Transmit_FS方法,接收到什么数据就返回什么。

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  CDC_Transmit_FS(Buf, *Len);
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}

编译烧写后通过串口软件能看到PC端多了一个串口,波特率可以任意配置,虚拟的串口对这个没有要求,这个时候发送什么数据,就会返回什么数据。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32Cubex中,串口配置是通过HAL库实现的。具体步骤如下: 1. 打开CubeMX软件,创建一个新项目。 2. 在"Pinout & Configuration"选项卡中,选择一个可用的串口引脚,将其分配给串口。可以使用"Add peripheral"按钮来添加串口模块。 3. 在"Configuration"选项卡中,选择串口模块,并根据需求配置串口的参数,如波特率、数据位数、停止位数、校验位等。 4. 确认配置无误后,点击"Project"菜单中的"Generate Code"选项,生成代码。 5. 打开生成的代码工程,找到"main.c"文件。在其中找到串口初始化的相关代码。一般情况下,串口初始化的函数名称类似于"HAL_UART_Init()"。 6. 在"main.c"文件中,在初始化系统时钟的代码之后,调用串口初始化函数,并传入相关参数。 7. 在需要发送或接收数据的地方,调用相关的串口发送和接收函数。发送数据的函数一般为"HAL_UART_Transmit()",接收数据的函数一般为"HAL_UART_Receive()"。 8. 在串口发送和接收完成后,可以通过查询相关的状态标志位来判断操作是否成功,如"HAL_UART_GetState()"函数。 9. 如果需要使用中断方式进行串口通信,可以通过启用相应的中断标志位,并编写中断服务函数来实现。 总之,通过STM32Cubex软件和HAL库,可以方便地进行串口配置,并实现串口通信。根据具体需求,可以配置不同的参数,并通过相关函数调用来进行数据的发送和接收。中断方式的串口通信也是可行的。以上是简要的串口配置步骤,具体的实现可以根据不同的应用需求进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值