最近在做STM32的IAP方案,官方提供的demo是基于USART实现,但是使用USART的话要和电脑通信要么借助USB转TTL工具;要么在板子上加一颗CH340类似的转换芯片。这就不是很方便,就想着直接可以通过USB线进行升级,所以USB CDC就进入我的视野,关于USB CDC 是什么这里就不在赘述了,感兴趣的同志们可以自行查找其他质料。USB协议是相当复杂的,在此前我对USB协议,好在现在借助CubeMX生成USB CDC驱动代码,降低了开发难度。好了下面进入正题。。
首先说明一下本次调试的硬件是正点原子F1精英板。
好了,CubeMX配置完成,没错就是这么简单,剩余的工作就是一键生成代码就行了。
这里重点分析usbd_cdc_if.c文件,这个文件非常重要起一个桥梁的作用——连接USB CDC底层驱动和上层应用。
看到这个fops我就会莫名的想到linux驱动,看来这里的实现应该是借鉴了linux的相关思想。
看名字就知道它是用来初始化CDC的,可以看到其内部实现就是设置RX和TX的buffer地址。
这个函数取消初始化的,但里面空实现,当然你想往里加写操作也是可以的,我想官方也是这么想的,把实现给到我们开发人员。
这个函数是实现CDC相关请求的管理,像上位机下发的串口参数就是通过这个函数接收的,这个函数比较长就不贴图。
这个函数在USB接收到数据时就会被调用,是用于处理接收数据的。
要注意的是这个发送函数是非阻塞的也就是上一次未发送完成时,再次调用该函数进行发送会失败并马上返回,造成发送数据的丢失,所以需要考虑对其进行二次封装成可以超时发送的函数。
要进行回环测试只需在CDC_Receive_FS函数中添加如下语句: