我发现了大量的例子,但没有关于如何从 STM32MXCube 中“正确地”做到这一点。
如何从 STM32CubeMX 为 USB CDC 虚拟 COM 端口通信创建骨架代码(如果可能,STM32F4 Discovery)?
最佳答案
带有 CDC 作为 USB 设备的 Discovery F4 的 STM32CubeMX 项目应该是开箱即用的。假设您使用最新的 STM32CubeMX 和库:
在时钟选项卡中检查时钟源是 HSE HCLK。它应在 48 MHz (USB) 中提供 168 MHz HLCK 和 48 MHz。检查任何地方都没有红色。
保存项目
生成代码(我使用了 SW4STM32 工具链)
构建(您可能需要切换到内部 CDT 构建器与 GNU make)。
现在添加一些代码来通过 COM 端口发送数据,瞧它应该可以工作了。
实际上,棘手的部分是在主机 USB 连接之前不要尝试进行任何“CDC”访问(尚未设置 CDC)
这是我为快速发射测试所做的:
在文件 usbd_cdc_if.c 中
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
uint8_t result = USBD_OK;
/* USER CODE BEGIN 7 */
if (hUsbDevice_0 == NULL)
return -1;
USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len);
result = USBD_CDC_TransmitPacket(hUsbDevice_0);
/* USER CODE END 7 */
return result;
}
static int8_t CDC_DeInit_FS(void)
{
/* USER CODE BEGIN 4 */
hUsbDevice_0 = NULL;
return (USBD_OK);
/* USER CODE END 4 */
}
在文件 main.c 中
/* USER CODE BEGIN Includes */
#include "usbd_cdc_if.h"
/* USER CODE END Includes */
....
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uint8_t HiMsg[] = "hello\r\n";
CDC_Transmit_FS(HiMsg, strlen(HiMsg));
HAL_Delay(200);
}
只要您插入 micro USB (CN5) CDC 数据就会开始显示在主机终端上。
那个有效。我可以在终端上看到“hello”(您可能需要安装驱动程序, http://www.st.com/web/en/catalog/tools/PF257938 )。
对于接收,它需要首先准备好,例如,通过在合适的位置首次调用 USBD_CDC_ReceivePacket() 来启动。为此,它可以是 CDC_Init_FS。
然后,您可以在数据到达 CDC_Receive_FS 时对其进行处理,并从此处重新重新接收。
这对我行得通。
static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_ReceivePacket(hUsbDevice_0);
return (USBD_OK);
/* USER CODE END 6 */
}
static int8_t CDC_Init_FS(void)
{
hUsbDevice_0 = &hUsbDeviceFS;
/* USER CODE BEGIN 3 */
/* Set Application Buffers */
USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, 0);
USBD_CDC_SetRxBuffer(hUsbDevice_0, UserRxBufferFS);
USBD_CDC_ReceivePacket(hUsbDevice_0);
return (USBD_OK);
/* USER CODE END 3 */
}
关于usb - STM32CubeMX USB CDC VCP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549084/