STM32 USB CDC调试记录

STM32 USB CDC调试

一、前言

最近在做STM32的IAP方案,官方提供的demo是基于USART实现,但是使用USART的话要和电脑通信要么借助USB转TTL工具;要么在板子上加一颗CH340类似的转换芯片。这就不是很方便,就想着直接可以通过USB线进行升级,所以USB CDC就进入我的视野,关于USB CDC 是什么这里就不在赘述了,感兴趣的同志们可以自行查找其他质料。USB协议是相当复杂的,在此前我对USB协议,好在现在借助CubeMX生成USB CDC驱动代码,降低了开发难度。好了下面进入正题。。

二、CubeMX创建MDK工程

首先说明一下本次调试的硬件是正点原子F1精英板。

2.1、配置RCC

时钟源配置

时钟配置

2.2、USB配置

2.3、USB Device配置

2.4、project配置

好了,CubeMX配置完成,没错就是这么简单,剩余的工作就是一键生成代码就行了。

三、USB CDC源码简要分析

这里重点分析usbd_cdc_if.c文件,这个文件非常重要起一个桥梁的作用------连接USB CDC底层驱动和上层应用。

函数操作句柄

看到这个fops我就会莫名的想到linux驱动,看来这里的实现应该是借鉴了linux的相关思想。

CDC_Init_FS

看名字就知道它是用来初始化CDC的,可以看到其内部实现就是设置RX和TX的buffer地址。

CDC_DeInit_FS

这个函数取消初始化的,但里面空实现,当然你想往里加写操作也是可以的,我想官方也是这么想的,把实现给到我们开发人员。

CDC_Control_FS

这个函数是实现CDC相关请求的管理,像上位机下发的串口参数就是通过这个函数接收的,这个函数比较长就不贴图。

CDC_Receive_FS

这个函数在USB接收到数据时就会被调用,是用于处理接收数据的。

除了上面操作句柄里的四个函数外,usbd_cdc_if.c还提供了一个接口函数用于USB发送数据的函数

要注意的是这个发送函数是非阻塞的也就是上一次未发送完成时,再次调用该函数进行发送会失败并马上返回,造成发送数据的丢失,所以需要考虑对其进行二次封装成可以超时发送的函数。

基本上了解了上面的知识后,使用 USB CDC进行回环测试就没啥问题,当然如果想有更高级的操作还是不够(比如说多路串口),这就需要自己花时间去摸索了。

回环测试

要进行回环测试只需在CDC_Receive_FS函数中添加如下语句:

测试结果