STM32F103实现USB虚拟串口

这篇具有很好参考价值的文章主要介绍了STM32F103实现USB虚拟串口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        今天分享一下STM32F103如何实现虚拟串口,目标是让新手也能上手,如果谁没看懂或者照着做功能没有实现可以私信我,只要我看到一定回复。

新建STM32CubeMX工程

       本次使用的是STM32F103C8T6核心板,按以下步骤新建一个STM32CubeMX工程。

       步骤一 :先输入MCU型号搜索芯片,软件支持模糊搜索,然后在右侧选中正确的MCU后,点击“next”到下一步;

STM32F103实现USB虚拟串口

       步骤二:输入工程名称,尽量不要含中文和特殊字符,其他保持默认设置就行,直接点“finish”按钮到下一步,此步骤很简单就不配图了;

       步骤三:进入工程配置界面我们首先点开System Core找到RCC选择时钟源,MCU外挂了一个8MHz晶振,我们选择外部时钟源;

STM32F103实现USB虚拟串口

       步骤四:核心板上预留了一个SWD接口作为调试烧录口,我们在SYS中选择SWD作为调试口;

STM32F103实现USB虚拟串口

       步骤五:接下来我们配置USB,展开Conectivity选择USB,把Device(FS)勾上,其他的保持默认设置就行了;

STM32F103实现USB虚拟串口

       步骤六:再配置一下USB的第三方代码,展开Middleware选择USB_DEVICE,在Mode分区中选择虚拟串口(Virtual Port Com),其他保持默认设置就可以了;

STM32F103实现USB虚拟串口

       步骤七:然后配置一下时钟,进入Clock Configuration界面,因为USB需要48MHz时钟,所以必须使用PLL,首先选择HSE作为时钟源,然后将倍频因子PLLMul改为X6,输出的USB时钟就是48MHz了,然后系统时钟选择PLLCLK即可,即48MHz;

STM32F103实现USB虚拟串口

        步骤八:最后我们导出MDK工程和相关源码,就是我们常用的Keil工程。进入Project Manager界面,在Toolchain/IDE中选择MDK-ARM,其他保持默认就可以了,然后点击一下GENERATE CODE就可以生成工程和源码。

注:也可以生成EWARM、STM32CubeIDE等工程和相关源码,看个人开发习惯,驱动库的话一般默认是使用HAL库,如果FLASH比较紧张的话也可以选择LL库,在Advance Settings中可以选择,还可以选择是否生成外设初始化函数等等,功能很多,大家感兴趣可以自己去发掘。

STM32F103实现USB虚拟串口

 调试USB工程代码

       通过上述步骤我们就得到了一个USB的MDK工程,如下图所示。

STM32F103实现USB虚拟串口

       调试步骤如下:

       步骤一、将核心板通过USB线连接到电脑,USB线同时可以给核心板供电,再将JLink仿真器连接到核心板的SWD接口;

STM32F103实现USB虚拟串口

        步骤二、打开Keil工程,编译一下,报了一个错:

HTPA32X32\HTPA32X32.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.

       我们先来解决它,百度了一下,说是缺少启动文件,原因是生成Keil工程的路径带中文,我们将工程拷贝到一个不带中文的路径下,用STM32CubeMX重新打开.ioc文件,直接点击GENERATE CODE生成工程代码,结果好像还是没有生成启动文件,我们尝试把原先生成的所有文件删掉,只保留.ioc文件,重新生成工程代码后,打开工程就看到启动文件已经生成了,如下图,重新编译工程也通过了,问题解决!

STM32F103实现USB虚拟串口

       步骤三:我们加一点代码,先在main.c中定义一个数组用来保存从USB接收到的数据,再定义一个变量用于数据计数:

uint8_t USB_RxBuf[100] = {0};
uint32_t USB_RxLen = 0;

       在main函数的while循环中增加以下代码,功能是只要收到USB数据就把数据原路发回去:

    if(USB_RxLen > 0)
    {
        CDC_Transmit_FS(USB_RxBuf, USB_RxLen);
        USB_RxLen = 0;
    }

        因为main.c文件用到了CDC_Transmit_FS函数,我们需要将usbd_cdc_if.h文件包含进来才行,在main.c文件的开头新增以下代码:

#include "usbd_cdc_if.h"

        然后我们修改一下USB接收函数,先在菜单栏中点击View,选择Function Window,在Function窗口中找到usbd_cdc_if.c文件,找到里面的USB收接收函数CDC_ReceiveFS,添加如下所示(1)(2)(3)(4)代码:

extern uint8_t USB_RxBuf[100];            // (1)  
extern uint32_t USB_RxLen;                // (2)

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */

  memcpy(USB_RxBuf, Buf, *Len);  // (3)
  USB_RxLen += *Len;             // (4)
    
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}

       步骤四:编译OK后,点击DEBUG按钮开始调试,又报错了,原因是没有选对仿真器,还需要再配置一下,配置过程不再赘述,直接贴图自己看;

STM32F103实现USB虚拟串口STM32F103实现USB虚拟串口

        步骤五:重新点击DEBUG按钮开始调试,打开串口助手后发现连接不上串口,改为直接下载程序,重新拔插一下USB线试一下,通上了,效果如下;

