自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 【PID学习】PID算法改进

本文系统介绍了PID控制器的改进方法,主要分为三部分:1)积分部分改进:通过积分限幅防止饱和、积分分离消除大误差积分、变速积分动态调整积分速度;2)微分部分改进:采用微分先行避免目标突变干扰、不完全微分抑制噪声影响;3)输入输出改进:输出偏移增强小信号响应、输入死区避免微小误差波动。这些方法通过调整PID各环节作用,有效解决了传统PID存在的超调、振荡、响应慢等问题,提升了控制系统的稳定性和动态性能。

2025-10-01 18:44:39 822

原创 【PID学习】位置式PID和增量式PID伪代码

本文介绍了PID控制器的两种实现方法。位置式PID通过定时中断获取传感器数据,计算当前误差、误差积分和微分项,输出控制量并进行限幅处理。增量式PID则在位置式基础上增加了上上次误差项,通过增量计算调整输出量。文章指出,PID三个参数需根据应用场景灵活选择:位置控制适合PD组合避免积分项导致的超调;速度控制则需要积分项补偿摩擦力。两种实现均采用定时器中断方式,确保控制周期T的精确性。

2025-09-30 17:10:15 423

原创 【PID学习】PID基本原理

本文介绍了PID控制算法的三个核心参数及其作用:比例控制(Kp)用于快速响应,微分控制(Kd)抑制振荡,积分控制(Ki)消除稳态误差。以无人机悬停为例,说明各参数的应用效果及不当设置的缺点。最后对比了位置式PID和增量式PID的特点:位置式直接输出全量控制值,增量式输出控制增量,后者能保持暂停时的控制状态。两种形式通过不同变量调节可实现不同特性,增量式更适合需要保持状态的执行机构。

2025-09-29 20:29:07 637

原创 【杂谈】写代码一定要注意数据类型匹配

51单片机延时函数卡死问题分析:由于输入参数(unsigned int)与循环变量(unsigned char)类型不匹配,当输入值>255时导致变量溢出形成死循环。两种解决方案:1)统一变量类型;2)自定义延时逻辑。该问题警示了数据类型匹配的重要性,提醒开发者需注意变量范围的兼容性,避免因类型不匹配导致的程序异常。

2025-09-28 18:01:41 184

原创 【FreeRTOS】第七课(4):任务间的通信——一个设备的数据写入多个队列

本文介绍了一个基于红外遥控的多任务汽车游戏程序框架。程序分为游戏层和数据获取层:游戏层创建了3个汽车任务,每个任务通过队列接收红外遥控数据;数据获取层实现红外数据的采集、解析和分发功能,采用注册机制将数据同时发送到多个任务队列。该设计通过队列通信机制实现了任务间的解耦,使多个汽车可以独立响应不同的红外按键控制,同时保证了系统的可扩展性,其他游戏模块也可通过注册队列来获取红外数据。文中提供了详细的数据结构定义和任务处理函数实现代码。

2025-09-27 16:04:44 226

原创 【FreeRTOS】第七课(3):任务间的通信——使用队列集优化程序架构

本文介绍了解决I2C设备冲突的两种方法(互斥操作或双I2C)以及基于FreeRTOS队列集的多设备数据处理框架。主要内容包括:1. 解决屏幕与MPU6050共用I2C导致的通信问题;2. 队列集的工作原理及API函数说明(创建、添加队列、读取等);3. 实现实例展示了游戏应用中如何通过队列集整合红外遥控、旋转编码器和MPU6050三种输入设备的数据处理流程,包括各模块的队列创建、数据采集和句柄管理。这种架构降低了代码耦合性,提高了系统可扩展性。

2025-09-26 15:49:30 1045

原创 【FreeRTOS】第七课(2):任务间的通信——队列实验

本文介绍了FreeRTOS队列的使用方法,包括动态/静态创建队列、读写队列操作及工程应用。主要内容:1.队列创建方式:动态创建使用xQueueCreate(),静态创建使用xQueueCreateStatic();2.队列操作函数:包括普通/中断环境下的读写接口;3.工程应用示例:通过挡球板控制任务展示了直接读写队列和间接读写队列两种实现方式,后者通过中介队列处理复杂数据转换;4.混合控制方案:结合红外中断和旋转编码器的多输入控制实现。文中详细提供了各场景下的代码实现模板和参数说明。

