STM32 USB开发

作者

QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118

参考

STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发
STM32 USB相关知识扫盲
STM32CubeIDE生成、调试USB虚拟串口工程
USB上拉下拉问题
STM32F103 USB 端口的电阻配置
STM32 USB设计–硬件篇
基于STM32F103的USB学习笔记2 - 电路设计

硬件

STM32系列MCU在使用USB功能的时候建议使用外部时钟,外部无源晶体或有源晶振这些,因为USB对时钟精度要求比较高。

全速设备需要1.5K上拉3~3.6V的电阻在DP线上,有4种方案,NPN,PNP,直接挂在GPIO上,直接挂在3.3V电源上。

Type-C

单片机USB接口使用下面的方式连接Type-C,
STM32 USB开发_第1张图片
Type-C连接器定义,
STM32 USB开发_第2张图片
STM32F103 USB需要接上拉电阻,高速设备接1.5K电阻在DP上,低速设备接1.5K在DM上,STM32F4和STM32L1集成了DP/DM的上下拉电阻,所以外部不再需要额外的上下拉电阻。

CubeMX配置

USB配置,使用默认设置,在Project Manager中把堆栈改大点,防止程序跑飞,
STM32 USB开发_第3张图片

USB描述符

usbd_desc.c中修改厂商信息,

/** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines
  * @brief Private defines.
  * @{
  */

#define USBD_VID     1155
#define USBD_LANGID_STRING     1033
#define USBD_MANUFACTURER_STRING     "STMicroelectronics"
#define USBD_PID_FS     22336
#define USBD_PRODUCT_STRING_FS     "STM32 Virtual ComPort"
#define USBD_CONFIGURATION_STRING_FS     "CDC Config"
#define USBD_INTERFACE_STRING_FS     "CDC Interface"

CDC

STSW-STM32102 STM32 Virtual COM Port Driver
STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯

CDC HAL库

USBD_CDC_DataOut函数回调了(USBD_CDC_ItfTypeDef *)pdev->pUserData)->Receive,这个函数正是CDC_Receive_FS

/**
  * @brief  USBD_CDC_DataOut
  *         Data received on non-control Out endpoint
  * @param  pdev: device instance
  * @param  epnum: endpoint number
  * @retval status
  */
static uint8_t  USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum)
{
  USBD_CDC_HandleTypeDef   *hcdc = (USBD_CDC_HandleTypeDef *) pdev->pClassData;

  /* Get the received data length */
  hcdc->RxLength = USBD_LL_GetRxDataSize(pdev, epnum);

  /* USB data will be immediately processed, this allow next USB traffic being
  NAKed till the end of the application Xfer */
  if (pdev->pClassData != NULL)
  {
    ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Receive(hcdc->RxBuffer, &hcdc->RxLength);

    return USBD_OK;
  }
  else
  {
    return USBD_FAIL;
  }
}

CDC共初始化了4个回调函数,其中CDC_Receive_FS是接收到PC发送的数据,

USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
  CDC_Init_FS,
  CDC_DeInit_FS,
  CDC_Control_FS,
  CDC_Receive_FS
};

CDC的发送函数是CDC_Transmit_FS,理论上只需关注这两个函数即可完成开发。

DFU

USB DFU固件升级实现流程(基于STM32F103C6,附源码)
USB – STM32F103 USB DFU设备固件升级(IAP)控制传输讲解(六)
STM32CubeIDE修改Flash/ROM起始地址及地址范围

DFU工程设置,Build Configurations -> Set Active -> Release,可以把固件从31KB降到13KB,预留16KB(0x4000)即可。
stm32f103cbt6配置@Internal Flash /0x08008000/95*1Kf,1*1Kg
USBD_DFU_MEDIA接口参数说明:
闪存的描述(由PC工具DFuSe使用)每个备用设置字符串描述符必须遵循此内存映射,以便PC主机软件可以解码所选设备的正确映射:

  • @: 检测这是一个特殊的映射描述符(以避免解码标准描述符)
  • /: 用于区域之间的分隔
    -每个地址最多8位数字,以“0x”开头
  • /: 用于区域之间的分隔
  • 扇区数量最多2位数字
  • *: 用于分隔扇区数量和扇区大小
  • 扇区大小在0到999之间最多3位数字
  • 扇区大小乘数为1位。有效条目为:B(字节)、K(千)、M(兆)
  • 扇区类型的数字如下:-a(0x41):可读-b(0x42):可擦除-c(0x43):可读和可擦除(0x44):可写-e(0x45):可读和可写-f(0x46):可擦和可写-g(0x47):可读、可擦除和可写注意:如果目标内存不连续,用户可以在斜线“/”后添加要解码的新扇区

PD

STM32G0技术详解 _ Type-C-UCPD

组合设备

STM32CubeMX | 基于STM32使用HAL库实现USB组合设备CDC+MSC

你可能感兴趣的:(IoT单片机,stm32,单片机,arm)