STM32F103实现USB虚拟串口

       步骤六:虽然通上了,但是还有问题:为什么调试状态连不上串口呢?又去求助了一下度娘,度娘说“很简单,在GPIO初始化函数中将USB_DP引脚拉低再拉高就可以了”,按照度娘说的做果然没问题了,上代码给大家瞅瞅。

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

    /*Configure GPIO pin : PA6 */
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
  HAL_Delay(50);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
  HAL_Delay(50);
}

 文章来源地址https://www.toymoban.com/news/detail-493771.html

到了这里,关于STM32F103实现USB虚拟串口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F103 USB OTA升级BootLoader (一)

     1.配置外部高速晶振  2.勾选USB功能  3.将USB模式配置Virtual Port Com  4.将系统主频配置为72M,USB频率配置为48M.  5.配置好项目名称,开发环境,最后获取代码。 6.修改Flash大小和勾选Use Micro LIB   7.修改main.c代码  Update.c代码 Update.h代码  源码链接: 跳转链接 上位机升级工具:

    2024年02月11日
    浏览(20)
  • stm32f103与openmv串口通信

    串口通信是指通过串行通信接口进行数据传输的一种通信方式。在串口通信中,数据被分成一个个的字节,按照一定的顺序依次发送和接收。串口通信通常使用UART(通用异步收发传输)协议进行数据传输。 串口通信在嵌入式系统中应用非常广泛,其主要用途包括: 调试和监

    2024年02月13日
    浏览(15)
  • STM32F103C8T6制作USB键盘

            1、原因:电脑每次开机都需要输入登录密码,感觉很麻烦,就想着能不能用单片机做一个USB键盘,按一下自动给电脑发一串密码实现开机。后来又想,其实不用按键也行,用延时,延时到电脑开机再发送密码就好了,于是便有了这个制作。         2、 功能:将做好

    2024年01月22日
    浏览(20)
  • 【STM32】STM32F103ZET6程序下载(串口方式)

    STM32 的程序下载有多种方法:USB、串口、JTAG、SWD 等,这几种方式,都可以用来给 STM32 下载代码。不过,我们最常用的,最经济的,就是通过串口给 STM32 下载代码。我们将向大家介绍,如何利用串口给 STM32 下载代码。 STM32 的串口下载一般是通过串口 1 下载的,STM32开发板,

    2024年02月04日
    浏览(24)
  • STM32F103C8T6串口通信

      首先来看一下需要操作的函数,以及配置的步骤: 图1                                                  图2   Code: usart.c #include \\\"usart.h\\\" void ustart_Init(void ) { GPIO_InitTypeDef GPIO_Init_Ustar ; // 定义输出端口TX的结构体对象 USART_InitTypeDef USTART_Init; // 定义串口初始化结构体对象

    2024年02月16日
    浏览(23)
  • 基于STM32F103——AS608指纹模块+串口打印

    最近用STM32F103做一个智能门锁小玩意,其中用到指纹模块,我这里也单独的写一下笔记,不过我只是了解了基本的,就是我做门禁卡要用到的几个东西,其它还没了解。为了方便,做一下记录。我这里没有用到按键和显示屏,所以还是串口输出输入来控制了 哈哈哈哈 这里就

    2023年04月09日
    浏览(18)
  • USB -- STM32F103 USB AUDIO(音频)Speaker同步传输(Out传输)讲解(七)

    目录 链接快速定位 前沿   1 描述符讲解 1.1 设备描述符 1.2 配置描述符 1.3 接口描述符 1.4 功能描述符 1.4.1 音频控制接口描述符(AudioControl Interface Descriptors) 1.4.2 音频流接口描述符(AudioStreaming Interface Descriptors) 1.4.3 音频流端点描述符(AudioControl Endpoint Descriptors) 1.5 端

    2024年02月04日
    浏览(18)
  • STM32F103C8T6串口调试篇

    项目开发中,当出现bug时,由于不知道某个变量的值,所以很难定位问题,针对此问题,串口调试脱颖而出。通过串口printf()实时将需要显示的信息打印出来,这样就很方便的定位问题。 串口设置方法 1.购买调试器pwlink2。参考STM32F103C8T6程序烧录方法_stm32f103c8t6如何烧录_流

    2024年02月12日
    浏览(21)
  • 基于STM32F103——SIM900A发送短信+串口打印

    最近用STM32F103做一个智能门锁小玩意,密码输入错误次数多进行验证码解锁,这里我采用SIM900A来通过发送短信输入验证码进行解锁。就是简单的了解了一下在这里也单独的写写这个SIM900A的一写笔记。 。。。。。。还是直接进入主题吧 SIM900A是可以AT指令操作的,所以一般我拿

    2023年04月12日
    浏览(31)
  • STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    串口屏是一个集成了单片机的屏幕模块,采用的是TTL串口协议,可以直接通过对应指令控制屏幕, 本文采用的串口屏是陶晶驰T0系列的基本型,目的是通过单片机的串口来控制串口屏 上面仅是一部分常用的基础指令,更多更仔细的指令或者函数可以访问陶晶驰资料官网。 硬

    2024年02月13日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包