2025-09-25 00:18:03 1308

原创 【杂谈】使用VsCode提交github

本文记录了使用VsCode配置Python开发环境并连接GitHub的完整流程。主要内容包括:1)下载WattToolkit加速器、注册GitHub账号、安装Git和VsCode;2)配置设备代理和Git(设置用户名邮箱、代理端口、禁用SSL验证)以打通VsCode到GitHub的网络连接;3)解决加速器设为System模式时GitHub无法打开的问题。作者作为Python初学者,选择轻量化的VsCode而非Anaconda+Pycharm组合,通过视频教程和自主搜索完成了首次GitHub文件提交。该教程详

2025-09-24 12:48:31 1052

原创 【FreeRTOS】第七课(1):任务间的通信——使用队列

本文介绍了多任务通信的三种方法:全局变量、环形缓冲区和队列。重点分析了环形缓冲区的工作原理,通过读写指针和计数值实现数据存取管理。详细讲解了队列通信机制,它是在环形缓冲区基础上增加了互斥和阻塞唤醒功能,适用于生产者-消费者模式。以流水线为例,说明了接收方B任务的执行流程:当产品到达时被唤醒处理,或超时后主动检查。队列实现了任务间的同步与资源管理,避免CPU资源浪费。

2025-09-21 22:33:07 644

原创 【FreeRTOS】第六课:同步与互斥

本文介绍了RTOS中任务同步、互斥和通信的实现方法及注意事项。在同步方面,使用全局变量作为触发条件存在缺陷,会导致CPU资源浪费,建议采用阻塞方法优化。互斥问题可通过禁止任务切换解决,但仍存在资源占用问题。通信的关键在于保证结果正确性。文章还详细讲解了volatile关键字的作用:防止编译器过度优化,确保对硬件寄存器和异步修改变量的正确访问,举例说明了其在内存映射寄存器和信号处理程序中的典型应用场景。这些技术要点对嵌入式系统开发具有重要意义。

2025-09-18 17:10:22 690

原创 【FreeRTOS】第五课:任务管理

任务就是函数,每一个任务都相当于一个独立运行的小main函数,由链表进行管理,在FreeRTOS操作系统中,将链表中存储的任务结构体称为任务控制块(TCB,Task Control Block)默认会创建出一个任务函数每一个任务函数在内存中都需要有自己的栈帧空间存储程序任务之间亦有优先级高低之别有动态和静态两种方法创建任务(使用函数)

2025-09-16 17:26:11 991

原创 【C语言】深入理解指针(5)

文章摘要:sizeof是C语言操作符,用于计算变量或类型的内存占用(字节),不关注数据内容。strlen是库函数,统计字符串中\0前的字符数,依赖\0作为结束符。主要区别:sizeof是编译时计算的操作符,strlen是运行时执行的函数;sizeof计算内存大小,strlen统计字符数量;sizeof不依赖\0,strlen可能因缺失\0导致越界。两者在字符串处理中常被对比使用。

2025-09-04 21:28:21 323

原创 【C语言】深入理解指针(4)

本文介绍了回调函数的概念及其应用。回调函数是通过函数指针调用的函数,其地址作为参数传递并在特定事件发生时被调用。文章展示了回调函数的代码示例,并对比了使用与否的差异。第二部分探讨如何用回调函数模拟实现qsort功能,首先分析冒泡排序仅支持单一数据类型的局限性,接着介绍qsort函数支持任意类型排序的特性及其比较函数的实现方式。最后通过应用实例说明了整个回调流程的实现过程。

2025-09-04 20:50:48 1109

原创 【杂谈】2025电赛G题:扫频得到未知模型输出的幅值后如何判断它的滤波类型以及寻找-3db位置

