USB的协议其实是很复杂的,如果要深入学习估计要一两年才能熟悉透。本文主要是讲如何使用官方已经写好的库进行二次开发,以达到我们自己使用的目的。我们知道USB可以用来接U盘,声卡,读卡器,鼠标键盘等等,这里主要是讲USB接口用来当虚拟串口使用,这个VCP(虚拟串口)是通过USB的CDC(通信设备类)类来实现的,本文是基于CPU是STM32F4的USB来讲解的:

1.安装和使用STM32 CubeMx软件:

该软件是STM官方提供的图形化配置底层驱动的软件,可生成工程与代码,可去官方下载安装:

1)安装后如下界面:

2)接下来再点击菜单栏中的help选择安装库:

我们使用的是F4的底层库,该库为HAL库,不再是以前STM32的标准库,大约到2014年左右,ST在标准库的基础上又推出了HAL库。实际上,HAL库和标准库本质上是一样的,都是提供底层硬件操作API,而且在使用上也是大同小异。有过标准库基础的同学对HAL库的使用也很容易入手。个人认为ST官方之所以这几年大力推广HAL库,是因为HAL的结构更加容易整合STM32Cube,而STM32CubeMX是ST这几年极力推荐的程序生成开发工具。所以这两年新出的STM32芯片,ST直接只提供HAL库。在新型的STM32芯片中,用HAL库逐步淘汰标准库。

3)选择自己的mcu型号,选择好后双击打开:

4)配置RCC,USB等:

5)配置时钟树,根据自己硬件情况:

6)点击工具栏的生成代码工具,注意填写的堆栈空间要大一点,防止空间不够的意外:

点击OK后生成工程代码,可以下载测试验证,接下我们来分析生成的代码,并修改成自己想要的:

2.分析与修改代码:

1)生成的代码我们首先来看,初始化USB功能的

点击其中的Init

这里是关键,主要的功能是把CDC类的功能和我们用户要调用的_fops_FS函数都注册到USB的设备类里,这样在USB内核运行的时候就会调动我们注册进去的函数,点击USBD_Interface_fops_FS进去,这里面的函数指针 指向的函数就是我们需要使用和修改的了

函数在如下文件中:

2)我们修改这个文件:

首先在里面定义个串口属性的结构体:

USBD_CDC_LineCodingTypeDef linecoding =

{

USB_VIRTUAL_COM_BAUDRATE, /* baud rate*/

0x00,   /* stop bits-1*/

0x00,   /* parity - none*/

0x08    /* nb. of bits 8*/

};

然后修改CDC_Control_FS函数:

{

/* USER CODE BEGIN 5 */

switch (cmd)

{

case CDC_SEND_ENCAPSULATED_COMMAND:

break;

case CDC_GET_ENCAPSULATED_RESPONSE:

break;

case CDC_SET_COMM_FEATURE:

break;

case CDC_GET_COMM_FEATURE:

break;

case CDC_CLEAR_COMM_FEATURE:

break;

/*******************************************************************************/

/* Line Coding Structure                                                       */

/*-----------------------------------------------------------------------------*/

/* Offset | Field       | Size | Value  | Description                          */

/* 0      | dwDTERate   |   4  | Number |Data terminal rate, in bits per second*/

/* 4      | bCharFormat |   1  | Number | Stop bits                            */

/*                                        0 - 1 Stop bit                       */

/*                                        1 - 1.5 Stop bits                    */

/*                                        2 - 2 Stop bits                      */

/* 5      | bParityType |  1   | Number | Parity                               */

/*                                        0 - None                             */

/*                                        1 - Odd                              */

/*                                        2 - Even                             */

/*                                        3 - Mark                             */

/*                                        4 - Space                            */

/* 6      | bDataBits  |   1   | Number Data bits (5, 6, 7, 8 or 16).          */

/*******************************************************************************/

case CDC_SET_LINE_CODING:

linecoding.bitrate    = (uint32_t)(pbuf[0] | (pbuf[1] << 8) |\

(pbuf[2] << 16) | (pbuf[3] << 24));

linecoding.format     = pbuf[4];

linecoding.paritytype = pbuf[5];

linecoding.datatype   = pbuf[6];

/* Add your code here */

break;

case CDC_GET_LINE_CODING:

pbuf[0] = (uint8_t)(linecoding.bitrate);

pbuf[1] = (uint8_t)(linecoding.bitrate >> 8);

pbuf[2] = (uint8_t)(linecoding.bitrate >> 16);

pbuf[3] = (uint8_t)(linecoding.bitrate >> 24);

pbuf[4] = linecoding.format;

pbuf[5] = linecoding.paritytype;

pbuf[6] = linecoding.datatype;

/* Add your code here */

break;

case CDC_SET_CONTROL_LINE_STATE:

break;

case CDC_SEND_BREAK:

break;

default:

break;

}

return (USBD_OK);

/* USER CODE END 5 */

}

3)基本配置完毕,接下来就是发送和接收的,发送主要调用CDC_Transmit_FS函数:

