基于stm32f130 固件库 给出usb虚拟串口通信
时间: 2023-08-05 12:08:51 浏览: 200
基于stm32实现USB虚拟串口功能+源代码+文档说明
好的,下面是基于 STM32F1xx 标准外设库实现 USB 虚拟串口通信的代码:
```c
#include "stm32f1xx.h"
#include "usbd_cdc_if.h"
#define APP_RX_DATA_SIZE 2048
#define APP_TX_DATA_SIZE 2048
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
USBD_CDC_LineCodingTypeDef LineCoding = {
115200, /* baud rate*/
0x00, /* stop bits-1*/
0x00, /* parity - none*/
0x08 /* nb. of bits 8*/
};
USBD_HandleTypeDef hUsbDeviceFS;
static void MX_USB_DEVICE_Init(void)
{
hUsbDeviceFS.Instance = USB;
hUsbDeviceFS.Init.dev_endpoints = 7;
hUsbDeviceFS.Init.speed = USBD_SPEED_FULL;
hUsbDeviceFS.Init.ep0_mps = DEP0CTL_MPS_64;
hUsbDeviceFS.Init.dma_enable = DISABLE;
hUsbDeviceFS.Init.low_power_enable = DISABLE;
hUsbDeviceFS.Init.lpm_enable = DISABLE;
hUsbDeviceFS.Init.battery_charging_enable = DISABLE;
if (HAL_PCD_Init(&hUsbDeviceFS.pcd) != HAL_OK)
{
Error_Handler();
}
if (HAL_PCDEx_SetRxFiFo(&hUsbDeviceFS.pcd, 0x80) != HAL_OK)
{
Error_Handler();
}
if (HAL_PCDEx_SetTxFiFo(&hUsbDeviceFS.pcd, 0, 0x40) != HAL_OK)
{
Error_Handler();
}
if (HAL_PCDEx_SetTxFiFo(&hUsbDeviceFS.pcd, 1, 0x80) != HAL_OK)
{
Error_Handler();
}
}
void USB_Init(void)
{
MX_USB_DEVICE_Init();
USBD_Init(&hUsbDeviceFS, &CDC_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);
USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);
USBD_Start(&hUsbDeviceFS);
}
void CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
uint8_t result = USBD_OK;
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
if (hcdc->TxState != 0)
{
return;
}
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
if (result != USBD_OK)
{
Error_Handler();
}
}
void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(pcdHandle->Instance==USB)
{
/* USB clock enable */
__HAL_RCC_USB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USB GPIO Configuration
PA11 ------> USB_DM
PA12 ------> USB_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_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF14_USB;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USB interrupt Init */
HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
}
}
void USB_LP_CAN1_RX0_IRQHandler(void)
{
HAL_PCD_IRQHandler(&hUsbDeviceFS.pcd);
}
void Error_Handler(void)
{
while (1)
{
}
}
```
以上代码中,`UserRxBufferFS` 和 `UserTxBufferFS` 分别是接收和发送缓冲区,`LineCoding` 是串口参数设置结构体,`USB_Init()` 函数用于初始化 USB 设备,`CDC_Transmit_FS()` 函数用于发送数据,`HAL_PCD_MspInit()` 函数用于初始化 USB 外设引脚,`USB_LP_CAN1_RX0_IRQHandler()` 函数是 USB 中断处理函数。
在使用此代码前,需要在 STM32CubeMX 中配置 USB 外设为 Virtual Com Port,然后生成代码即可。
阅读全文