文章摘要:本文介绍了一种通过扫频信号分析滤波器特性的方法。扫频是通过顺序改变信号频率并采集输出信号来获取系统响应。算法首先判断滤波器类型(低通、高通、带阻或带通),通过比较首尾点和极值点的关系确定;然后采用比较法寻找最接近-3dB的点,用数组存储截止频率位置。对于高低通滤波器只需一个截止点,带通/带阻需要两个点。文中提供了C语言实现代码,包含极值查找、阈值计算和滤波器类型判断等功能,可直接移植使用。算法通过比较当前值与历史值来确定最接近-3dB的点,具有较高的实用性和灵活性。

2025-09-01 11:18:42 384

原创 【FreeRTOS】补充:简明理解CPU、内存、Flash的执行关系和一些简单的汇编指令

本文介绍了计算机系统中CPU、内存和Flash的协作关系:CPU从Flash读取指令,通过寄存器与内存交互数据。重点解析了常见汇编指令:1)内存读写指令(LDR/STR及其变体);2)算术运算(ADD/SUB);3)比较指令CMP;4)跳转指令(B/BL)。内存被组织为可寻址单元,CPU通过指针访问,寄存器分为通用型和功能型(如esp/ebp管理栈帧)。这些基础机制构成了程序执行的核心框架。

2025-09-01 11:12:38 1107

原创 【C语言】深入理解指针(3)

本文系统梳理了C语言中指针相关的核心知识点,主要包括:1.字符指针变量与常量字符串的区别及使用方法;2.一维数组指针变量的创建、初始化和使用技巧,重点解析了其在二维数组打印中的优势;3.二维数组传参的本质探讨;4.函数指针变量的概念及应用;5.函数指针数组和转移表的实现方法,通过简易计算器案例展示了三种实现方式(常规方法、回调函数、转移表)。文章对指针在数组和函数中的应用进行了深入剖析,特别是对一维数组指针在二维数组处理中的优势做了详细论证,为理解指针的高级用法提供了清晰的思路框架。

2025-08-31 02:08:20 687

原创 【C语言】深入理解指针(2)

本文摘要:数组名本质上是数组首元素地址,但存在sizeof(数组名)和&数组名两个例外。指针可用于数组操作,数组传参本质是传递首元素地址。二级指针存储一级指针地址,指针数组存放指针并可模拟二维数组效果,但各数组地址不连续。函数内sizeof无法正确计算数组大小,建议提前计算并传入。

2025-08-30 00:10:55 744

原创 【C语言】深入理解指针(1)

本文系统介绍了C语言中指针的核心概念和使用方法。主要内容包括:1)内存划分与编址原理,将内存比作楼栋,地址对应房间号;2)指针变量定义与解引用操作,强调指针变量存储地址、*操作符访问数据;3)指针变量大小32位平台4字节、64位8字节;4)指针运算规则及const修饰符用法;5)野指针的成因与防范措施;6)指针实现传址调用的原理。通过生活化类比和代码示例,深入浅出地讲解了指针这一重要概念,为后续学习数据结构打下基础。

2025-08-30 00:10:22 5594

原创 【C语言】操作符详解

本文系统介绍了C语言操作符的分类与使用,包括算术、移位、位、赋值等11类操作符。重点讲解了二进制与进制转换方法、原码/反码/补码表示原理、移位和位操作规则,以及结构体成员访问等特殊操作符。同时阐述了表达式求值中的整型提升和类型转换机制,并说明了操作符优先级和结合性的重要性。全文通过具体示例演示了各类操作符的实际应用场景,为深入理解C语言运算机制提供了全面参考。

2025-08-29 11:43:14 806

原创 【C语言】递归

本文介绍了递归的概念、限制条件及具体应用示例。递归是函数自我调用的过程,通过将复杂问题分解为相似子问题来求解,需满足终止条件。文章以阶乘计算、整数逐位打印和斐波那契数列为例,详细说明递归实现思路、函数编写及执行过程,并通过图示推演展示递归流程。同时指出递归的缺陷:可能造成栈溢出和效率低下,建议对斐波那契数等计算采用迭代方式。最后强调递归虽简洁但需慎用,在效率和简洁性间取得平衡。

2025-08-29 07:56:22 918

原创 【C语言】函数栈帧的创建与销毁

