stm32 HSUSB

/

stm32f407xx.h

#define USB_OTG_HS_PERIPH_BASE 0x40040000UL

#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE)

//

//

定义全局变量 USBD_HandleTypeDef hUsbDeviceHS;并默认全零初始化/* USB Device handle structure */
typedef struct _USBD_HandleTypeDef
{uint8_t                 id;uint32_t                dev_config;uint32_t                dev_default_config;uint32_t                dev_config_status;USBD_SpeedTypeDef       dev_speed;USBD_EndpointTypeDef    ep_in[16];USBD_EndpointTypeDef    ep_out[16];__IO uint32_t           ep0_state;uint32_t                ep0_data_len;__IO uint8_t            dev_state;__IO uint8_t            dev_old_state;uint8_t                 dev_address;uint8_t                 dev_connection_status;uint8_t                 dev_test_mode;uint32_t                dev_remote_wakeup;uint8_t                 ConfIdx;USBD_SetupReqTypedef    request;USBD_DescriptorsTypeDef *pDesc;USBD_ClassTypeDef       *pClass[USBD_MAX_SUPPORTED_CLASS];void                    *pClassData;void                    *pClassDataCmsit[USBD_MAX_SUPPORTED_CLASS];void                    *pUserData[USBD_MAX_SUPPORTED_CLASS];void                    *pData;void                    *pBosDesc;void                    *pConfDesc;uint32_t                classId;uint32_t                NumClasses;
#ifdef USE_USBD_COMPOSITEUSBD_CompositeElementTypeDef tclasslist[USBD_MAX_SUPPORTED_CLASS];
#endif /* USE_USBD_COMPOSITE */
} USBD_HandleTypeDef;

//

//

定义全局变量USBD_DescriptorsTypeDef HS_Desc,并赋值初始化
/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables* @brief Private variables.* @{*/USBD_DescriptorsTypeDef HS_Desc =
{USBD_HS_DeviceDescriptor
, USBD_HS_LangIDStrDescriptor
, USBD_HS_ManufacturerStrDescriptor
, USBD_HS_ProductStrDescriptor
, USBD_HS_SerialStrDescriptor
, USBD_HS_ConfigStrDescriptor
, USBD_HS_InterfaceStrDescriptor
#if (USBD_LPM_ENABLED == 1)
, USBD_HS_USR_BOSDescriptor
#endif /* (USBD_LPM_ENABLED == 1) */
};//=====================================================//
//=====================================================//
/* USB Device descriptors structure */
typedef struct
{uint8_t *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
#if (USBD_CLASS_USER_STRING_DESC == 1)uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length);
#endif /* USBD_CLASS_USER_STRING_DESC */
#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1))uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
#endif /* (USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1) */
} USBD_DescriptorsTypeDef;//=====================================================//
//=====================================================//
/*** @brief  Return the device descriptor* @param  speed : Current device speed* @param  length : Pointer to data length variable* @retval Pointer to descriptor buffer*/
uint8_t * USBD_HS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{UNUSED(speed);*length = sizeof(USBD_HS_DeviceDesc);return USBD_HS_DeviceDesc;
}/*** @brief  Return the LangID string descriptor* @param  speed : Current device speed* @param  length : Pointer to data length variable* @retval Pointer to descriptor buffer*/
uint8_t * USBD_HS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{UNUSED(speed);*length = sizeof(USBD_LangIDDesc);return USBD_LangIDDesc;
}/*** @brief  Return the product string descriptor* @param  speed : current device speed* @param  length : pointer to data length variable* @retval pointer to descriptor buffer*/
uint8_t * USBD_HS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{if(speed == 0){USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_HS, USBD_StrDesc, length);}else{USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_HS, USBD_StrDesc, length);}return USBD_StrDesc;
}/*** @brief  Return the manufacturer string descriptor* @param  speed : Current device speed* @param  length : Pointer to data length variable* @retval Pointer to descriptor buffer*/
uint8_t * USBD_HS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{UNUSED(speed);USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);return USBD_StrDesc;
}/*** @brief  Return the serial number string descriptor* @param  speed : Current device speed* @param  length : Pointer to data length variable* @retval Pointer to descriptor buffer*/
uint8_t * USBD_HS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{UNUSED(speed);*length = USB_SIZ_STRING_SERIAL;/* Update the serial number string descriptor with the data from the unique* ID */Get_SerialNum();/* USER CODE BEGIN USBD_HS_SerialStrDescriptor *//* USER CODE END USBD_HS_SerialStrDescriptor */return (uint8_t *) USBD_StringSerial;
}/*** @brief  Return the configuration string descriptor* @param  speed : Current device speed* @param  length : Pointer to data length variable* @retval Pointer to descriptor buffer*/
uint8_t * USBD_HS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{if(speed == USBD_SPEED_HIGH){USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_HS, USBD_StrDesc, length);}else{USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_HS, USBD_StrDesc, length);}return USBD_StrDesc;
}/*** @brief  Return the interface string descriptor* @param  speed : Current device speed* @param  length : Pointer to data length variable* @retval Pointer to descriptor buffer*/
uint8_t * USBD_HS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{if(speed == 0){USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_HS, USBD_StrDesc, length);}else{USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_HS, USBD_StrDesc, length);}return USBD_StrDesc;
}#if (USBD_LPM_ENABLED == 1)
/*** @brief  Return the BOS descriptor* @param  speed : Current device speed* @param  length : Pointer to data length variable* @retval Pointer to descriptor buffer*/
uint8_t * USBD_HS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
{UNUSED(speed);*length = sizeof(USBD_HS_BOSDesc);return (uint8_t*)USBD_HS_BOSDesc;
}
#endif /* (USBD_LPM_ENABLED == 1) */

