当前位置: 首页 > news >正文

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;
}

/

相关文章:

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 _USB…...

C# String.Trim 方法

String.Trim()方法定义&#xff1a; 命名空间&#xff1a;System 程序集&#xff1a;System.Runtime.dll 返回结果&#xff1a;返回一个新字符串&#xff0c;它相当于从当前字符串中删除了一组指定字符的所有前导匹配项和尾随匹配项。 Trim方法有三个重载的方法&#xff0c;…...

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 4》(8)

《Linux操作系统原理分析之Linux 进程管理 4》&#xff08;8&#xff09; 4 Linux 进程管理4.4 Linux 进程的创建和撤销4.4.1 Linux 进程的族亲关系4.4.2 Linux 进程的创建4.4.3 Linux 进程创建的过程4.4.4 Linux 进程的执行4.4.5 Linux 进程的终止和撤销 4 Linux 进程管理 4.…...

RT-Thread STM32F407 PWM

为了展示PWM效果&#xff0c;这里用ADC来采集PWM输出通道的电平变化 第一步&#xff0c;进入RT-Thread Settings配置PWM驱动 第二步&#xff0c;进入board.h&#xff0c;打开PWM宏 第三步&#xff0c;进入STM32CubeMX&#xff0c;配置时钟及PWM 第四步&#xff0c;回到R…...

idea中把spring boot项目打成jar包

打jar包 打开项目&#xff0c;右击项目选中Open Module Settings进入project Structure 选中Artifacts&#xff0c;点击中间的加号&#xff08;Project Settings->Artifacts->JAR->From modules with dependencies &#xff09; 弹出Create JAR from Modules&#…...

levelDB之基础数据结构-Slice

Slice是levelDB中用于操作字符串的数据结构&#xff0c;以字节为单位。 定义与实现 namespace leveldb {class LEVELDB_EXPORT Slice {public:// Create an empty slice.Slice() : data_(""), size_(0) {}// Create a slice that refers to d[0,n-1].Slice(const c…...

上位机模块之通用重写相机类

在常用的视觉上位机中&#xff0c;我们通常会使用单个上位机匹配多个相机或者多品牌相机&#xff0c;所以在此记录一个可重写的通用相机类&#xff0c;用于后续长期维护开发。 先上代码。 using HalconDotNet; using System.Collections.Generic;namespace WeldingInspection.M…...

机器人导航+OPENCV透视变换示例代码

透视变换又称四点变换&#xff0c;所以不能用于5边形这样的图形变换&#xff0c;不是真正的透视变换&#xff0c;但是这个方法可以把机器人看到的图像转换为俯视图&#xff0c;这样就可以建立地图&#xff0c;要不然怎么建立地图呢。 void CrelaxMyFriendDlg::OnBnClickedOk()…...

KofamScan-KEGG官方推荐的使用系同源和隐马尔可夫模型进行KO注释

文章目录 简介安装使用输入蛋白序列输出detail-tsv格式输出detail格式输出mapper格式 输出结果detail和detail-tsv格式mapper格式常用命令tmp目录 与emapper结果比较其他参数参考 简介 KofamScan 是一款基于 KEGG 直系同源和隐马尔可夫模型&#xff08;HMM&#xff09;的基因功…...

代码随想录算法训练营第五十五天丨 动态规划part16

583. 两个字符串的删除操作 思路 #动态规划一 本题和动态规划&#xff1a;115.不同的子序列 (opens new window)相比&#xff0c;其实就是两个字符串都可以删除了&#xff0c;情况虽说复杂一些&#xff0c;但整体思路是不变的。 这次是两个字符串可以相互删了&#xff0c;这…...

【Linux】kernel与应用消息队列的一种设计

Linux进程间通讯的方式有很多种&#xff0c;这里介绍一种通过消息队列的方式来实现kernel与APP之间的消息收发实现方式&#xff0c;这种方式特别适用于&#xff0c;kernel中发送消息&#xff0c;应用层收取消息。 消息队列设备驱动 该方法的设计思路即是创建一个消息队列的设…...

我们常说的网络资产,具体是如何定义的?

文章目录 什么叫网络资产&#xff1f;官方定义的网络资产网络资产数字化定义推荐阅读 什么叫网络资产&#xff1f; 通过百度查询搜索什么叫网络资产&#xff1f;大体上都将网络资产归类为计算机网络中的各类设备。 基本上会定义网络传输通信架构中用到的主机、网络设备、防火…...

WPF中可冻结对象

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;"可冻结对象"指的是那些在创建之后可以被设置为不可更改状态的对象。这种特性允许这些对象更有效地被共享和复制&#xff0c;并且可以增加性能。 例如&#xff0c;Brushes&#xff0c;P…...

【人工智能实验】A*算法求解8数码问题 golang

人工智能经典问题八数码求解 实际上是将求解转为寻找最优节点的问题&#xff0c;算法流程如下&#xff1a; 求非0元素的逆序数的和&#xff0c;判断是否有解将开始状态放到节点集&#xff0c;并设置访问标识位为true从节点集中取出h(x)g(x)最小的节点判断取出的节点的状态是不…...

Kafka学习笔记(二)

目录 第3章 Kafka架构深入3.3 Kafka消费者3.3.1 消费方式3.3.2 分区分配策略3.3.3 offset的维护 3.4 Kafka高效读写数据3.5 Zookeeper在Kafka中的作用3.6 Kafka事务3.6.1 Producer事务3.6.2 Consumer事务&#xff08;精准一次性消费&#xff09; 第4章 Kafka API4.1 Producer A…...

Typora for Mac:打造全新文本编辑体验

Typora for Mac是一款与众不同的文本编辑器&#xff0c;它不仅拥有直观易用的界面&#xff0c;还融合了Markdown语法和富文本编辑的功能&#xff0c;为用户带来了前所未有的写作和编辑体验。 一、简洁明了的界面设计 Typora for Mac的界面简洁明了&#xff0c;让用户可以专注…...

TikTok与媒体素养:如何辨别虚假信息?

在当今数字时代&#xff0c;社交媒体平台如TikTok已经成为信息传播和社交互动的主要渠道之一。然而&#xff0c;随之而来的是虚假信息的泛滥&#xff0c;这对用户的媒体素养提出了严峻的挑战。本文将探讨TikTok平台上虚假信息的现象&#xff0c;以及如何提高媒体素养&#xff0…...

Spring Boot 中使用 ResourceLoader 加载资源的完整示例

ResourceLoader 是 Spring 框架中用于加载资源的接口。它定义了一系列用于获取资源的方法&#xff0c;可以处理各种资源&#xff0c;包括类路径资源、文件系统资源、URL 资源等。 以下是 ResourceLoader 接口的主要方法&#xff1a; Resource getResource(String location)&am…...

1688往微信小程序自营商城铺货商品采集API接口

一、背景介绍 随着移动互联网的快速发展&#xff0c;微信小程序作为一种新型的电商形态&#xff0c;正逐渐成为广大商家拓展销售渠道、提升品牌影响力的重要平台。然而&#xff0c;对于许多传统企业而言&#xff0c;如何将商品信息快速、准确地铺货到微信小程序自营商城是一个…...

QStatusBar开发详解

一、QStatusBar接口说明 QStatusBar 类是 Qt 中用于创建和管理状态栏的类。它继承自 QFrame 类&#xff0c;提供了在主窗口底部显示消息、进度等信息的功能。以下是一些 QStatusBar 类的重要接口&#xff1a; 1.1 QStatusBar构造函数 QStatusBar(QWidget *parent nullptr);…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...