我正在开发 STM32F401RBT6
的嵌入式应用程序,并尝试与 PC (Windows 10) 建立连接,但系统无法识别该设备。我由 STMCubeMX
生成并由 Atollic
调试的代码不起作用。我看到并尝试重现几个例子,但一切都有效。在代码中,我拥有我认为必要的所有库。
我有由 STMCubeMX
生成的用于 CDC
通信的存档,但我是新手,我不知道必须对代码进行哪些修改以便系统能够识别USB。有人可以帮助我吗?
最佳答案
除了 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;
因此,如果主机尝试设置线路编码,他将不会获得未定义的数据。
关于c - STM32F4 的 USB CDC 设置和库问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58341350/