全局宏定义,区分高速和全速USB
/* #define for FS and HS identification */
#define DEVICE_FS 		0
#define DEVICE_HS 		1

//

//

定义全局变量USBD_CDC,并赋值初始化
/* CDC interface class callbacks structure */
USBD_ClassTypeDef  USBD_CDC =
{USBD_CDC_Init,USBD_CDC_DeInit,USBD_CDC_Setup,NULL,                 /* EP0_TxSent */USBD_CDC_EP0_RxReady,USBD_CDC_DataIn,USBD_CDC_DataOut,NULL,NULL,NULL,
#ifdef USE_USBD_COMPOSITENULL,NULL,NULL,NULL,
#elseUSBD_CDC_GetHSCfgDesc,USBD_CDC_GetFSCfgDesc,USBD_CDC_GetOtherSpeedCfgDesc,USBD_CDC_GetDeviceQualifierDescriptor,
#endif /* USE_USBD_COMPOSITE  */
};//=====================================================//
//=====================================================//
/*** @brief  USBD_RegisterClass*         Link class driver to Device Core.* @param  pDevice : Device Handle* @param  pclass: Class handle* @retval USBD Status*/
USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass)
{uint16_t len = 0U;if (pclass == NULL){
#if (USBD_DEBUG_LEVEL > 1U)USBD_ErrLog("Invalid Class handle");
#endif /* (USBD_DEBUG_LEVEL > 1U) */return USBD_FAIL;}/* link the class to the USB Device handle */pdev->pClass[0] = pclass;/* Get Device Configuration Descriptor */
#ifdef USE_USB_HSif (pdev->pClass[pdev->classId]->GetHSConfigDescriptor != NULL){pdev->pConfDesc = (void *)pdev->pClass[pdev->classId]->GetHSConfigDescriptor(&len);}
#else /* Default USE_USB_FS */if (pdev->pClass[pdev->classId]->GetFSConfigDescriptor != NULL){pdev->pConfDesc = (void *)pdev->pClass[pdev->classId]->GetFSConfigDescriptor(&len);}
#endif /* USE_USB_FS *//* Increment the NumClasses */pdev->NumClasses ++;return USBD_OK;
}//=====================================================//
//=====================================================//
/*** @brief  USBD_LL_DataOutStage*         Handle data OUT stage* @param  pdev: device instance* @param  epnum: endpoint index* @param  pdata: data pointer* @retval status*/
USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev,uint8_t epnum, uint8_t *pdata)
{USBD_EndpointTypeDef *pep;USBD_StatusTypeDef ret = USBD_OK;uint8_t idx;if (epnum == 0U){pep = &pdev->ep_out[0];if (pdev->ep0_state == USBD_EP0_DATA_OUT){if (pep->rem_length > pep->maxpacket){pep->rem_length -= pep->maxpacket;(void)USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket));}else{/* Find the class ID relative to the current request */switch (pdev->request.bmRequest & 0x1FU){case USB_REQ_RECIPIENT_DEVICE:/* Device requests must be managed by the first instantiated class(or duplicated by all classes for simplicity) */idx = 0U;break;case USB_REQ_RECIPIENT_INTERFACE:idx = USBD_CoreFindIF(pdev, LOBYTE(pdev->request.wIndex));break;case USB_REQ_RECIPIENT_ENDPOINT:idx = USBD_CoreFindEP(pdev, LOBYTE(pdev->request.wIndex));break;default:/* Back to the first class in case of doubt */idx = 0U;break;}if (idx < USBD_MAX_SUPPORTED_CLASS){/* Setup the class ID and route the request to the relative class function */if (pdev->dev_state == USBD_STATE_CONFIGURED){if (pdev->pClass[idx]->EP0_RxReady != NULL){pdev->classId = idx;pdev->pClass[idx]->EP0_RxReady(pdev);}}}(void)USBD_CtlSendStatus(pdev);}}else{
#if 0if (pdev->ep0_state == USBD_EP0_STATUS_OUT){/** STATUS PHASE completed, update ep0_state to idle*/pdev->ep0_state = USBD_EP0_IDLE;(void)USBD_LL_StallEP(pdev, 0U);}
#endif}}//if (epnum == 0U)else{/* Get the class index relative to this interface */idx = USBD_CoreFindEP(pdev, (epnum & 0x7FU));if (((uint16_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS)){/* Call the class data out function to manage the request */if (pdev->dev_state == USBD_STATE_CONFIGURED){if (pdev->pClass[idx]->DataOut != NULL){pdev->classId = idx;ret = (USBD_StatusTypeDef)pdev->pClass[idx]->DataOut(pdev, epnum);//***//}}if (ret != USBD_OK){return ret;}}}return USBD_OK;
}

