STM32CubeMX USB CDC VCP?
STM32CubeMX USB CDC VCP?
我找到了大量示例,但没有关于如何从 STM32MXCube "properly" 中找到的示例。
如何从 STM32CubeMX 创建用于 USB CDC 虚拟 COM 端口通信(如果可能的话 STM32F4 Discovery)的骨架代码?
将 CDC 作为 USB 设备的 Discovery F4 的 STM32CubeMX 项目应该开箱即用。假设您使用最新的 STM32CubeMX 和库:
- 启动STM32CubeMX
- Select发现板F4
- 仅启用外设UBS_OTG_FS设备(保留未选中的内容)
- 启用中间件USB_Device 通信.. .aka CDC
在时钟选项卡中检查时钟源是 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);
}
一旦插入微型 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 */
}
STM32Cube 软件支持多种 STM32F4 探索板,您没有说明您使用的是哪一种,但我在使用 F401VCT MCU 的探索板上遇到了完全相同的问题。
安装STM虚拟COM口驱动后,Windows设备管理器显示STMicroelectronics虚拟COM口,但有黄色警告标记。终端应用程序无法访问 COM 端口 (PuTTY)。
我最终发现STMCube程序输出的源代码存在问题。但是有一个简单的解决方法:
- 打开一个新的STM32Cube项目并启用USB_OTG_FS作为设备
仅和 select 来自中间件的 CDC 虚拟端口 COM
USB_Device drop-down.
- 生成源代码,无需对任何 USB 设置进行其他更改。
- 在文件 usbd_cdc_if.c 中,将
#define USB_HS_MAX_PACKET_SIZE
从 512 更改为 256.
- 在文件 usbd_cdc.c 中,将
#define CDC_DATA_HS_MAX_PACKET_SIZE
从 512 更改为 256.
执行此操作后,设备管理器中的黄色警告消失了,我可以在使用 PuTTY 时在 CDC_Receive_FS 函数(在 usbd_cdc_if.c 文件中)接收数据。请注意,每次 STM32Cube 生成代码时,这些定义 return 都是不正确的值,我还没有找到解决这个问题的方法。
希望对您有所帮助。
努力去除黄色警告标记。
我想提一下 USB_HS_MAX_PACKET_SIZE
现在在 usbd_def.h 而 CDC_DATA_HS_MAX_PACKET_SIZE
在 usbd_cdc.h
我正在使用 STM32CubeMX v4.11.0 STM32Cube v1.0 和 STM32F401C-DISCO。
在进一步的工作中,我现在只需将堆大小设置为更大的值。
我将其设置为 0x600,因为我还启用了 FreeRTOS。我正在使用 IAR EWARM,因此更改是在链接器脚本 stm32f401xc_flash.icf
.
中进行的
我找到了大量示例,但没有关于如何从 STM32MXCube "properly" 中找到的示例。
如何从 STM32CubeMX 创建用于 USB CDC 虚拟 COM 端口通信(如果可能的话 STM32F4 Discovery)的骨架代码?
将 CDC 作为 USB 设备的 Discovery F4 的 STM32CubeMX 项目应该开箱即用。假设您使用最新的 STM32CubeMX 和库:
- 启动STM32CubeMX
- Select发现板F4
- 仅启用外设UBS_OTG_FS设备(保留未选中的内容)
- 启用中间件USB_Device 通信.. .aka CDC
在时钟选项卡中检查时钟源是 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);
}
一旦插入微型 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 */
}
STM32Cube 软件支持多种 STM32F4 探索板,您没有说明您使用的是哪一种,但我在使用 F401VCT MCU 的探索板上遇到了完全相同的问题。
安装STM虚拟COM口驱动后,Windows设备管理器显示STMicroelectronics虚拟COM口,但有黄色警告标记。终端应用程序无法访问 COM 端口 (PuTTY)。
我最终发现STMCube程序输出的源代码存在问题。但是有一个简单的解决方法:
- 打开一个新的STM32Cube项目并启用USB_OTG_FS作为设备 仅和 select 来自中间件的 CDC 虚拟端口 COM USB_Device drop-down.
- 生成源代码,无需对任何 USB 设置进行其他更改。
- 在文件 usbd_cdc_if.c 中,将
#define USB_HS_MAX_PACKET_SIZE
从 512 更改为 256. - 在文件 usbd_cdc.c 中,将
#define CDC_DATA_HS_MAX_PACKET_SIZE
从 512 更改为 256.
执行此操作后,设备管理器中的黄色警告消失了,我可以在使用 PuTTY 时在 CDC_Receive_FS 函数(在 usbd_cdc_if.c 文件中)接收数据。请注意,每次 STM32Cube 生成代码时,这些定义 return 都是不正确的值,我还没有找到解决这个问题的方法。
希望对您有所帮助。
我想提一下 USB_HS_MAX_PACKET_SIZE
现在在 usbd_def.h 而 CDC_DATA_HS_MAX_PACKET_SIZE
在 usbd_cdc.h
我正在使用 STM32CubeMX v4.11.0 STM32Cube v1.0 和 STM32F401C-DISCO。
在进一步的工作中,我现在只需将堆大小设置为更大的值。
我将其设置为 0x600,因为我还启用了 FreeRTOS。我正在使用 IAR EWARM,因此更改是在链接器脚本 stm32f401xc_flash.icf
.