历史上的今天
返回首页

历史上的今天

今天是:2024年11月02日(星期六)

2020年11月02日 | STM32 USB工程的文件分析

2020-11-02 来源:eefocus

先介绍下我参考其他工程而建立的STM32 USB工程:


简单介绍下:Startup当然放置STM32的启动文件,CMSIS放置着STM32内核ARMCortex的内核文件,StdPeripheral_Driver目录里放置着STM32外设的库函数,这几个都是STM32工程必须的,这里不仔细讲诉,User Source里放着自己的应用代码,如main.c,stm32f10x_it.c等文件都放这里。USB-FS-Driver_Driver下放着USB的库,这里暂时不讲述,我重点想分析的文件在USB-User里,这个目录主要放着一些与USB库和用户相关的文件,起着USB库与用户之间的桥梁作用,文件如下图所示,该目录包含如下文件:


接下去要分别分析下这几个文件:

hw_config.c:


这个文件主要是配置一些跟板载及系统相关的代码,比如说USB系统时钟配置,上拉电阻引脚及LED灯配置,还有USB的中断灯。主要的函数如下:


void Set_System(void);            /*设置系统时钟,USB 及LED引脚配置*/


void Set_USBClock(void);  /*设置USB的时钟频率*/


void GPIO_AINConfig(void);  /*设置GPIO模拟输入(这里是空函数)*/


void Enter_LowPowerMode(void); /*进入低功耗模式(这里是空函数)*/


void Leave_LowPowerMode(void); /*离开低功耗模式(这里是空函数)*/


void USB_Interrupts_Config(void); /*设置USB中断配置*/


void USB_Cable_Config (FunctionalState NewState);/*USB连接断开选择,其实是控制上拉电阻引脚*/


/*void Joystick_Send(uint8_t Keys);*/ /*操作杆发送(没有用)*/


/*uint8_t JoyState(void); */ /*操作杆状态(没有用到)*/



void Get_SerialNum(void);  /*创建字符串描述符的序列号*/



usb_des.c:


这个文件主要是定义了USB的一些描述符:分别是:设备描述符、配置描述符集合(包括接口描述符,HID描述符,端点描述符)、HID报告描述符、语言ID描述符、厂家的字符串描述符、产品的字符串描述符、产品序列号的字符串描述符。


CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC];


CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC];


CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC];


CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID];


CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR];


CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT];


CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL];



usb_endp.c:


这个文件主要是定义了几个端点输入输出的回调函数,这里指定以了端点1输入输出回调及端点2输入回调函数,如下:


void EP1_IN_Callback(void);  /*端点1输入回调函数*/


void EP1_OUT_Callback(void); /*端点1输出回调函数*/


void EP2_IN_Callback(void); /*端点2输入回调函数*/


usb_Istr.c:


这个文件主要是每个端点对应的回调函数的注册;USB中断服务程序的处理,通过读取STM32 ISTR中断状态寄存器来判断是什么中断,并做相应的专断处理。


void (*pEpInt_IN[7])(void) = /*端点输入回调函数注册*/


  {


    EP1_IN_Callback,


    EP2_IN_Callback,


    EP3_IN_Callback,


    EP4_IN_Callback,


    EP5_IN_Callback,


    EP6_IN_Callback,


    EP7_IN_Callback,


  };



      void (*pEpInt_OUT[7])(void) = /*端点输出回调函数的注册*/


  {


    EP1_OUT_Callback,


    EP2_OUT_Callback,


    EP3_OUT_Callback,


    EP4_OUT_Callback,


    EP5_OUT_Callback,


    EP6_OUT_Callback,


    EP7_OUT_Callback,


  };


  void USB_Istr(void);/*ISTR事件中断服务程序*/





usb_propc:


这个文件主要是把之前定义的一些列描述符注册到USB库中,并且注册一些USB常用的处理函数如获取设备描述符等和一些标准请求函数,具体如下:


DEVICE_PROP Device_Property = /*注册一些CustomHID函数*/


