当前位置:首页 > 单片机 > 单片机
[导读]先介绍下我参考其他工程而建立的STM32 USB工程: 简单介绍下:Startup当然放置STM32的启动文件,CMSIS放置着STM32内核ARMCortex的内核文件,StdPeripheral_Driver目录里放置着STM32外设的库函数,这几个都是STM

先介绍下我参考其他工程而建立的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);


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式开发中,STM32的时钟系统因其灵活性和复杂性成为开发者关注的焦点。然而,看似简单的时钟配置背后,隐藏着诸多易被忽视的陷阱,轻则导致系统不稳定,重则引发硬件损坏。本文从时钟源选择、PLL配置、总线时钟分配等关键环...

关键字: STM32 时钟系统

在嵌入式系统开发中,STM32系列微控制器的内部温度传感器因其低成本、高集成度特性,广泛应用于设备自检、环境监测等场景。然而,受芯片工艺差异和电源噪声影响,其原始数据存在±1.5℃的固有误差。本文从硬件配置、校准算法、软...

关键字: STM32 温度传感器

在能源效率与智能化需求双重驱动下,AC-DC转换器的数字控制技术正经历从传统模拟方案向全数字架构的深刻变革。基于STM32微控制器的PFM(脉冲频率调制)+PWM(脉冲宽度调制)混合调制策略,结合动态电压调整(Dynam...

关键字: AC-DC STM32

当前智能家居产品需求不断增长 ,在这一背景下 ,对现有浇花装置缺陷进行了改进 ,设计出基于STM32单片机的全 自动家用浇花机器人。该设计主要由机械结构和控制系统构成 ,机械结构通过麦克纳姆轮底盘与喷洒装置的结合实现机器...

关键字: STM32 麦克纳姆轮 安全可靠 通过性强

用c++编程似乎是让你的Arduino项目起步的障碍吗?您想要一种更直观的微控制器编程方式吗?那你需要了解一下Visuino!这个图形化编程平台将复杂电子项目的创建变成了拖动和连接块的简单任务。在本文中,我们将带您完成使...

关键字: Visuino Arduino ESP32 STM32

基于STM32与LoRa技术的无线传感网络凭借其低功耗、广覆盖、抗干扰等特性,成为环境监测、工业自动化等场景的核心解决方案。然而,如何在复杂电磁环境中实现高效休眠调度与动态信道优化,成为提升网络能效与可靠性的关键挑战。本...

关键字: STM32 LoRa

在实时控制系统、高速通信协议处理及高精度数据采集等对时间敏感的应用场景中,中断响应延迟的优化直接决定了系统的可靠性与性能上限。STM32系列微控制器凭借其灵活的嵌套向量中断控制器(NVIC)、多通道直接内存访问(DMA)...

关键字: STM32 DMA

数字电源技术向高功率密度、高效率与高动态响应方向加速演进,STM32微控制器凭借其基于DSP库的算法加速能力与对LLC谐振变换器的精准控制架构,成为优化电源动态性能的核心平台。相较于传统模拟控制或通用型数字控制器,STM...

关键字: STM32 数字电源

STM32微控制器凭借其针对电机控制场景的深度优化,成为高精度、高可靠性驱动系统的核心选择。相较于通用型MCU,STM32在电机控制领域的核心优势集中体现在FOC(磁场定向控制)算法的硬件加速引擎与PWM死区时间的动态补...

关键字: STM32 电机控制

无线充电技术加速渗透消费电子与汽车电子领域,基于Qi协议的无线充电发射端开发成为智能设备能量补给的核心课题。传统模拟控制方案存在响应滞后、参数调整困难等问题,而基于STM32的数字PID控制结合FOD(Foreign O...

关键字: STM32 无线充电
关闭