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. Hbase 教程-安装

    HBase安装 安装前设置 安装Hadoop在Linux环境下之前,需要建立和使用Linux SSH(安全Shell).按照下面设立Linux环境提供的步骤. 创建一个用户 首先,建议从Unix创建一 ...

  2. OA系统与Exchange 日历打通

    目前我碰到好几个案例是希望将客户以后的OA系统与Exchange中的日历系统相结合,比如致远或者泛微的OA系统. 客户的需求如下: 1.有了OA系统 2.客户使用Outlook当邮件客户端 3.客户希 ...

  3. NO.1:自学python之路------Hello world、判断、循环

    引言 人工智能如今越来越贴近生活,在这里将记录我自学python与tensorflow的过程.编程使用IDE:visual studio 2017,python版本3.6.4,tensorflow版本 ...

  4. Java接口interface,匿名内部类

    接口 1.接口内部为 常量+公用的抽象方法.类必须实现接口中的所有方法 2.接口的语法格式:不写abstract会自动添加,可以继承多个接口 修饰符不能使private,protected [修饰符] ...

  5. 福大软工1816:Beta(7/7)

    Beta 冲刺 (7/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 组织会议 wxpy中多个功能的开发 整 ...

  6. 自定义ClassLoader,用于加载用户JAR包

    最近在考虑C/S结构程序的软件自动升级的实现方式,比如QQ.飞信等都自动升级的功能. 自动升级模块虽然还没有编码完成,但是思路还是比较清晰的. 自动升级过程中,升级文件的JAR包是专门加载到程序中去的 ...

  7. IP ,路由

    ifconfig 命令       ip信息   enp0s3: flags=4163<UP(已经启用),BROADCAST(支持广播),RUNNING,MULTICAST(支持多播)> ...

  8. beta-review阶段贡献分分配

    小组名称:飞天小女警 项目名称:礼物挑选小工具 小组成员:沈柏杉(组长).程媛媛.杨钰宁.谭力铭 bera-review阶段各组员的贡献分分配如下: 姓名 团队贡献分 程媛媛 5.8 沈柏杉 6.1 ...

  9. phpcms 思维导图

    原文地址 : https://www.cnblogs.com/fuyunbiyi/archive/2012/03/12/2391253.html

  10. 【ABP】Abp的AspNetZero5.0版本无法使用ctrl+f5调式

    原文:http://www.cnblogs.com/94pm/p/7942483.html AspNetZero是基于Abp框架开发的商业程序,最近从Abp交流群中得知5.0版本开始加入了防盗版的功能 ...