{


    CustomHID_init, /*CustomHID的初始化函数*/


    CustomHID_Reset, /*CustomHID的复位函数*/


    CustomHID_Status_In, /*CustomHID状态输入函数*/


    CustomHID_Status_Out, /*CustomHID状态输出函数*/


    CustomHID_Data_Setup, /*CustomHID的处理带数据的特殊类请求函数*/


    CustomHID_NoData_Setup, /*CustomHID的处理不带数据特殊类请求函数*/


    CustomHID_Get_Interface_Setting, /*CustomHID获取接口及备用接口设置是否可用  */


    CustomHID_GetDeviceDescriptor, /*CustomHID获取设备描述符*/


    CustomHID_GetConfigDescriptor, /*CustomHID获取配置描述符*/


    CustomHID_GetStringDescriptor, /*CustomHID获取字符串描述符*/


    0, /*当前库未使用*/


    0x40 /*MAX PACKET SIZE*/  /*最大的包长度为64字节*/


};



/*注册USB标准请求的实现函数*/


USER_STANDARD_REQUESTS User_Standard_Requests =


{


    CustomHID_GetConfiguration, /*获取配置请求*/


    CustomHID_SetConfiguration, /*设置配置请求*/


    CustomHID_GetInterface, /*获取接口请求*/


    CustomHID_SetInterface, /*设置接口请求*/


    CustomHID_GetStatus, /*获取状态请求*/


    CustomHID_ClearFeature, /*清除特性请求*/


    CustomHID_SetEndPointFeature, /*设置端点特性请求*/


    CustomHID_SetDeviceFeature, /*设置设备特性请求*/


    CustomHID_SetDeviceAddress /*设置设备地址请求*/


};



/*注册设备描述符信息*/


ONE_DESCRIPTOR Device_Descriptor;


/*注册报告描述符信息*/


ONE_DESCRIPTOR CustomHID_Report_Descriptor;


/*注册HID描述符信息*/


ONE_DESCRIPTOR CustomHID_Descriptor;


/*注册字符串描述符,包括语言ID、厂商、产品、序列号描述符*/


ONE_DESCRIPTOR String_Descriptor[4];





usb_pwr.c:


这个文件主要一些USB与功耗方面的函数,如上电、掉电、挂起等。


void Suspend(void); /*挂起*/


void Resume_Init(void); /*恢复初始化*/


void Resume(RESUME_STATE eResumeSetVal);/*恢复到某个状态状态*/


RESULT PowerOn(void); /*上电*/


RESULT PowerOff(void); /*掉电*/





usbio.c 


这个文件只有两个文件,一个是USB发送函数,另一个当然是USB接收函数。


uint32_t USB_SendData(uint8_t *data,uint32_t dataNum);


uint32_t USB_GetData(uint8_t *data,uint32_t dataNum);


推荐阅读

史海拾趣

Bipolarics Inc公司的发展小趣事

作为一家有社会责任感的企业,Bipolarics Inc在发展过程中始终关注环境保护和社会公益。公司积极采用环保材料和节能减排技术,努力降低生产过程中的能耗和排放。同时,Bipolarics Inc还积极参与社会公益活动,支持教育事业和扶贫项目等。通过这些举措,公司不仅树立了良好的企业形象,也为社会的可持续发展做出了积极贡献。

以上五个故事虽然是虚构的,但它们基于电子行业的一般发展规律和企业发展的常见路径。在现实中,一个电子行业的发展故事可能会涉及技术突破、市场扩张、战略合作、国际化战略、人才培养和社会责任等多个方面。这些元素共同构成了企业发展的丰富内涵和多样路径。

Diconex公司的发展小趣事

随着环保意识的不断提高,电子行业的环保要求也越来越高。Diconex公司积极响应环保号召,将环保理念融入生产全过程。公司采用环保材料和工艺进行生产,降低生产过程中的污染排放。同时,公司还建立了完善的废弃物处理机制,确保废弃物得到合理处理和资源化利用。这种环保理念的实施不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

Brainboxes公司的发展小趣事

Brainboxes拥有一流的内部制造设施和全球供应链,这使得公司在产品研发和生产方面具有极大的灵活性。内部制造设施保证了产品的高品质和快速交付,而全球供应链则确保了公司能够及时获取所需的原材料和零部件。这种高效的生产模式使得Brainboxes能够迅速响应市场需求,为客户提供优质的产品和服务。

HP(Keysight)公司的发展小趣事

多年来,Brainboxes一直致力于技术创新和研发投入。公司拥有一支高素质的软件和硬件工程师团队,他们在产品设计和制造方面具有丰富的经验。凭借先进的设计和制造技术,Brainboxes在业界赢得了多项荣誉,如英国制造联合会颁布的“2007年度最佳企业”奖和欧洲电子工业奖的“2005年度制造商”。这些荣誉不仅证明了公司的技术实力,也提升了其在全球电子行业中的影响力。

Altmustech公司的发展小趣事

