首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32CubeMX USB?

STM32CubeMX USB?
EN

Stack Overflow用户
提问于 2015-11-05 23:53:11
回答 3查看 41.9K关注 0票数 10

我已经找到了大量的例子,但是没有关于如何在STM32MXCube中“正确地”做到这一点的东西。

如何从STM32CubeMX创建用于USB虚拟COM端口通信的框架代码(如果可能,使用STM32F4发现)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-06 05:43:27

使用CDC作为F4设备的Discovery USB的STM32CubeMX项目应该可以开箱即用。假设您使用的是最新的STM32CubeMX和库:

只启用外围设备发现和启用外围设备(leave STM32CubeMX

  • Select uncheck)

  • Enable
  • F4
  • )。.aka CDC

在时钟选项卡中,检查时钟源是否为HSE HCLK。它应提供168兆赫的HLCK和48兆赫的48兆赫(USB)。检查是否任何地方都没有红色。

保存项目

生成代码(我使用了SW4STM32工具链)

Build (您可能需要切换到内部CDT builder与GNU make)。

现在添加一些代码来通过COM端口发送数据,瞧,它应该可以工作了。

实际上,棘手的部分是在主机USB连接之前不尝试进行任何" CDC“访问(尚未设置CDC)

下面是我做快速发射测试的方法:

在文件usbd_cdc_if.c中

代码语言:javascript
复制
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中

代码语言:javascript
复制
/* 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)疾控中心数据将开始显示在主机终端上。

这是可行的。我可以在终端上看到"hello“(您可能需要安装一个驱动程序,http://www.st.com/web/en/catalog/tools/PF257938)。

对于接收,它需要首先武装起来,比如说,首先在一个好的地方调用USBD_CDC_ReceivePacket()。为此,它可以是CDC_Init_FS。

然后,您可以在数据到达CDC_Receive_FS并从此处重新武装接收时对其进行处理。

这对我很有效。

代码语言:javascript
复制
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 */
}
票数 19
EN

Stack Overflow用户

发布于 2016-01-06 19:11:58

STM32Cube软件支持许多STM32F4 Discovery板,您还没有说您使用的是哪一个,但我在使用F401VCT单片机的Discovery板上遇到了完全相同的问题。

安装STM虚拟COM端口驱动程序后,Windows Device Manager显示了一个STMicroelectronics虚拟COM端口,但带有黄色警告标记。无法使用终端应用程序(PuTTY)访问COM端口。

我最终发现,从STMCube程序输出的源代码存在问题。但是有一个简单的解决方法:

  1. 打开一个新的STM32Cube项目,启用USB_OTG_FS as Device Only,并从源代码的MiddleWares USB_Device中选择CDC Virtual Port COM,不需要对任何

设置进行其他更改。在 usbd_cdc_if.c中,将#define USB_HS_MAX_PACKET_SIZE从512更改为USB usbd_cdc.c,将#define CDC_DATA_HS_MAX_PACKET_SIZE从512更改为usbd_cdc.c

这样做之后,设备管理器中的黄色警告消失了,并且在使用PuTTY时,我可以在CDC_Receive_FS函数(在usbd_cdc_if.c文件中)接收数据。请注意,每次STM32Cube生成代码时,这些定义都会返回不正确的值,而我还没有找到解决这个问题的方法。

我希望这能帮到你。

票数 7
EN

Stack Overflow用户

发布于 2016-03-15 04:25:40

iChal's fix致力于移除黄色警告标记。

我想提一下,USB_HS_MAX_PACKET_SIZE现在在usbd_def.h中,而CDC_DATA_HS_MAX_PACKET_SIZE在usbd_cdc.h中

我使用的是STM32F401C- STM32CubeMX v1.0和STM32F401C- STM32Cube。

在进一步的工作中,我现在只需要将堆大小设置为一个更大的值。我将其设置为0x600,因为我还启用了FreeRTOS。我使用IAR EWARM,所以更改是在链接器脚本stm32f401xc_flash.icf中进行的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33549084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档