/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4月2日-3日·上海 | 3DCC 第二届3D细胞培养与类器官研发峰会携手CGT Asia 重磅来袭

类器官&#xff08;Organoids&#xff09;作为干细胞研究领域最重要的成果之一&#xff0c;在基础医学研究、转化医学及药物研发领域展现出巨大的应用潜力&#xff0c;特别是在精准医疗以及药物安全性和有效性评价等方向凭借其先天优势引起了极大的市场关注&#xff0c;成为各大…

无线WiFi安全渗透与攻防(一) 无线安全环境搭建以及密码生成

无线WiFi安全渗透与攻防 一. 无线安全环境搭建1.802.11标准(1).概念(2). 802.11标准和补充2.WiFi标准3.无线接入点AP(Access Point)1.概念2.AP的分类(1).胖AP(2).瘦AP(3).用途的区别4.客户端 STA5.无线局域网AP术语介绍6.无线网卡的工作模式(1).Managed Mode(2).…

【智能家居】5、主流程设计以及外设框架编写与测试

目录 一、主流程设计 1、工厂模式结构体定义 &#xff08;1&#xff09;指令工厂 inputCmd.h &#xff08;2&#xff09;外设工厂 controlDevices.h 二、外设框架编写 1、创建外设工厂对象bathroomLight 2、编写相关函数框架 3、将浴室灯相关操作插入外设工厂链表等待被调…

pm2在Windows环境中的使用

pm2 进程管理工具可以Windows操作系统上运行&#xff0c;当一台Windows电脑上需要运行多个进程时&#xff0c;或者运维时需要运行多个进程以提供服务时。可以使用pm2&#xff0c;而不再是使用脚本。 1. 使用PM2管理进程 1.1. 启动PM2项目 1.1.1. 直接启动项目 参数说明&…

springboot集成nacos并实现自动刷新

目录 1.说明 2.示例 3.自动刷新的注意点 1.说明 springboot项目中存在好多配置文件&#xff0c;比如配置数据信息&#xff0c;redis信息等等&#xff0c;配置文件可以直接放在代码&#xff0c;也可以放在像nacos这样的组件中&#xff0c;实现动态的管理&#xff0c;修改配置…

浅谈滑动窗口

滑动窗口是什么&#xff1f; 滑动窗口其实是一个想象出来的数据结构。有左边界L和有边界R。 举例来说&#xff1a;数组 arr {3,1,5,7,6,5,8}; 其窗口就是我们规定的一个运动轨迹。 最开始时&#xff0c;边界LR都在数组的最左侧&#xff0c;此时没有包住任何数。 此时规定&…

ExoPlayer架构详解与源码分析(9)——TsExtractor

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

linux进程之进程的优先级➕环境变量

文章目录 1.优先级的认识1.1优先级的介绍1.2初识优先级1.3ps指令1.4查看/修改进程的优先级1.5对优先级的认识1.6对进程的深一步理解 2.环境变量2.0环境变量相关的命令2.1环境变量的概念2.2常见/查看环境变量2.3环境变量的作用2.4修改环境变量1.将zombie可执行程序放到PATH现有的…

