在初始化的 .c 文件中,包含如下的头文件:
在调用USB收发功能的 .c 文件中,使用 #include “usbd_usr.h”
- 初始化
添加USB初始化函数,如下图:
注意事项:
- 声明变量USB_OTG_dev后再初始化
- 因为旧版开发版的CAN1占用了PA11和PA12(使用USB虚拟串口必要的两个IO),因此需要将CAN1重新分配到其他引脚,如PB8和PB9
- 为了确保声明成功,请尽量将USB的初始化函数放到串口(USART)和CAN的声明后面
- 编写接收函数
我们需要将LED4作为USB连接状态的指示灯,方便调试时查看
该函数的下半是数据校验解包部分,包含了crc8校验,若不需要,可自行删除
对于 喂狗 行为,放在了确定收到正确报文后,以保证运行正常
bDeviceState 被调用在 usbd_usr.c 中
printf调用了串口1的putc函数,因此最好先初始化USART1
祖传程序中,LED4用作错误次数指示,用处不大,在 detect.task.c 将其禁用,避免影响对连接状态的查看
这些都是回调函数,debug时打断点也是不会停的,所以LED指示工作状态是有必要的
- 改写接收回调函数
整体上和串口接收没什么区别,这里只有帧头帧尾校验,没用到crc8,如有需要请自行添加
其中调用了宏 MINIPC_FRAME_LENGTH ,需要在对应的头文件中声明:
e.g. #define MINIPC_FRAME_LENGTH 14u //与视觉约定的包长度
- 改写接收函数
使用USB库封装的VCP_DataTx()函数,通过USB虚拟虚拟串口向上位机发送数据
VCP_DataTx()内调用了宏APP_RX_DATA_SIZE,用于控制发送缓冲区的大小
还有一个函数usb_printf(),也可以一次性发送一整个包,但是这里用Send_to_PC()取代了该函数,暂不调用usb_printf()
实际效果
- 视觉那边不需要再选择波特率,但是识别出的端口从ttyUSBx变成了ttyACMx,需要在open文件时修改名称
附视觉代码(我改的粗糙代码,至少通信上了,如有不满,轻喷):
尚未实现热插拔,需要加其他库
可能存在 sudo 能打开文件,但是程序里的 open 函数不行的问题:
通常是没有USB通信文件的权限,需要取得rwx全部权限
- 不再需要外围芯片,也可能不需要接线,从STM32的IO连一根USB线,直连miniPC,减少干扰因素
需要修改硬件电路:
将CAN1接到PB8和PB9,将PC11和PC12接到USB口
Warning:USB的差分信号需要阻抗匹配!
- 从串行信号变为差分信号,信号抗干扰能力提升
- 通信频率极大提高
- 现在的云台没有放USB接线的空间,后面需要留出
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!