基于stm32的USB的CDC类虚拟串口(VCP)简单通讯F429验证

基于stm32的USB的CDC类虚拟串口(VCP)简单通讯F429验证

本文目标:基于stm32的USB的CDC类虚拟串口(VCP)简单通讯F429验证

按照本文的描述,跑通USB的CDC类来进行简单交互。

先决条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5

使用外设:USB、USART1、GPIO

HAL库版本:STM32F4xx HAL Driver version number 1.26.0

STMCubeMX版本:6.10.0

Keil uVision5版本:V5.38.0.0

实验目的

新手学习,在不久之前的F4的实验中,不能成功实现USB模拟串口的通讯实验,于是在网络上寻找了一下资料,结合自己的编程经验有了这篇文章,能够实现简单的USB串口通讯了。在本次实验中,将使用STM32作为从设备使用USB的CDC类虚拟串口(VCP)进行简单的通讯。

场景使用原理图

在我的这个应用场景中,原理图的内容如下:

在这里插入图片描述

基于以上的原理设计,使用usb接口进行接口通讯实验。USB相对来说是一个比较复杂的东西,涉及的东西挺多,学得也不是很深入,只能简单的跑通实验。

配置USB_OTG_FS

打开STMCubeMX工具,找到交互通讯,配置一下USB_OTG_FS

在这里插入图片描述

配置USB类型

找到USB_DEVICE,配置一下CDC的类型。

在这里插入图片描述

配置系统时钟

在这里插入图片描述

我这里还使用了一个freertos来进行实验,同时也配置了一个串口1来进行实验,

在这里插入图片描述

修改usbd_cdc_if.c函数

配置好底层之后,生成代码,主要是去修改这个接口配置函数

在这里插入图片描述

在usbd_cdc_if.c中,我修改了下面的函数

在这里插入图片描述

在这里插入图片描述

同时还新增了两个函数

// send data to pc
int ux_device_cdc_acm_send(uint8_t *datas, uint32_t len, uint32_t timeout)
{
  if(CDC_Transmit_FS(datas, len) == USBD_OK)
  {
    if(g_xUSBUARTSend)
    {
      if (xSemaphoreTake(g_xUSBUARTSend, timeout) == pdTRUE)
      {
        return 0;
      }
      else
      {
        return -1;  // timeout
      }
    }
  }
  
  return USBD_BUSY;
}


int ux_device_cdc_acm_getchar(uint8_t *pData, uint32_t timeout)
{

  if (g_xUSBUART_RX_Queue)
  {
    if (pdTRUE == xQueueReceive(g_xUSBUART_RX_Queue, pData, timeout))
    {
      return 0;
    }
    else
    {
      return -1;
    }
  }
  else
  {
    return -1;
  }

}

我这么修改是因为,我想要用板子往pc端传数据,int ux_device_cdc_acm_send(uint8_t *datas, uint32_t len, uint32_t timeout)函数里面,调用CDC_Transmit_FS往pc传数据,而什么时候完成传输则由static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)函数决定,发送完成函数中添加了信号量的用法。

而int ux_device_cdc_acm_getchar(uint8_t *pData, uint32_t timeout)这个函数中,则可以实现接收一个数据的用法。

上层调用

static void PrintTaskFunction( void *pvParameters ) 
{
    char buf[100];
    int cnt = 0;
	  if(g_xUSBUARTSend == NULL)
	  {
		g_xUSBUARTSend = xSemaphoreCreateBinary();
	  }
    while (1)
    {
      sprintf(buf, "printf Task Test : %d", cnt++);
      int ux_device_cdc_acm_send(uint8_t *datas, uint32_t len, uint32_t timeout);
      ux_device_cdc_acm_send((uint8_t *)buf, strlen(buf), 1000);
//	  CDC_Transmit_FS((uint8_t *)buf, strlen(buf));
      vTaskDelay(1000); 
    }
}

