STM32 USB CDC调试记录

stm32,usb,cdc · 浏览次数 : 0

小编点评

**前言** 在做STM32的IAP方案时,官方提供的demo是基于USART实现的,但是使用USART的话要和电脑通信要么借助USB转TTL工具;要么在板子上加一颗CH340类似的转换芯片。这就很不方便,就想着直接可以通过USB线进行升级,所以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底层驱动和上层应用。 **函数操作句柄** 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函数中添加如下语句: ```c // 测试结果 uint8_t rx_buffer[128]; while (1) { if (CDC_Receive_FS(rx_buffer, sizeof(rx_buffer))) { // 数据接收成功 // 处理接收数据 } } ```

正文

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

时钟源配置

image

时钟配置

image

2.2、USB配置

image

2.3、USB Device配置

image

2.4、project配置

image

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

三、USB CDC源码简要分析

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

函数操作句柄

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

CDC_Init_FS

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

CDC_DeInit_FS

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

CDC_Control_FS

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

CDC_Receive_FS

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

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

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

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

回环测试

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

测试结果

image
image

与STM32 USB CDC调试记录相似的内容:

STM32 USB CDC调试记录

STM32 USB CDC调试 一、前言 最近在做STM32的IAP方案,官方提供的demo是基于USART实现,但是使用USART的话要和电脑通信要么借助USB转TTL工具;要么在板子上加一颗CH340类似的转换芯片。这就不是很方便,就想着直接可以通过USB线进行升级,所以USB CDC就进入我的

STM32 + RT-Thread + LVGL

一、基本信息 MCU:STM32F103ZET6 RT-Thread:5.0.2 LVGL:8.3.11 LCD:ST7735s 编译环境:RTThread studio 二、LVGL 移植要求 16、32或64位微控制器或处理器 建议速度大于16 MHz 闪存/ROM: > 64 kB(建议180

RTThread 自动网卡使用问题

最近使用 STM32 测试了一下 lwip 和 esp8266 的网络连接问题,使用 RTThread 的自动网卡时,发现不能很好的自动切换默认网卡,不能满足需求,所以自己简单的改了一下。 一、准备材料 MCU:STM32F103ZT6 RTThread:5.0.2 工具:RTThread stud

STM32F1和STM32F4系列DMA的不同之处——对STM32的DMA的工作机制和场景的一些理解[原创www.cnblogs.com/helesheng]

比较STM32F4和STM32F1系列的DMA控制器,区别主要有三:1)增加了DMA流(Stream)的概念;2)限制了两个DMA控制器的数据流向;3)为每个数据流添加了可配置的FIFO缓冲区。 本文逐一比较了以上三种硬件上的改变带来的功能方面的升级和不同。另外,还大胆猜测了STM32的芯片设计者对...

手把手实践丨基于STM32+华为云设计的智慧烟感系统

摘要:当前基于STM32和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将检测到的数据上传到云端进行处理和分析。 本文分享自华为云社区《基于STM32+华为云设计的智慧烟感系统》,作者:DS小龙哥 。 一、概述 当前基于STM32和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将

手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

摘要:本文介绍基于STM32微控制器、BC26 NBIOT模组和华为云IOT平台,实现了一款智能井盖系统。 本文分享自华为云社区《基于STM32+NBIOT+华为云IOT设计的智能井盖》,作者:DS小龙哥 。 一、概述 智能井盖是一种通过物联网技术实现对井盖状态监测和管理的设备。当前介绍基于STM3

STM32WB55 BLE双核flash擦写程序深度解析

简介 STM32WB55的flash擦除有两种机制,一种是只有单核运行下的flash擦除,这种模式下,flash擦除的步骤同其他STM32的flash擦除一样,直接调用HAL库中flash擦除的库函数即可;另一种是双核运行下的flash擦除,这种模式下,因为两颗CPU内核都会访问地址总线,可能会有访