USB虚拟串口移植————基于STM32标准库 & FreeRTOS

文章详细介绍了如何在STM32微控制器上基于FreeRTOS操作系统移植USB虚拟串口程序,包括源代码的获取、工程结构、配置选项、初始化函数、接收和发送函数的编写。作者提供了错误处理和调试提示,并强调了硬件电路的修改,如CAN1接口的重映射和USB差分信号的阻抗匹配。
摘要由CSDN通过智能技术生成

USB虚拟串口移植————基于STM32 & FreeRTOS

https://github.com/StarTao114/USB_ACM

这是这份程序的仓库,可以在上面下载源代码,也可以在github上与我进行讨论

如果觉得有用,请为我点亮Star!!!!

Preface

Each time when I want to transplant USB programs packaged by ST will produce lots of bugs until recently. So to keep you away from the mistakes what I made before, I open the entire porting scheme.

Promote the spirit of open source.

文件移植&工程构成

  1. 将USB文件夹整个放入工程中(与USER文件夹同级)

    移植文件添加路径

  2. 在工程中添加三个新的文件夹,并分别填入对应文件

    移植文件结构

  3. 找到Options for Target… -> C/C++ -> Define

添加USE_USB_OTG_FS

为了使能USB_OTG高速功能


  1. 添加头文件路径

HeadFilePath

具体代码实现

  1. 导包(包含头文件)

在初始化的 .c 文件中,包含如下的头文件:

it's easy
在调用USB收发功能的 .c 文件中,使用 #include “usbd_usr.h”


  1. 初始化

添加USB初始化函数,如下图:
start_task.c

注意事项:

  1. 声明变量USB_OTG_dev后再初始化
  2. 因为旧版开发版的CAN1占用了PA11和PA12(使用USB虚拟串口必要的两个IO),因此需要将CAN1重新分配到其他引脚,如PB8和PB9
  3. 为了确保声明成功,请尽量将USB的初始化函数放到串口(USART)和CAN的声明后面

  1. 编写接收函数

我们需要将LED4作为USB连接状态的指示灯,方便调试时查看

请添加图片描述

该函数的下半是数据校验解包部分,包含了crc8校验,若不需要,可自行删除

对于 喂狗 行为,放在了确定收到正确报文后,以保证运行正常

bDeviceState 被调用在 usbd_usr.c

请添加图片描述

printf调用了串口1的putc函数,因此最好先初始化USART1

祖传程序中,LED4用作错误次数指示,用处不大,在 detect.task.c 将其禁用,避免影响对连接状态的查看

这些都是回调函数,debug时打断点也是不会停的,所以LED指示工作状态是有必要的


  1. 改写接收回调函数

请添加图片描述

整体上和串口接收没什么区别,这里只有帧头帧尾校验,没用到crc8,如有需要请自行添加

其中调用了宏 MINIPC_FRAME_LENGTH ,需要在对应的头文件中声明:

e.g. #define MINIPC_FRAME_LENGTH 14u //与视觉约定的包长度

  1. 改写接收函数

请添加图片描述

使用USB库封装的VCP_DataTx()函数,通过USB虚拟虚拟串口向上位机发送数据

VCP_DataTx()内调用了宏APP_RX_DATA_SIZE,用于控制发送缓冲区的大小

还有一个函数usb_printf(),也可以一次性发送一整个包,但是这里用Send_to_PC()取代了该函数,暂不调用usb_printf()

实际效果

  1. 视觉那边不需要再选择波特率,但是识别出的端口从ttyUSBx变成了ttyACMx,需要在open文件时修改名称

    附视觉代码(我改的粗糙代码,至少通信上了,如有不满,轻喷):

    粗糙的代码

    尚未实现热插拔,需要加其他库

    可能存在 sudo 能打开文件,但是程序里的 open 函数不行的问题:

    通常是没有USB通信文件的权限,需要取得rwx全部权限

  2. 不再需要外围芯片,也可能不需要接线,从STM32的IO连一根USB线,直连miniPC,减少干扰因素

    需要修改硬件电路:

    将CAN1接到PB8和PB9,将PC11和PC12接到USB口

    Warning:USB的差分信号需要阻抗匹配!

  3. 从串行信号变为差分信号,信号抗干扰能力提升

  4. 通信频率极大提高

  5. 现在的云台没有放USB接线的空间,后面需要留出

    之前忘了拍通信效果图,想起来的时候,板子已经上车了

  6. 附电控步兵的使用实例

    涉及到修改的文件
    我设置了免费下载,请放心,如果还是不行,可以移步我的github仓库,如果有用的话,希望可以为我点亮Star

  • 31
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值