文章摘要:本文介绍了函数调用过程中的栈帧管理机制。重点阐述了两个关键寄存器ebp(栈底指针)和esp(栈顶指针)的作用,以及函数调用时栈空间的开辟、初始化过程。详细说明了实参到形参的传递机制、函数执行时对栈空间的操作方式,以及通过eax寄存器带回返回值的原理。同时指出不同编译器在栈帧创建上存在差异,并解释了栈区(高地址向低地址)和堆区(低地址向高地址)的不同使用方向。最后描述了函数返回时通过锚点恢复调用位置的机制。

2025-08-28 15:29:54 439

原创 【C语言】函数

本文介绍了C语言函数的基本概念和使用方法。主要内容包括:1.函数的概念、组成结构(返回类型、函数名、参数、函数体)和编写示例;2.形参与实参的区别,数组作为参数的注意事项;3.函数的声明和调用的三种方式;4.库函数和头文件的作用;5.static和extern关键字的使用,重点说明static修饰局部变量和全局变量的区别,以及extern声明外部符号的作用。文章通过具体代码示例展示了函数的封装和复用优势,以及变量作用域和生命周期的相关概念。

2025-08-28 07:17:58 920

原创 【C语言】数组

本文系统介绍了C语言中数组的概念和使用方法。主要内容包括:一维数组的创建、初始化(完全/不完全)、访问方式(下标/循环)、内存存储特点及大小计算方法;二维数组的创建、初始化(含特殊形式)、行列访问方式及其连续存储特性。此外还介绍了C99标准中的变长数组和字符数组的特殊存储方式(含\0结尾)。文章通过形象的"背包格子"比喻帮助理解数组结构,强调了下标从0开始、内存连续存储、越界访问风险等关键知识点,并对比了sizeof和strlen在字符数组中的不同表现。

2025-08-27 17:34:39 856

原创 【C语言】分支和循环

本文介绍了C语言中的关系操作符、逻辑操作符、分支语句和循环语句。关系操作符包括6种比较运算符,逻辑操作符包含与、或、非三种。分支语句详细讲解了if语句的多种形式及其嵌套使用,以及switch语句的语法结构。循环语句部分涵盖了while、for、do...while三种循环结构,并介绍了break、continue、return和goto四种提前离开循环的方法。文章还特别说明了各语句的语法规则和使用注意事项。

2025-08-26 17:55:38 826

原创 【C语言】一些常见概念

本文摘要:该文档系统介绍了C语言编程基础知识点,包括32个关键字分类(数据类型、控制语句等)、ASCII码表特性、字符串存储规则(以\0结尾)、变量存储区域(栈/堆/静态区)及sizeof用法。重点讲解了输入输出函数:scanf的EOF判断、格式控制及注意事项;printf的格式化输出技巧(对齐、精度控制等)。同时解释了数据类型存储空间、循环输入实现、字符处理差异等内容,为C语言基础学习提供了全面的参考指南。

2025-08-25 08:41:09 911

原创 【STM32F1标准库】代码——定时器中的编码器接口

在使用结构体初始化时有时候不是所有参数都用得上的,同时为了防止没有给结构体所有变量赋值导致错误,建议使用XX_StructInit()函数赋默认值。当变量类型是uint16_t,0--会变成65534,将变量类型强转为int16_t后0--则变成了-1。对于一个寄存器来说,如果同时配置了多次只会保留最后一次的配置,所以功能代码的位置很重要。2.配置输入捕获通道1和输入捕获通道2对应的GPIO为输入模式。使用另一个定时器定时中断,读取前一个定时器测出的转速。使用一个定时器作为编码器接口测速。

2025-07-12 20:24:16 533

原创 【STM32F1标准库】理论——定时器中的编码器接口

1.Encoder Interface 编码器接口2.编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度3.每个高级定时器和通用定时器都拥有1个编码器接口,整个F1只有四个编码器接口资源,且定时器用于做编码器接口后就做不了其他的事情了4.两个输入引脚只能借用输入捕获的通道1和通道2单靠一组方波A,通过测量频率只能知道编码器的转速此时再输出一组方波B,可以人为规定A信号超前或滞后B信号90°分别代表正转或反转。

