【发布时间】:2021-11-23 11:52:32
【问题描述】:
我正在尝试弄清楚如何在基于 STM32F103 的 Blue Pill 板上启用 USB VCP 功能。在关注Shawn Hymell's guide 并尝试使用this other SO Q/A 进行故障排除时,我目前有以下(缩小)main.c:(Git Gist with full file)
#include "main.h"
#include "usb_device.h"
#include <string.h>
int main(void) {
char msg[50];
uint8_t state = 0;
HAL_StatusTypeDef ret_status;
MX_USB_DEVICE_Init();
sprintf(msg, "Restart!\n");
ret_status = HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
HAL_Delay(1000);
while (1) {
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, state ? GPIO_PIN_RESET : GPIO_PIN_SET);
sprintf(msg, "Hello World! LED State: %d\n", state);
ret_status = HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
ret_status = CDC_Transmit_FS((uint8_t*)msg, strlen(msg));
state = state == 1 ? 0 : 1;
HAL_Delay(500);
}
}
我可以看出程序(否则)运行正常,因为 UART 适配器显示 char msg 正在以正确的间隔输出,并且电路板的 PC13 LED 正在闪烁。但是,我的 Windows 10 计算机甚至无法识别插入的 USB 设备,只显示 FTDI 适配器的 COM 端口和我的 STLink v2:
截至目前,我已经尝试了来自the other SO Q/A 的以下潜在修复:
- 在
usbd_cdc_if.c中设置APP_RX_DATA_SIZE 64和APP_TX_DATA_SIZE 64 - 在
usbd_cdc_if.c中将以下代码添加到 CDC_Control_FS() 函数中:
case CDC_SET_LINE_CODING:
tempbuf[0]=pbuf[0];
tempbuf[1]=pbuf[1];
tempbuf[2]=pbuf[2];
tempbuf[3]=pbuf[3];
tempbuf[4]=pbuf[4];
tempbuf[5]=pbuf[5];
tempbuf[6]=pbuf[6];
break;
case CDC_GET_LINE_CODING:
pbuf[0]=tempbuf[0];
pbuf[1]=tempbuf[1];
pbuf[2]=tempbuf[2];
pbuf[3]=tempbuf[3];
pbuf[4]=tempbuf[4];
pbuf[5]=tempbuf[5];
pbuf[6]=tempbuf[6];
break;
- 在调用
CDC_Transmit_FS的第一个实例之前添加HAL_Delay(1000); - 确认我使用的USB线有数据线
- 在 CubeMX 设备配置工具中将
Minimum Heap Size设置为0x1000
以前有没有其他人见过这样的事情?我不确定接下来要尝试什么。
【问题讨论】:
-
检查电缆 :) 你的主要而不是足够的。您需要设置时钟初始化 hal、gpio 等。
-
另一个问题 - 检查 D+ 和 D- 线上的上拉电阻。许多英国石油公司都错了
-
好吧,不确定这是否有帮助,但我做了更多的挖掘工作,发现正在触发对
CDC_Transmit_FS中的TxState != 0的检查,导致返回码USBD_BUSY。我不完全知道如何解释这个...... -
Hrm,@0_______,他们应该是什么?
-
另外,我对
main.c文件的缩小删除了这些行。所有正常的配置函数都在那里并被调用。
标签: c usb stm32 stm32cubeide