static void ReceiveTaskFunction( void *pvParameters ) 
{
    uint8_t ch;
    int err;
	int cnt = 0;
	char buf[100];
	  if(!g_xUSBUART_RX_Queue)
    {
      g_xUSBUART_RX_Queue = xQueueCreate(200, sizeof(uint8_t));
    }
    while (1)
    {
      int ux_device_cdc_acm_getchar(uint8_t *pData, uint32_t timeout);
      err = ux_device_cdc_acm_getchar((uint8_t *)&ch, 1000);
      if(err == 0)
      {
		sprintf(buf, "Recv Data : 0x%02x, Cnt : %d", ch, cnt++);
        HAL_UART_Transmit_DMA(&huart1, (uint8_t *)buf, strlen(buf));
      }
      vTaskDelay(1000);
    }
}

  xTaskCreate(
      PrintTaskFunction, // 函数指针, 任务函数
      "print_task",     // 任务的名字
      200,                // 栈大小,单位为word,10表示40字节
      NULL,               // 调用任务函数时传入的参数
      osPriorityNormal,   // 优先级
      NULL);              // 任务句柄, 以后使用它来操作这个任务

  xTaskCreate(
      ReceiveTaskFunction, // 函数指针, 任务函数
      "receive_task",     // 任务的名字
      200,                // 栈大小,单位为word,10表示40字节
      NULL,               // 调用任务函数时传入的参数
      osPriorityNormal,   // 优先级
      NULL);              // 任务句柄, 以后使用它来操作这个任务

在上层的代码中,我这里简单粗暴创建3个任务来执行,一个PrintTaskFunction函数主要是板子往pc端发送数据,ReceiveTaskFunction函数板子接收pc发来的数据,然后使用HAL库的代码将数据往串口工具进行发送。

上机现象

烧写运行程序后,接上 USB 线,在电脑上可以识别出 USB 串口,查看设备管理器,可以看到如下设备:

在这里插入图片描述

打开两个串口助手来进行实验:

在这里插入图片描述

后记

工程调试起来挺费劲的,还是需要多实践。起初我创建队列和信号量是在usbd_cdc_if.c中的static int8_t CDC_Init_FS(void)函数里面,后来实战发现老是失败,问了一下AI和查了一下资料没能找到很好的定位到问题点,索性将创建信号量和创建队列的函数放在别的地方了。好在经过一番摸索之后,成功调通实验。

本文记录到此,算是自己工程的一次实践,本文完!!感谢阅读,感谢关注。

本文中使用的测试工程

https://download.csdn.net/download/weixin_44317448/89251468

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F429是意法半导体(STMicroelectronics)推出的一款高性能微控制器系列,它采用了ARM Cortex-M4内核,具有丰富的外设和强大的计算能力,广泛应用于工业控制、智能家居、车载电子等领域。 对于STM32F429系列的开发,STMicroelectronics提供了许多开发工具和资源,其中之一就是stm32f429_vcp.rar。这个压缩包中包含了使用STM32F429USB功能时所需的虚拟串口驱动程序,以及相关的示例代码和文档。 STM32F429USB功能包括了USB设备和USB主机两种模式,通过USB接口可以连接到PC或其他USB设备,实现数据的传输和通信。虚拟串口是基于USB的一种通信方式,可以通过USB接口模拟出一个串口,使得MCU能够与PC或其他串口设备进行通信。 stm32f429_vcp.rar中的虚拟串口驱动程序能够实现PC与STM32F429之间的数据传输,开发者可以通过PC终端软件或其他串口工具与STM32F429进行通信。该驱动程序提供了一组API函数,方便开发者进行数据发送和接收的操作。 通过使用stm32f429_vcp.rar中的虚拟串口驱动程序,开发者可以更加方便地进行STM32F429USB开发和调试工作。可以实现与PC之间的数据传输、调试输出等功能,提高了开发效率和便利性。 综上所述,stm32f429_vcp.rar是STM32F429系列开发中的一个重要资源,它提供了虚拟串口驱动程序,帮助开发者更加方便地进行STM32F429USB开发和调试工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独处东汉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值