完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、MX配置
(支持OTG的32需要在 USB_OTG_FS中 选择 Device Only模式) 中间件Middleware配置 选择虚拟串口,参数默认即可 时钟配置 需要将USB的频率设置为48MHz 修改堆空间,避免电脑识别异常 二、生成的代码 代码文件分布结构 在main.c中已自动加入以下相关代码 #include "u***_device.h" MX_USB_DEVICE_Init(); 三、代码修改 1. 修改CDC_Transmit_FS函数,加入超时、判断发送结束功能,基本能保证数据发送完整。 uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) { uint8_t result = USBD_OK; /* USER CODE BEGIN 7 */ uint32_t TimeStart = HAL_GetTick(); USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hU***DeviceFS.pClassData; //if (hcdc->TxState != 0) return USBD_BUSY; while(hcdc->TxState) { if(HAL_GetTick()-TimeStart > 10) return USBD_BUSY; else break; } USBD_CDC_SetTxBuffer(&hU***DeviceFS, Buf, Len); result = USBD_CDC_TransmitPacket(&hU***DeviceFS); TimeStart = HAL_GetTick(); while(hcdc->TxState) { if(HAL_GetTick()-TimeStart > 10) return USBD_BUSY; } /* USER CODE END 7 */ return result; } 添加USB的printf函数 写在PRIVATE_FUNCTIONS_IMPLEMENTATION注释中 /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ #include void u***_printf(const char *format, ...) { va_list args; uint32_t length; va_start(args, format); length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args); va_end(args); CDC_Transmit_FS(UserTxBufferFS, length); } /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ 2. 将void u***_printf(const char *format, ...) 同时加入 3. 自定义USB初始化前的断开函数 减少复位麻烦 void USB_Status_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11 | GPIO_PIN_12, GPIO_PIN_RESET); /*Configure GPIO pin : W25Q256_CS_Pin */ GPIO_InitStruct.Pin = GPIO_PIN_11 | 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_Delay(10); } 四、使用 在 #include "u***d_cdc_if.h" /* USER CODE BEGIN SysInit */ USB_Status_Init(); /* USER CODE END SysInit */ 业务代码 (注意:USB发送数据一定要 每包数据以末尾追加rn 表示一包数据接收完整) uint8_t UserTxBuffer[] = "STM32 Virtual COM Port Driver rn"; CDC_Transmit_FS(UserTxBuffer, sizeof(UserTxBuffer));//方法一 u***_printf("%srn",UserTxBuffer);//方法二 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1570 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1515 浏览 1 评论
943 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
669 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1562 浏览 2 评论
1851浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
620浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
506浏览 3评论
511浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
492浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 10:51 , Processed in 0.530672 second(s), Total 45, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号