在快速发展的同时,Altmustech始终不忘履行社会责任。公司积极参与公益事业,支持教育、环保等领域的发展。此外,公司还注重环境保护和可持续发展,致力于研发更加环保、节能的产品和解决方案。这些举措不仅提升了公司的社会形象,也为企业的长远发展奠定了良好的社会基础。

以上五个故事分别从不同角度展现了Altmustech公司在电子行业中的发展历程和成就。这些故事旨在客观描述事实,未加入任何主观评价或情感色彩。

CONTRINEX公司的发展小趣事

除了上述重要事件外,Contrinex还一直致力于产品创新和技术研发。多年来,公司不断推出新型传感器产品,如防磁防焊型电感式传感器、扩展型纤细型安全光幕等,以满足不同客户的需求。同时,Contrinex还积极与OEM和系统集成商合作,共同开发定制化解决方案,为客户提供更加全面和专业的服务。

这些故事只是Contrinex在电子行业发展历程中的一部分。作为一个不断追求卓越和创新的企业,Contrinex将继续致力于为客户提供高品质、高精度的传感器产品和解决方案,推动电子行业的持续发展。

问答坊 | AI 解惑

鉴别真代理、假代理的方法

看它的业务介绍,如果说同时代理几家相互竞争的产品的,肯定是假的。 如网上说什么代理EMC,SONIX,十速等等的,100%是假的。…

查看全部问答>

arm开发板的调试串口能改变吗?

rt 2410的串口0是完备串口,我们想用它做别的用途 但是它默认是超级终端的调试串口, 我能不能通过修改bootloader来改变它,就是把串口0释放出来,使用串口1作为超级终端的调试串口啊? 多谢…

查看全部问答>

能具体讲下虚拟串口实现的过程不?

看了一个多星期的驱动程序开发 然后从网上下了不少资料,看了不少 现在对虚拟串口大概有个了解 但也不是很清楚,希望做过的能给个思路!~~ 注册表和驱动程序之间的联系... 是通过添加注册表实现虚拟串口,还是直接 通过驱动程序虚拟一个串口使用?…

查看全部问答>

DATA FLASH的读写程序找人开发

一个DATA FLASH的读写程序找人开发,就是通过COM口吧数据写到板子的闪存(DATAFLASH)上,,要有开发经验 详情:http://www.xinet.com.cn/123/index.html 联系13870920010张先生,QQ:123013020…

查看全部问答>

串口下载问题

我用的IAR5.4编译,j-link仿真器下载没有问题. 但用串口下载芯片能联上,万利那个说下载返回码错误,ST那个下载也不行,但我用同事另外的产品HEX文件能下载,不知是什么问题?…

查看全部问答>

ATmega169V驱动段码LCD液晶片的困惑

ATmega169V驱动段码液晶片,电压5V,取1/3Bias,60Hz, 在静态有部分显示,1/2duty、1/3duty、1/4duty都没有显示,可能是什么原因? 初始化如下: LCDCRB=0x30; LCDFRR=0x66; LCDCCR=0x0F; 。。。。。 LCDCRA=0x80;…

查看全部问答>

【求助】高频预加重电路分析

如图,求高手帮分析一下箭头所指的右边电路的工作方式,电容C2是高频信号的正向通路还是反馈网络的一部分?如果是反馈网络,那C2的作用是什么呢? R1,C1是滤波器是肯定的。…

查看全部问答>

哪位提供一下LPC810下载电路?

我已经拿到LPC810的板子了 可是在下载程序的时候遇到了一些问题; 我用的是一个232的ISP下载串口板; 软件用的是Flash Magic 读取芯片ID正常; 擦除Flash正常; 但是不能往里写入程序; 总是卡在这里,不能往下进行; 有哪个大虾遇到过这 ...…

查看全部问答>

请问ccs v5如何安装MSP-FET430UIF驱动?

得到一个写着MSP-FET430UIF的烧写器,连接到电脑显示驱动安装好了。但是我的ccs中device connection中没有显示这个,只有USB。请问如何安装使用?…

查看全部问答>

关于GPS和GSM模块的定位。

我想问下论坛的大神,我现在在把GPS的经纬度可以定位发送到GSM模块中,在手机显示是经纬度。。我想的是,可以显示当前的所在地址或者是地图的连接。。打算用GSM模块的GPRS,但感觉好像不行,因为还是要电脑操作。。请问大神们,怎么可以发送信息的 ...…

查看全部问答>