Apache Doris安装部署

Apache Doris安装部署 版本&#xff1a; CentOS 7.6 Apache Doris 0.14.0 编译 选择合适的版本进行下载&#xff0c;此次选择0.14.0版本 下载 | Apache Doris 一、CentOS编译 1 安装依赖 sudo yum groupinstall Development Tools && sudo yum install maven c…

CF1899B 250 Thousand Tons of TNT

题目链接 题目 题目大意 T T T 组测试数据 每组 n n n 个货物&#xff0c;第 i i i 个货物 的重量是 a i a_i ai​ 用k辆货车按顺序装这些货物&#xff0c;条件是每辆车上的货物个数都一样&#xff0c;也即是说 n n n 必须能被 k k k 整除&#xff0c; 求任意两辆车货物总…

开发中常用的日期转换

一、java中日期转换 场景再现&#xff1a;前端给我们传的日期格式通常为 2023-11-16&#xff0c;而数据库在某些场景下会将时间存为20231106&#xff08;yyyyMMdd&#xff09;的格式 1.方法一 使用字符串分隔 String date"2023-11-16"; String newDate date.replace…

对象和数据结构

文章目录 前言一、从链式调用说起二、数据抽象三、数据、对象的反对称性四、得墨忒尔律五、数据传送对象总结 前言 代码整洁之道读书随笔&#xff0c;第六章 一、从链式调用说起 面向对象语言中常用的一种调用形式&#xff0c;链式调用&#xff0c;是一种较受推崇的编码风格&…

Alibaba Nacos注册中心实战

为什么需要注册中心 思考&#xff1a;网络请求&#xff0c;如果服务提供者发生变动&#xff0c;服务调用者如何感知服务提供者的ip和端口变化&#xff1f; // 微服务之间通过RestTemplate调用&#xff0c;ip:port写死&#xff0c;如果ip或者port变化呢&#xff1f; String ur…

【c++】左值和右值

理解 C/C 中的左值和右值 写得很好 简单定义 左值(lvalue, locator value) 表示一个占据内存中某个可识别得位置&#xff08;地址&#xff09;得对象右值(rvalue), 不是左值就是右值&#xff0c; 不表示内存中某个可识别位置的对象的表达式。 举例&#xff1a; int var; va…

【学习笔记】Java安全之动态加载字节码

文章目录 什么是Java的字节码利用URLClassLoader加载远程class文件利用ClassLoader#defineClass直接加载字节码利用TemplatesImpl加载字节码利用BCEL ClassLoader加载字节码 最近在学习Phith0n师傅的知识星球的Java安全漫谈系列&#xff0c;随手记下笔记 什么是Java的字节码 J…

CCRC认证是什么?

什么是CCRC认证&#xff1f; 信息安全服务资质&#xff0c;是信息安全服务机构提供安全服务的一种资格&#xff0c;包括法律地位、资源状况、管理水平、技术能力等方面的要求。 信息安全服务资质&#xff08;CCRC&#xff09;是依据国家法律法规、国家标准、行业标准和技术规范…

iOS学习 --- Xcode 15 下载iOS_17.0.1_Simulator失败解决方法

1.去开发者官网下载安装包 https://developer.apple.com/download/all/?qiOS%2017 使用浏览器下载。 2.打开终端通过命令添加到xcode 命令如下&#xff1a; sudo xcode-select -s /Applications/Xcode.app(输入开始密码)xcodebuild -runFirstLaunch (等待一小会)xcrun simctl…

翻译软件Mate Translate mac中文版介绍说明

Mate Translate mac可以帮你翻译超过100种语言的单词和短语&#xff0c;使用文本到语音转换&#xff0c;并浏览历史上已经完成的翻译。你还可以使用Control S在弹出窗口中快速交换语言。 Mate Translate Mac版软件介绍 Mate Translate 可以在你的所有设备之间轻松同步&#x…

人参果

《人参果》 作者&#xff0f;罗光记 千年灵气结人参&#xff0c; 果似珍珠色艳新。 仙界奇珍谁得享&#xff0c; 只留传说在人心。

2023年首届天府杯数学建模国际大赛问题A思路详解与参考代码:大地测量数据中异常现象的特征和识别

地球变形观测是固体潮汐曲线分析和地震前体研究的重要手段&#xff0c;也是地球观测技术的重要组成部分。基于各种精密科学仪器的变形观测点主要集中在洞穴、地下井等易的自然灾害&#xff08;雷暴、强降雨、降雪等&#xff09;&#xff0c;人工维护、人工爆破等外部条件&#…