STM32F4 的 USB CDC 设置和库问题

Problem with USB CDC settings and libraries for STM32F4

我正在为 STM32F401RBT6 开发嵌入式应用程序,我正在尝试与 PC (Windows 10) 建立连接,但系统无法识别该设备。我由 STMCubeMX 生成并由 Atollic 调试的代码不起作用。我看到并尝试重现几个例子,但一切正常。在代码中,我拥有 我认为 必要的所有库。

我有 STMCubeMXCDC 通信生成的存档,但我是新手,我不知道我必须修改 USB 的代码被系统识别。有人可以帮助我吗?

在 USBD_CDC_Init(..) 函数中有一个 malloc 函数,它在堆上分配了大约 540 字节的内存。

生成代码时 CubeMX 没有考虑到这一点。

因此,至少您必须在考虑这些额外字节的情况下定义堆大小,才能使 USB CDC 端口正常工作。

除了 Soup 的问题(默认情况下只有 0x200 的堆导致的 malloc 失败)一些 Windows 版本在示例中的行编码有问题。

在 usbd_cdc_if.c 中您应该添加:

/* USER CODE BEGIN PRIVATE_VARIABLES */
USBD_CDC_LineCodingTypeDef LineCoding =
    {
    115200, /* baud rate*/
    0x00,   /* stop bits-1*/
    0x00,   /* parity - none*/
    0x08    /* nb. of bits 8*/
    };

再往下一点

static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
.
.
.
case CDC_SET_LINE_CODING:
    LineCoding.bitrate    = (uint32_t)(pbuf[0] | (pbuf[1] << 8) |\
                            (pbuf[2] << 16) | (pbuf[3] << 24));
    LineCoding.format     = pbuf[4];
    LineCoding.paritytype = pbuf[5];
    LineCoding.datatype   = pbuf[6];

break;

case CDC_GET_LINE_CODING:
    pbuf[0] = (uint8_t)(LineCoding.bitrate);
    pbuf[1] = (uint8_t)(LineCoding.bitrate >> 8);
    pbuf[2] = (uint8_t)(LineCoding.bitrate >> 16);
    pbuf[3] = (uint8_t)(LineCoding.bitrate >> 24);
    pbuf[4] = LineCoding.format;
    pbuf[5] = LineCoding.paritytype;
    pbuf[6] = LineCoding.datatype;
break;

所以主播设置线路编码时不会得到未定义的数据