2025-07-11 09:38:49 321

原创 【STM32F1标准库】代码——定时器中的输入捕获

使用PWMI库函数快捷地配置两个通道,基本逻辑和方法一一致,只需要配置一个通道,库函数会自己将对应的另一个通道进行相反的配置(仅支持每个定时器中的CH1和CH2)所能测得最大频率 = 1MHz,但会存在误差(不是用于信号还原的奈奎斯特采样频率问题)配置一输入捕获通道采集总时间,另一通道采集某一电平时间(需将其配置为交叉输入)在测量频率的基础上使用两个输入捕获通道捕获同一个引脚的信号。想要将最小频率继续降低可以让PSC分频后的频率变低。想要将最大频率继续提高可以让PSC分频后的频率变高。

2025-07-10 07:06:08 521

原创 【STM32F1标准库】理论——定时器中的输入捕获

(1)输入捕获简写为IC(2)输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数(3)每个高级定时器和通用定时器都拥有4个输入捕获通道,和输出比较初始化函数不同,只有一个初始化函数,通过参数选择来选择是哪一个通道(4)可配置为PWMI模式,同时测量频率和占空比(5)可配合主从触发模式,实现硬件全自动测量。

2025-07-09 14:19:24 401

原创 【FreeRTOS】第四课:内存管理

摘要:本文介绍了CubeMX中内存配置的相关内容,包括HEAP_SIZE定义数组大小和heap_4等5种内存管理方法。重点讲解了FreeRTOS中的内存管理函数:pvPortMalloc用于内存分配,vPortFree用于内存释放,xPortGetFreeHeapSize获取当前空闲内存,xPortGetMinimumEverFreeHeapSize记录最小空闲内存,以及malloc失败回调函数vApplicationMallocFailedHook的实现方法。这些配置和函数共同构成了嵌入式系统中的动态内存

2025-07-08 01:02:08 530

原创 【FreeRTOS】第三课:FreeRTOS源码概述

摘要:文章介绍了CubeMX生成的FreeRTOS工程结构,包含配置文件和中间件的展开说明,以及main函数中的关键调用流程:osKernelInitialize()初始化、MX_FREERTOS_Init()创建任务、osKernelStart()启动调度器。最后指出编码规范和命名规则可参考百问网文档。全文简明扼要地概括了FreeRTOS在STM32平台上的基本工程结构和启动流程。

2025-06-24 18:10:15 338

原创 【FreeRTOS】第二课:创建第一个多任务系统

本文介绍了嵌入式系统中RTOS任务创建的标准化方法。主要内容包括:1)通过CMSIS_OS提供的统一接口osThreadNew()实现FreeRTOS和RT-Thread等不同操作系统的任务创建兼容;2)以FreeRTOS的xTaskCreate()函数为例,详细解析了任务创建所需的6个参数及其作用;3)给出具体示例代码,展示如何创建一个名为"MyTask"的LED测试任务,包括任务函数定义和xTaskCreate()调用方法。该内容为嵌入式开发者提供了跨平台任务创建的标准实现方案。

2025-06-24 15:55:22 572

原创 【STM32F1标准库】代码——定时器中的输出比较

摘要:本文介绍了STM32的PWM输出比较初始化流程及其应用实例,包括呼吸灯、舵机和直流电机的驱动实现。主要内容:1)PWM初始化五步骤:时钟开启、时基单元配置、输出比较单元配置、GPIO复用推挽输出配置和定时器使能;2)呼吸灯实现方法,通过循环修改CCR值改变占空比;3)舵机控制将角度线性映射到PWM占空比;4)直流电机驱动需配合方向控制引脚;5)关键注意事项:参数计算、引脚重映射、多通道配置、高级定时器特殊使能和消除电机蜂鸣声的方法。文中提供了完整的代码实现框架。

2025-06-19 00:25:31 475

原创 【FreeRTOS】第一课:前言

