网站基本配置,wordpress安装界面默认英文,免费的网站给一个,如果域名网站用来做违法例程#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com
本篇为USB虚拟串口教程#xff0c;没有知识#xff0c;全是实操#xff0c;按照步骤就能获得一个STM32的USB虚拟串口。本例子是在野火F103MINI开发板上验证的#xff0c;如果代码中出现一些外设的…例程STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com
本篇为USB虚拟串口教程没有知识全是实操按照步骤就能获得一个STM32的USB虚拟串口。本例子是在野火F103MINI开发板上验证的如果代码中出现一些外设的配置可以参考野火F103MINI开发板原理图对照。
设置外部晶振必须要使用外部晶振因为USB控制器需要48M的系统时钟内部晶振无法倍频出48M。
配置外部时钟 配置调试口和系统基准源 开启USB设备 中间件中设备USB设备类型 我使用了freertos v2 配置外部系统时钟 配置独立C和H文件 USB相关的代码都在这个文件夹中 最常处理的只有下面四个函数
CDC_Control_FS() 来自主机请求的回调函数
CDC_Receive_FS() 接收数据回调函数
CDC_Transmit_FS() 用来发送数据
CDC_TransmitCplt_FS() 发送完成回调函数
实现回环测试很简单之需要在usbd_cdc_if.c文件中添加下面一句话 编译后下载程序会在设备中看到如下 可以使用串口助手进行回环测试因为是虚拟串口所以在这里波特率可以随意设置 上面中在 CDC_Receive_FS 中添加了一行 CDC_Transmit_FS(Buf, *Len); 代码可以看到演示中实现了回环效果上位机不管发送什么数据下位机都会原样返回。并且可以发现不管上位机软件中波特率设置为多少都可以正常通讯因为使用USB虚拟串口的时候真正数据传输用的是USB串口本身参数这些已经无所谓了。
上面方式演示中其实存在一个问题演示中并未体现出来如果你尝试在上位机一次向下发送超过64个字节数据那么你收到的返回数据可能就只有64个字节。USB数据的收发都是以一个一个包的形式进行的包的大小一方面和USB协议有关另一方面和程序有关。在上面工程的 usbd_cdc.h 文件中可以找到相关定义 USB的 IN / OUT 都是从HOST而言说的对于Device而言IN指的是发送OUT指的是接收。 默认定义下USB_FS收发每一个包的大小均为64字节。 前面提到的大于64字节出现的问题中第一次进入 CDC_Receive_FS 将接收到64个字节数据这时候调用了 CDC_Transmit_FS 回发数据接着重启接收将立马接到第二个包数据然后第二次调用 CDC_Transmit_FS 这个时候前一次的发送还未处理完成此次调用将失败。
针对这个问题在使用的时候要合理设计数据收发逻辑。对于接收而言可以设计特殊字符用于标示一帧数据结束或是设计超时时间来判断一帧数据结束。对于发送而言通常不会有太大问题一次性发送大量数据也行在全部发送完成后会触发发送完成回调函数CDC_TransmitCplt_FS
设置串口参数
使用USB虚拟串口的时候真正数据传输用的是USB串口本身参数这些已经无所谓了。不过有一种情况会需要这些串口参数比如单片机一方面与上位机通过USB虚拟串口方式进行通讯另一方面通过物理串口和其它模块进行通讯单片机只做数据转发工作。这个时候单片机物理串口的参数就必须要能与其它模块匹配这个参数如果要通过上位机来设置的话就需要对 CDC_Control_FS() 中的 CDC_SET_LINE_CODING 节点进行处理了 进入这个函数后会通过pbuf这个变量按照上面注释获得PC端配置串口的信息。
下面我们举例一个自己打印的消息例子方便后期理解 我还做了一个阻塞测试我在点灯的地方主动发送了一个数据 我发现即使不连接USB程序也没有被阻塞与这个对比的是STC8系列的单片机的虚拟串口STC8系列单片机会阻塞程序而STM32并不会这很好。