1.CubeMX设置
选择USB Device功能,速度为默认全速USB设备12MHZ,并使能USB_DEVICE库,选择Virtual Port Com (虚拟串口,VPC),使用默认配置。
完成USB_DEVICE配置后,USB中断自动开启,引脚自动配置;USB_DEVICE配置参数默认即可;
选择独立 .h .c 文件,Heap size有一些文档建议填写500以上,避免USB不识别,试过作用不大;
时钟自动匹配48MHz;
2.生成KEIL工程
usbd_cdc_if.c文件有接收和发送回调函数,可以CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)实现数据接收;CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)实现数据发送;
自定义函数usbvcom_printf(const char *format,...)实现USB虚拟串口的printf打印;
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t data[8] = {"helloo\r\n"};
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay (1000);
HAL_GPIO_TogglePin (LED_GPIO_Port ,LED_Pin );
CDC_Transmit_FS(data ,sizeof(data ));
}
/* USER CODE END 3 */
}
虚拟串口持续输出数据;
3.USB重枚举;
以上方式程序下载或重新上电后上位机串口助手连接时经常出现串口占用情况,需要重新插拔USB建立连接;可通过软件模拟USB插拔过程,USB识别主要是D+拉低上位机识别USB类型;插拔过程就是D+拉低过程,所以可通过PA12拉低实现D+拉低,达到USB插拔效果;
void USB_Status_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);
HAL_Delay (100);
}
自定义USB_Status_Init(void)函数重枚举USB,PA12拉低再拉高延时需50ms以上,此处100ms亲测有效;
该函数须在上电后初始化,必须在USB初始化之前完成,本次写在系统时钟初始化后面 GPIO口初始化之前;文章来源:https://www.toymoban.com/news/detail-685074.html
文章来源地址https://www.toymoban.com/news/detail-685074.html
到了这里,关于STM32F40 USB虚拟串口 HAL库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!