首页 资讯 应用 高压 设计 行业 低压 电路图 关于

单片机

旗下栏目: PLC 嵌入式 单片机 DCS

STM32 USB-FS-Device-Driver分析

单片机 | 发布时间:2017-10-03 | 人气: | #评论# |本文关键字:STM32,USB,USB-FS-Device-Driver
摘要:记得之前讲的都是CustomHID工程里USB-User这个Group里的文件:如下图所示: 如果要给USB系统分层的话,USb分成:应用程序,控制程序,驱动程序。上面的USB-User应该算是控制程序。接下去我

记得之前讲的都是CustomHID工程里USB-User这个Group里的文件:如下图所示:

USB-FS-Device-Driver分析

如果要给USB系统分层的话,USb分成:应用程序,控制程序,驱动程序。上面的USB-User应该算是控制程序。接下去我要将的是USB-FS-Device-Driver这个Group里的文件,这个Group就是USB的驱动代码部分了。

USB-FS-Device-Driver里的文件布局如下图:

USB-FS-Device-Driver分析

这里关于OTG的暂时不讲,主要分析下其他一些文件:usb_core.c、usb_init.c、usb_int.c、usb_mem.c、usb_reg.c和usb_sil.c这几个文件。

usb_core.c这个文件从名字上就可知,这是usb的核心文件。这个文件主要是USB在枚举过程中的一些功能函数。比如控制传输的建立阶段、数据阶段、状态阶段的各种标准请求函数,各个阶段的处理函数等。

uint8_t Setup0_Process(void);
uint8_t Post0_Process(void);
uint8_t Out0_Process(void);
uint8_t In0_Process(void);

RESULT Standard_SetEndPointFeature(void);
RESULT Standard_SetDeviceFeature(void);

uint8_t *Standard_GetConfiguration(uint16_t Length);
RESULT Standard_SetConfiguration(void);
uint8_t *Standard_GetInterface(uint16_t Length);
RESULT Standard_SetInterface(void);
uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc);

uint8_t *Standard_GetStatus(uint16_t Length);
RESULT Standard_ClearFeature(void);
void SetDeviceAddress(uint8_t);
void NOP_Process(void);

接下去介绍的是usb_init.c这个文件。这个文件很简单,只有一个函数:void USB_Init(void),这个函数也很简单,就是注册usb设备的基本信息:

/*******************************************************************************
* Function Name  : USB_Init
* Description    : USB系统初始化
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void USB_Init(void)
{
 pInformation = &Device_Info; //注册设备信息结构体
 pInformation->ControlState = 2; //控制状态为IN_DATA
 pProperty = &Device_Property; //注册设备的常用一些函数结构体
 pUser_Standard_Requests = &User_Standard_Requests;
 /* Initialize devices one by one */
 pProperty->Init(); //注册初始化函数
}

至于pProperty->Init()这样的写法,就是执行pProperty这个结构体的Init函数指针指向的函数,我们在usb_prop.c的DEVICE_PROP Device_Property中曾注册过初始化函数CustomHID_init()。

接下去介绍usb_int.c文件,这个文件定义了两个中断中断服务程序:低优先级的端点正确传输中断服务程序void CTR_LP(void)和高优先级端点正确传输的中断服务程序void CTR_HP(void)。我们这个工程只使用了void CTR_LP(void)这个函数,CTR_LP在usb.istr.c文件的ISTR中断事件的中断服务程序USB_Istr中如果数据或请求正确传输正确就会被调用。

usb_mem.c主要有两个内存中的数据搬移函数:一个是从PMA缓冲区中拷贝数据到用户指定的内存空间PMAToUserBufferCopy(),很明显这个函数是在端点接收到数据后才会使用到的;另一个是从用户空间拷贝数据到PMA缓冲区中,在端点要发送数据数才会被调用。

usb_reg.c文件,是跟stm32的USB相关寄存器相关的代码。看这段代码就要阅读stm32寄存器了。这个函数定义了设置和读取各个寄存器的值或某位的值,具体的看代码。

最后一个文件是usb_sil.c。端点具体的接发数据函数就在这里定义。这个文件也很简单,只有三个函数:USB_SIL



责任编辑:电气自动化网

热门文章

首页 | 资讯 | 应用 | 高压 | 设计 | 行业 | 低压 | 电路图 | 关于

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。