摘要:本文介绍了单片机处理代码的三种方式:轮询、前后台系统和多任务系统(FreeRTOS)。轮询依赖while死循环,前后台系统通过中断函数与主程序配合,使用状态机和定时器中断优化执行效率。FreeRTOS通过快速任务切换实现多任务并行。同时指出引入多任务系统后需解决互斥和同步操作问题。文章对比了不同方式的实现原理,为单片机程序设计提供了方法参考。(150字)

2025-06-18 09:11:23 344

原创 【51单片机】外挂DAC和ADC芯片的使用

本文介绍了两种常用数模转换芯片:DAC0832和ADC0809。DAC0832是8位数字模拟转换器,具有两级输入寄存器,支持双缓冲输入,需外接放大器。ADC0809是8路8位模数转换器,采用逐次比较法,内置模拟开关。文中详细说明了两款芯片的引脚功能、工作原理及硬件电路搭建方法,重点阐述了ADC0809与单片机的两种数据读取方式(查询和中断)。这两种芯片分别实现了数字信号与模拟信号的相互转换,在嵌入式系统中具有广泛应用。

2025-06-09 22:18:13 1367

原创 【STM32F1标准库】理论——定时器中的输出比较

本文介绍了定时器输出比较功能及其应用。主要内容包括:1)输出比较(OC)功能简介,用于通过比较CNT和CCR值生成PWM波,支持4路独立输出;2)PWM模式1的工作机制;3)相关概念解析:CCR寄存器、PWM原理(频率与分辨率关系)、舵机控制原理(通过PWM占空比调节角度);4)直流电机驱动方案,重点介绍TB6612双路H桥驱动芯片的工作原理(通过控制电流方向实现电机正反转)。文章从硬件原理到实际应用,系统讲解了PWM生成及电机控制的相关知识。

2025-06-07 23:11:52 496

原创 【STM32F1标准库】代码——定时器/计数器中断

本文详细介绍了STM32定时器/计数器的初始化流程及代码实现。主要内容包括:1.定时器初始化7个关键步骤(时钟开启、时钟源选择、时基配置、中断控制、NVIC配置、定时器使能);2.内部时钟和外部时钟两种中断代码示例,其中外部时钟采用ETR引脚输入;3.常见问题解决方案,如首次中断消除方法和外部时钟滤波参数选择。文中提供了完整的配置代码模板,并解释了时基单元参数设置(PSC、ARR等)的计算方法,特别强调NVIC分组只需配置一次。该教程适用于STM32F10x系列定时器开发参考。

2025-06-06 16:56:38 903

原创 【STM32F1标准库】理论——定时器/计数器中断

摘要:本文介绍了定时器/计数器的基本原理和应用。主要内容包括:1)定时器分类(通用、基本定时器)及其功能特点;2)时基单元工作原理,包含分频器、计数器和自动重装寄存器;3)结构框图及时序分析;4)改变分频系数时的缓冲器机制;5)详细给出了计数频率和溢出频率的计算公式。重点阐述了在72MHz主频下,通过预分频系数(PSC)和自动重装值(ARR)的配置实现精确定时的方法。

2025-06-01 23:51:57 1249

原创 【STM32F1标准库】代码——外部中断

本文介绍了STM32外部中断的配置流程及常见应用。主要内容包括:1.外部中断配置步骤:开启时钟、配置GPIO、AFIO、EXTI和NVIC;2.对射式红外传感器和旋转编码器的计次代码实现;3.关键注意事项:NVIC分组只需配置一次、中断标志位必须清除、多中断源共用中断函数的处理方法等。文中提供了详细的代码示例和配置说明,重点强调了中断优先级设置、中断标志位清除等易错环节,为STM32外部中断开发提供了实用指导。

2025-06-01 22:27:22 336

原创 【STM32F1标准库】理论——外部中断

STM32中断系统由NVIC统一管理,支持外部引脚(EXTI)、定时器等多种外设触发。EXTI可监测GPIO电平变化,支持上升沿/下降沿等触发方式,但相同位号Pin不能同时触发。中断分为响应优先级和抢占优先级,数值越小优先级越高。使用时需注意:中断函数应简洁高效,避免主程序和中断程序同时操作同一硬件,每次中断后需清除标志位。外部中断适用于STM32需被动响应外部信号的场景。

2025-06-01 21:15:55 454

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除