- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《STM32 USB的JMouse源代码分析 1-3》.pdf
USB 的“JoyStickMouse ”源代码分析01 一、c源文件和头文件 1、c文件的组织 我们一般用 C 语言编程的时候都比较讲究模块化、层次化,以及数据和操作分开 的原则。 模块化最明显的表现是我们把常用的、某一个具体功能实现封装在一个函数中, 我们所要操作的数据以参数的方式提供给函数,函数通过代码处理过后,再把结果回馈 个调用者。 层次化表现在比较复杂的功能实现都要分几层来实现,有时候也是为了提高可移 植性。比如文件系统的代码实现大致要分这么几层: 磁盘操作层实现磁盘扇区的读取、写入、控制; 文件分配管理函数和目录项操作函数; 文件的打开、读取、写入函数,目录的建立、删除函数等; 用户应用操作函数,如文件的查找、具体数据的写入等等。 一个具体 USB 功能的实现也能分成几层,比如我们的 Stm32 JoyStickMouse,我们 也可以这样分层: 硬件操作层:寄存器操作和内存操作。 协议通用层:设备枚举的控制传输实现,对所有类协议都一样。 具体协议层:比如 HID 协议的描述符,类特定请求实现。 这样一划分,一个具体的功能实现就需要比较多的 C 源文件。 2、c文件和h文件 一个 c 文件一般是几个函数组成,这几个函数可能一部分存在依存关系,而有一 些函数要对外引出,而同时它还可能要引用外部函数。解决这个相互关联的是“包含头 文件”。 一个 c 文件很多时候都存在一个与它同名的“h 文件”,对 c 文件的意义主要有以 下几个: (1)提供常量定义,#define。 (2)提供一些类型定义,为了实现 c 文件数据类型的编译器无关性,一般都要将 该编译器提供的数据类型重新定义,用 tpyedef 来实现。 (3)结构体、联合体、枚举类型的定义。 (4)带参数的宏定义。 (5)外部函数声明。 (6)外部变量声明。 (7)本身实现函数的声明:起始这个声明对 c 文件本身意义不大,主要是其它 c 文件要使用本 c 文件实现的函数时,包含同名“h 文件”,意义更清楚一些。 3 、h文件的相互包含 头文件对 c 源文件的意义比较清晰。但实际有时候“头文件”也会存在依存关系, 相互包含。 比如有个头文件使用数据类型“u8”,那么它必须先包含定义这个数据类型的头 文件。 有时候为了让 c 文件包含的头文件数目不至于过多,一般采用这样的方法:用一 个 h 文件包含所有相关的头文件,然后每个 c 文件包含这个头文件就行了。这个以 usb 的库函数组织最为典型。 编程时,用到库函数的源文件只要包含“stm32f10x_lib.h”就行了,USB 操作库 函数也采用了类似的方式。 二、USB函数库分析 1、usb_regs.h (1)寄存器定义 #define CNTR ((volatile unsigned *)(RegBase + 0x40)) 我觉得这是 c 语言指针的魅力所在,通过这样的定义可以直接操作寄存器。*CNTR = Value。特别是含有多个寄存器的设备,可以将首地址结构体指针化,通过指针间接 访问结构体,实际上就访问了各个寄存器。 (2)标志位、屏蔽位定义 #define ISTR_CTR (0x8000) /* Correct TRansfer (clear-only bit) */ #define CLR_CTR (~ISTR_CTR) /* clear Correct TRansfer bit */ 有了这个定义,我们可以以比较明了的方式对相关位进行操作。 (3)寄存器操作宏定义 #define _SetCNTR(wRegValue) (*CNTR = (u16)wRegValue) 这样定义以后,用户对寄存器的操作调用宏就行了,意义清晰。 #define _SetEPTxStatus(bEpNum,wState) {\ register u16 _wRegVal; \ _wRegVal = _GetENDPOINT(bEpNum) EPTX_DTOGMASK;\ /*
您可能关注的文档
- 《SolidWorks_imold》.pdf
- 《SolidWorks__100个经典实例教程》.pdf
- 《SolidWorks_工程图操作教程》.ppt
- 《SolidWorks_管道设计基础》.pdf
- 《solidworks_练习题_11》.doc
- 《solidworks_练习题_非常完美》.pdf
- 《solidworks三维模板设计规范》.pdf
- 《solidworks中二维图转三维图》.doc
- 《SolidWorks使用技巧》.doc
- 《SolidWorks基础教程》.pdf
- 《STM32 USB详解》.pdf
- 《STM32F10x_USB_学习培训资料》.pdf
- 《STM32USB程序开发笔记》.pdf
- 《STM32_USB_HID》.pdf
- 《STM32_官方USB例程_JoyStick详解》.pdf
- 《STM32官方USB例程JoyStick详解》.pdf
- 《STM32的USB详解》.pdf
- 《Strategic Inbound Optimization-Foreign Trade Zones and Reshoring Increase》.pdf
- 《Strategic trade policy with incompletely informed》.pdf
- 《Strategies Used in the Translation of Interlingual 》.pdf
文档评论(0)