示例:

很简单吧,由于我们的USB是从端,PC是主端,这里发送最后是写入到一个BUF里,PC会主动过来查询并读取.

继续看接收,接收的我们在CDC_Receive_FS函数加入自己的代码即可

示例:

到此,我们就完成了USB的配置,发送,接收等,最后看下效果:

PC装上stm的官方USB VCP驱动,然后连上电脑:

通信结果OK:

USB驱动之CDC类的介绍与应用20160905的更多相关文章

  1. CDC类介绍

    CDC类 中文介绍 CDC类定义的是设备上下文对象的类. CDC对象提供处理显示器或打印机等设备上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员. 通过CDC对象的成员函数进行所有的绘图. ...

  2. USB CDC类

    现代嵌入式系统中,异步串行通信接口往往作为标准外设出现在单片机和嵌入式系统中.但是随着个人计算机通用外围设备越来越少地使用串口,串口正在逐渐从个人计算机特别是便携式电脑上消失.于是嵌入式开发人员常常发 ...

  3. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  4. Linux USB驱动框架分析【转】

    转自:http://blog.csdn.net/jeffade/article/details/7701431 Linux USB驱动框架分析(一) 初次接触和OS相关的设备驱动编写,感觉还挺有意思的 ...

  5. linux usb驱动记录(一)

    一.linux 下的usb驱动框架 在linux系统中,usb驱动可以从两个角度去观察,一个是主机侧,一个是设备侧.linux usb 驱动的总体框架如下图所示:   从主机侧看usb驱动可分为四层: ...

  6. HarmonyOS USB DDK助你轻松实现USB驱动开发

    HDF(Hardware Driver Foundation)驱动框架是HarmonyOS硬件生态开放的基础,为开发者提供了驱动加载.驱动服务管理和驱动消息机制等驱动能力,让开发者能精准且高效地开发驱 ...

  7. extcon驱动及其在USB驱动中的应用

    extcon,是External Connector的简称,用于抽象外部连接器,比如说Audio Jack.USB MicroB/TypeC接口等.它的原型是Android的switch-class驱 ...

  8. usb驱动开发15之设备生命线

    总算是进入了HCD的片儿区,既然来到一个片区,怎么都要去拜会一下山头几个大哥吧.,先回忆一些我们怎么到这里的?给你列举一个调用函数过程usb_control_msg->usb_internal_ ...

  9. usb驱动开发1之学习准备

    此系列是http://blog.csdn.net/fudan_abc/博文的整理,同时加入了自己的理解.很敬佩fudan_abc的文章,仔细学习和分析受益很多.注:fundan_abc所分析linux ...

随机推荐

  1. 韦大仙--LoadRunner压力测试:详细操作流程

    一. 录制脚本 1.安装完毕后,创建脚本: 点击OK之后,会弹出网址,之后创建Action,每进一个页面添加一个Action,录制结束后,终止录制. 二. 修改脚本 1.脚本参数化 将登录的用户名密码 ...

  2. MySQL高性能优化实战总结

    1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...

  3. 【转】: 塞尔达组在GDC2017演讲的文字翻译:技术的智慧

    大家好,我是堂田卓宏,在<荒野之息>的制作中我担任技术总监的职位.我在2003年加入任天堂,并且作为程序员参与了许多不同游戏的制作.在本次的制作的过程中,我们的程序员团队也需要打破许多游戏 ...

  4. sqlmap+tor解决ip黑名单限制

    1.安装tor浏览器(8.0.8)并配置好 旧版tor是需要Vidalia配合的,新版貌似集成了?还是怎样的,反正不需要了 2.启动tor浏览器 3.启动sqlmap python sqlmap.py ...

  5. python3【基础】-and和or的短路逻辑

    1. 表达式只有一个逻辑运算符 python中哪些对象会被当成False,哪些又是True呢? 基本数据类型中的None.任何数值类型中的0.空字符串"",空列表[],空元组()和 ...

  6. t2

    测评项目 : 福大助手 组长博客链接:https://www.cnblogs.com/dawnduck/p/10093752.html 第一部分:调研,评测 评测 1. 第一次上手体验 安卓: 进入页 ...

  7. 论文爬取 & 词频统计2.0

    一.Github地址      课程项目要求    队友博客 二.具体分工 031602225 林煌伟 :负责C++部分主要功能函数的编写,算法的设计以及改进优化 031602230 卢恺翔 : 爬虫 ...

  8. 使用 virt-install 创建虚拟机

    使用 virt-install 创建虚拟机 virt-install --help 使用 qemu-kvm 创建虚拟机 介绍 1:命令路径:/usr/libexec/qemu-kvm   2:添加至环 ...

  9. Django之logging日志

    简介 Django使用python自带的logging 作为日志打印工具.简单介绍下logging. logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给 ...

  10. MYSQL-update与select结合使用

    使用 inner join   ) c ,," , iteration; 如上例子: 完成更新 picture.labels 字段 & picture.iteration自增 的两个 ...