ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从零备赛电子设计竞赛:STM32传感器控制实战经验全记录

从零备赛电子设计竞赛:STM32传感器控制实战经验全记录 从四天三夜的赛场上走出来那一刻最想做的事不是庆祝而是找一个地方睡一觉。回想这学期刚开始组队时大家还只会点灯、读传感器面对题目要求脑子里完全没有执行路径到了备赛后期几乎每天都是在调板子、改代码、翻手册、查波形中度过的。过程很累中间也迷茫过很多次但真正把系统跑通、把设计文档写完交上去的时候心里只剩下一个念头这一切都值得。这篇笔记我想把第一次参加电子设计竞赛的完整经验整理出来内容包括赛前准备、技能路线、开发环境搭建、一个可复现的最小实战项目以及我们在现场调试时踩过的高频问题。文章没有把范围铺得很大重点集中在 STM32 平台和传感器控制类题目方向特别适合第一次参赛、对自己动手能力还不够自信的同学。1. 电赛是什么为什么第一次参赛会感到迷茫1.1 电赛的基本认识电子设计竞赛很多同学习惯简称“电赛”。它并不是一个人坐在电脑前写代码的比赛而是以团队为单位在有限时间内完成一个电子系统的设计、制作、调试和报告撰写。正式比赛通常会在一个集中的时间段内进行常见赛制是团队在规定天数内完成比如大家常说的“四天三夜”。比赛题目一般分为几个大方向包括电源类DC-DC 转换、逆变、恒流恒压充电等。信号与控制类波形发生、信号采集、电机控制、小车循迹等。仪器仪表类测量电压、电阻、电容、频率并显示结果。通信类无线收发、调制解调等。对于第一次参赛的同学来说最容易犯的错误是把“比赛”理解成“解题”总觉得要学完所有专业课才敢报名。实际上电赛更考验的是快速学习、快速搭建、快速验证的能力。比赛题目不会等你把《模拟电子技术》和《信号与系统》全部吃透它只关心你能不能在一个不长的周期内把一个可工作的实物系统做出来。1.2 第一次参赛为什么会累为什么会迷茫大多数新手队伍都会经历几个相似的阶段第一个阶段是“不知道学什么”。组队后大家热情很高但打开资料一看内容太多太杂单片机、传感器、电源、 PCB、上位机、算法每一块都感觉要学每一块又不知道怎么开始。这种状态下最容易产生焦虑。第二个阶段是“调不通”。备赛前期做的小模块往往问题不断串口打印乱码、ADC 数值跳变、电机不转、电压纹波大。每个问题背后都涉及不同的原因如果缺少系统的排查思路很容易陷入“改一下碰运气”的恶性循环。第三个阶段是“时间不够”。课程作业、考试周和备赛时间重叠经常白天上课晚上熬夜调板子体力消耗很大这也是“累”的主要来源。但这些迷茫其实都可以通过缩小目标来缓解。我们当时给自己定的原则是先不追求知识面全面而是把“一块开发板、一个传感器、一条串口输出、一个控制动作”完整跑通。主控能采集数据能计算能输出结果能报错这套链路打通以后后续的扩展才谈得上。1.3 参赛能带来的真实收获不夸张地说一次认真备赛的电赛经历比很多门课的期末大作业都有训练价值。首先是工程能力。比赛要求你从零构建一个系统而不是只写一个函数、跑一个仿真。你会接触到原理图、数据手册、硬件调试、软件联调、报告排版这些课堂上极少串联起来的环节。其次是信息检索与自学能力。遇到问题后的第一反应不再是“等老师讲”而是主动去查手册、翻论坛、看别人写的踩坑记录。这种找到问题根因并独立解决的能力在以后做项目和进入岗位后都非常重要。再次是团队协作和时间管理。三个人各有分工要在几天内完成软硬件联调和文档输出。如何沟通、如何同步代码、如何留出容错时间这些经验只有在真实项目压力下才能获得。从功利角度看高质量的电赛经历对考研复试、保研材料、找工作简历都有加分作用。但我不建议单纯为了奖项去参赛因为如果只盯着结果你很难忍受漫长的调试过程反过来当你真的把一个项目完整做下来奖项往往只是水到渠成的事。2. 备赛要建立的知识体系与硬件储备2.1 知识准备学多少才够用第一次参赛不需要什么都精通但有几块基础知识是必须覆盖的。我在下面列了一个比较基础的技能清单知识方向核心内容能达到什么效果电路基础欧姆定律、分压、电源纹波、滤波电容看懂模块原理图判断接线是否安全模拟电路基础运放、比较器、基准电压处理传感器信号调理数字电路基础高低电平、推挽输出、开漏输出理解 GPIO 配置和电平匹配嵌入式C语言变量、指针、结构体、状态机写出可维护的 MCU 程序传感器与通信协议UART、I2C、SPI、ADC读取传感器数据并传输显示电源知识稳压芯片、LDO、DC-DC给系统提供稳定的供电其中最重要的是嵌入式 C 语言和通信协议。电赛题目无论怎么变绝大多数系统都是“传感器采集 - 主控计算 - 执行/显示”这个结构。只要你能熟练完成这个闭环就相当于掌握了电赛的基础框架。2.2 硬件平台选择第一次参赛用什么板子第一次参加电赛的主控建议选 STM32F103C8T6也就是大家常说的“C8T6 最小系统板”。理由有三个资料多遇到问题很容易搜到解决方案。外设丰富有 GPIO、定时器、ADC、UART、I2C、SPI足以覆盖大部分低难度题目方向。成本低即使调试时烧坏芯片换一块也不会太心疼。除了主控建议提前准备以下模块OLED 显示屏用于现场实时显示数据。USB 转 TTL 串口模块用于调试打印。按键和 LED用于交互与告警。电位器/分压电阻模拟电压信号源。常用传感器比如温湿度、超声波测距、光敏电阻等。电机驱动模块和直流减速电机如果方向偏控制和车类题。面包板、杜邦线、排针、焊台、万用表。需要提醒的是比赛现场搭系统时尽量使用你赛前已经验证过的模块。不要赌“到了现场再看手册”的运气。我们常说“比赛比的不是谁用的模块多而是谁的系统稳定”这是亲身总结出来的经验。2.3 学习节奏建议如果离比赛还有一个学期建议按下面的节奏准备第 1-3 周掌握开发环境点亮一颗 LED用按键控制它。第 4-6 周学习 UART 串口输出采集一个模拟量并通过串口打印。第 7-9 周学习 I2C 或 SPI读取一个数字传感器并显示在 OLED 上。第 10-12 周结合 PMW 驱动一个电机或者 LED 亮度调节理解控制量输出。剩余时间找一个往届题目团队完整做一次仿真模拟。这里的关键是“完整地做一次”。很多同学平时跟着教程点灯很容易但一到自己综合设计就无从下手。原因就是教程里的例子都是孤立的缺少把多个功能串起来的训练所以必须用一次综合开发来弥补这个短板。3. 开发环境准备与最小工程创建3.1 软件准备第一次参赛建议使用 STM32CubeMX 配合 Keil MDK 开发因为 CubeMX 能用可视化方式帮我们快速完成引脚配置和时钟配置生成工程框架后再用 Keil 编写业务代码。需要安装的软件主要有STM32CubeMX用来创建工程、配置芯片引脚和外设。Keil MDK用来编译、烧录和在线调试。ST 官方提供或者 Keil 中自带的 STM32F1 系列器件支持包。ST-Link 驱动如果你使用 ST-Link 下载器则需要安装。不同软件版本的界面会有细微差别但整体操作流程是通用的。我下面以“STM32F103C8T6 ST-Link 外部 8MHz 晶振最小系统板”为例进行说明。如果你的开发板没有外部晶振可以选择内部时钟 HSI 作为时钟源配置思路是一样的只是 SYSCLK 频率会根据 PLL 设置而变化。这一点不要照抄一定要根据自己板子的实际情况来。3.2 在 CubeMX 中创建最小工程打开 STM32CubeMX选择 New Project在芯片搜索框输入 STM32F103C8T6双击选中后会进入引脚配置界面。我们需要完成以下几项配置项建议值说明SYS - DebugSerial Wire保留 SWD 下载调试接口RCC - HSECrystal/Ceramic Resonator使用外部晶振PC13GPIO_Output接外部LED或者板载LEDUSART1Asynchronous串口调试输出ADC1 - IN0使能将 PA0 配置为模拟输入时钟树部分如果 HSE 是 8MHz建议把 PLL 倍频配置为 x9使 SYSCLK 达到 72MHz。如果开发板没有外部 8MHz 晶振或使用的不是 8MHz 晶振需要按实际晶振频率调整倍频系数并确认芯片主频不超过规格书允许值。在 Project Manager 页面设置工程名称、存放路径Toolchain/IDE 选择 MDK-ARMCode Generator 中勾选 “Generate peripheral initialization as a pair of .c/.h files”这样外设初始化代码会分别生成到对应的 .c 和 .h 文件中结构更清晰。点击 Generate Code 生成工程然后使用 Keil 打开。3.3 验证最小工程可以编译下载工程生成后我们先不写复杂逻辑只在主循环里让 LED 闪烁一次验证整个开发链路是否正常。// 文件路径Core/Src/main.c // 位置main 函数中 while(1) 循环的 USER CODE BEGIN 3 while (1) { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); HAL_Delay(200); HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); HAL_Delay(200); }这里假设 CubeMX 中已经把 PC13 命名为 LED。如果你的开发板 LED 接法不同需要参考原理图调整引脚和有效电平。如果开发板上的 LED 在 PC13 且低电平点亮上面的代码可以正常工作。编译无误后通过 ST-Link 连接开发板并点击下载。程序下载成功后如果 LED 每 200ms 翻转一次说明整个工具链、芯片和下载器都没有问题。这是后面所有实战的基础务必先确认再继续。4. 核心外设与调试链路4.1 GPIO 输出与按键输入GPIO 是嵌入式最基础的外设。输出模式下可以控制 LED、继电器、蜂鸣器等输入模式下可以读取按键、编码器信号等。按键读取看起来简单实际很容易踩坑。最常见的问题是按键抖动导致一次按下被识别成多次处理方法有两种一种是硬件 RC 滤波一种是软件延时消抖。软件写法如下// 文件路径Core/Src/main.c // 假设按键接在 PB0CubeMX 中配置为 GPIO_Input // 按下为低电平 if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) GPIO_PIN_RESET) { HAL_Delay(20); if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) GPIO_PIN_RESET) { // 20ms 后仍然是低电平说明确实按下 // 在这里执行按键处理逻辑 while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) GPIO_PIN_RESET); } }这里的思路是第一次检测到低电平后延时 20ms 再检测一次如果依然为低电平才认为按键有效。后面的 while 循环用于等待按键释放避免一次按住期间反复触发。4.2 定时器与延时HAL_Delay 是最简单的延时方案但它有一个明显缺点延时期间 CPU 会一直阻塞无法处理其他任务。如果系统里有多个传感器需要频繁采样依赖长延时会让整体实时性变差。比赛和工程中常用的处理方式有两种使用定时器中断产生时间基准在中断中翻转状态或累加标志。使用一个系统 tick 变量主循环根据时间差判断是否达到任务执行周期。举例来说在循环中每 100ms 采集一次传感器不应该写成while (1) { read_sensor(); HAL_Delay(100); // 阻塞期间无法处理按键和告警 }而可以采用非阻塞调度思路。学会用定时器以后你会发现系统可以同时管理“采集”“显示”“通信”“报警”等多个任务。备赛阶段即使不写 RTOS 实时操作系统也可以用简单的状态机和时间片轮询处理。4.3 串口调试输出串口是嵌入式调试最重要的工具。不管程序出了什么问题先把关键变量的值通过串口打印出来往往比直接用调试器看寄存器更直观。CubeMX 配置 USART1 为异步模式后通常默认使用 PA9 作为 TXPA10 作为 RX。波特率可以设置为 1152008 位数据位1 位停止位。在 Keil 中可以使用 HAL 库函数直接发送字符串// 文件路径Core/Src/main.c // 需要在文件开头包含 string.h char message[64]; snprintf(message, sizeof(message), adc_val:%lu\r\n, (unsigned long)adc_value); HAL_UART_Transmit(huart1, (uint8_t *)message, strlen(message), 100);使用串口调试助手可以看到输出内容。注意单片机的地线要跟串口模块共地否则可能出现数据乱码或者收不到数据。我们不在这里展开 printf 的重定向因为 HAL_UART_Transmit 已经足够完成基础输出先保证数据传输稳定再考虑编码优化。4.4 ADC 模拟量采集ADC 的作用是把连续的模拟电压转换为数字值。在电赛中ADC 通常用于采集传感器电压、电池电压、电位器阻值对应电压等信号。STM32F103C8T6 的 ADC 是 12 位精度因此读到的数字量范围是 0~4095。如果参考电压是 3.3V则电压计算公式为电压 ADC数值 / 4095 × 3.3V采集单个通道的流程如下// 文件路径Core/Src/main.c // 在 CubeMX 中启用 ADC1_IN0通道为 PA0 // 每次采集都启动一次转换 HAL_ADC_Start(hadc1); if (HAL_ADC_PollForConversion(hadc1, 100) HAL_OK) { uint32_t adc_value HAL_ADC_GetValue(hadc1); float voltage (float)adc_value * 3.3f / 4095.0f; } HAL_ADC_Stop(hadc1);这里没有开启连续转换模式因此每次采集前需要调用 HAL_ADC_Start然后等待转换完成再读取结果。ADC 数值常常会有小幅波动为了提高稳定性可以多次采样取平均。切不可在 ADC 输入引脚上加过高的电压如果超过 3.3V可能会损坏 MCU 引脚。5. 实战案例简易电压监测与报警系统5.1 需求拆解这一部分我们不再做零散的外设实验而是把它组合成一个小系统。题目可以这样设定设计一个简易电压监测装置。使用电位器模拟外部输入电压主控采集电压值通过串口发送到上位机显示当电压超过设定阈值时LED 点亮告警电压回落后LED 熄灭。这个题目看似简单但它包含了模拟输入、ADC 采样、串口通信、阈值判断和输出控制是一个典型的电赛题目最小原型。把它吃透以后再复杂的采集系统也是在这个基础上扩展出来的。系统工作流程可以拆成初始化时钟、GPIO、ADC、USART。主循环延时 200ms。读取 ADC 数值。将 ADC 数值换算为电压值。通过串口发送当前电压。判断电压是否超过阈值如果超过则点亮 LED。5.2 硬件连接实际硬件连接如下模块引脚/接口说明STM32F103C8T6 开发板PA0模拟电压输入对应 ADC1_IN0电位器中间抽头PA0通过电位器分压产生 0~3.3V 电压电位器两端3.3V 和 GND提供分压参考USART1 TXPA9连接 USB 转串口模块 RXUSART1 RXPA10连接 USB 转串口模块 TXLEDPC13报警 LEDUSB转串口连接电脑用于串口调试注意电位器输出不能直接接高于 3.3V 的电源。如果实际要测量电池电压通常需要先用电阻分压把电压降到 3.3V 以下同时注意分压电阻的精度和功率约束。这里为了快速验证功能直接用 3.3V 供电的电位器模拟即可。5.3 CubeMX 配置要点在 CubeMX 中做以下配置配置项推荐值说明MCUSTM32F103C8T6通用入门芯片SYS DebugSerial Wire使用 SWD 下载ADC1IN0 Single-ended使能 PA0 模拟输入ADC1 ParameterContinuous Conversion Mode: Disabled每次按需启动转换USART1Asynchronous, 115200-8-N-1串口输出PC13GPIO_Output设置标签 LED生成工程后在 Keil 中确认主时钟是否已经正确工作。如果系统运行时钟不对ADC 采样时间和串口波特率都会受影响表现为数据不准或乱码。5.4 主程序实现在 main.c 的 User Code Begin 区域添加代码。这里我们增加一个平均值采样函数用来降低 ADC 值的随机波动。// 文件路径Core/Src/main.c // 位置main 函数上方USER CODE BEGIN 0 #include string.h #include stdio.h // 读取指定平均次数的 ADC 数值 static uint32_t adc_read_average(uint8_t times) { uint32_t sum 0; for (uint8_t i 0; i times; i) { HAL_ADC_Start(hadc1); if (HAL_ADC_PollForConversion(hadc1, 10) HAL_OK) { sum HAL_ADC_GetValue(hadc1); } HAL_ADC_Stop(hadc1); HAL_Delay(2); } return sum / times; }主循环中的业务代码如下// 文件路径Core/Src/main.c // 位置main 函数中USER CODE BEGIN 3 uint8_t temp_buf[64]; float voltage 0.0f; while (1) { uint32_t adc_value adc_read_average(10); voltage (float)adc_value * 3.3f / 4095.0f; // 通过串口打印当前电压 int len snprintf((char *)temp_buf, sizeof(temp_buf), voltage:%.3fV\r\n, voltage); HAL_UART_Transmit(huart1, temp_buf, len, 100); // 阈值判断2.8V 以上点亮 LED if (voltage 2.8f) { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); } else { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); } HAL_Delay(200); }以上代码中LED 使用的是低电平点亮。如果你的 LED 接线是高电平点亮需要把 WritePin 的两个电平反过来。5.5 运行与验证编译下载后打开串口调试助手选择对应波特率 115200可以观察到类似下面的输出voltage:0.001V voltage:0.356V voltage:1.208V voltage:2.467V voltage:2.931V voltage:2.934V转动电位器时电压值会随电位器位置变化。当电压超过 2.8V 时LED 亮起电压降回 2.8V 以下时LED 熄灭。如果出现数值纹波或者跳变可以通过增加平均次数、减小采样间隔、在 ADC 引脚加 100nF 滤波电容等方式改善。到这里一个简单的采集-计算-输出-控制闭环就完成了。别看它功能简单里面的 ADC 采样、串口通信、阈值判断逻辑是很多竞赛题目的公共骨架。后续如果想扩展多通道只需要在 CubeMX 中增加新的 ADC 通道如果想显示结果可以在串口输出基础上再增加 OLED如果想控制电机可以把 LED 翻转替换为 PWM 输出。6. 电赛现场调试与高频问题排查6.1 ST-Link 下载失败现象Keil 点击下载后提示找不到设备或者提示 RDDI-DAP Error。排查顺序检查 ST-Link 与开发板接线SWDIO、SWCLK、GND 三条线必须连接正确。检查开发板是否独立供电很多下载失败问题其实是板子没上电。检查 Keil 的 Debug 设置中是否选择了 ST-Link并确认 Port 为 SW。如果还是无法连接按住开发板复位键点击下载同时松开复位键。在赛事现场备用下载线、备用板子都建议带一套。下载器接触不良会浪费很多时间优先排查物理连接。6.2 串口无输出或者乱码可能原因比较多按频率排序现象常见原因解决思路串口完全无输出TX/RX 接反交换串口模块两端接线串口完全无输出没有共地将开发板和 USB转串口模块的地接在一起串口乱码波特率不匹配确认代码和串口助手的波特率一致串口乱码系统时钟配置错误检查 CubeMX 的时钟树和 PLL 倍频输出有部分符号异常编码格式问题使用 ASCII 编码输出避免中文乱码6.3 ADC 数值跳变严重ADC 数值跳变首先排除供电问题。如果开发板用 USB 供电且传感器或电机功耗较大电压会产生周期性波动ADC 参考电压不稳定采样值自然不准。处理方法可以分几步在 ADC 输入引脚与地之间并联 100nF 电容滤除高频噪声。在芯片电源引脚附近增加 100nF 去耦电容。多次采样取平均或使用中值滤波。不宜一味减少采样次数追求速度精度和速度要权衡。如果在比赛现场遇到 ADC 数值误差超过可接受范围可以用万用表实测输入引脚电压把实际电压与单片机计算值对比判断是硬件分压问题还是 ADC 配置问题。6.4 硬启动时系统卡死或晶振起振失败系统上电后无法运行但程序之前下载正常这类问题常见于时钟配置。如果开发板设计时没有外部晶振但代码里使能了 HSE系统就会因为等待外部时钟超时而卡住。解决办法是把时钟源改成 HSI 内部时钟并重新调整 PLL 倍频。比如内部 HSI 为 8MHz可以通过 PLL 设置为 64MHz 或 72MHz但必须查阅芯片数据手册确认频率范围。更换板子后第一件事应该是确认板载晶振频率和 CubeMX 配置一致。6.5 现场排查问题的方法论比赛现场时间紧张最怕遇到问题乱试。我们小组后来总结出一个固定排查顺序先看电源。万用表量供电电压是否正常模块地线是否共地。再看时钟。烧一个 LED 闪烁程序确认主控在跑。然后最小化系统。把多余外设断开只保留当前要调试的功能。使用串口打印中间变量。定位问题在传感器、算法还是输出环节。改一处、测一处、记录一处。不要同时改多个变量再盲试。这个流程看起来很基础但在高压状态下非常有效。7. 备赛和比赛中的工程化习惯7.1 代码应及时备份并做版本管理第一次参赛最容易发生的惨剧是程序改到一半编译报错想回退到刚才能运行的版本却发现已经覆盖了。备赛过程中代码变化频繁强烈建议一开始就使用 Git 做版本管理。如果不会 Git 命令也可以在项目根目录定期复制项目文件夹加上日期后缀例如project_20250301_v1 project_20250302_v2每个阶段能运行、能演示的程序要单独保存。比赛现场也不要把所有代码只放在一个电脑上至少准备一个 U 盘和一整套云端备份防止电脑崩溃导致全部工作丢失。7.2 模块接入前先做单模块测试电赛现场常见的翻车现场是把一堆没有单独验证过的模块直接接到主控上。结果系统无法工作根本分不清是传感器坏、接线错、代码错还是电源带不动。正确做法是每个模块在赛前都写一个只包含该模块的最小测试程序。比如 OLED 显示模块单独验证能否显示字符串电机驱动模块单独验证能否控制正反转传感器模块单独读取原始数据并处理成物理量。这样在最后联调时每个模块都是可信赖的黑盒问题范围会大大缩小。7.3 供电设计要留有余量比赛系统经常由多个模块组成最容易被忽略的是电流余量。一个开发板加上几个传感器、一个显示屏、一个电机驱动峰值电流可能会超过普通 USB 口的供电能力。建议在主电源和模块电源之间使用稳压模块大功率负载尽量单独供电模拟信号电路和数字电路避免共用一个电源路径。如果听到蜂鸣器、看门狗复位很可能是电源瞬间跌落此时应先检查供电能力而不是反复改软件。7.4 文档和演示流程要提前准备电赛不只是做实物还需要现场演示和提交设计报告。很多队伍在硬件和代码上投入大量时间最后留给文档的时间太少结果报告写得仓促十分可惜。建议在备赛阶段就建立一套文档模板记录系统框图、模块清单、关键代码说明、测试数据、问题记录等内容。比赛调试过程中顺手记录问题与解决方案这些资料最后可以快速整理成报告。演示环节也要提前排练确保演示路径最短、最可靠而不是把所有功能都演示一遍。8. 给第一次参赛的你一些真心建议如果回到这学期刚开始的时候我最想告诉自己的一句话是不要觉得“等准备好再开始”才是正确策略。电子设计竞赛里的很多能力恰恰是在一边做一边学、一边踩坑一边修正的过程中练出来的。你不需要成为每一个领域的专家但你需要愿意围着系统转遇到问题就去查、去试、去问。第一次参赛感受到累和迷茫再正常不过。你可能会在深夜因为一个电阻分压算错而怀疑能力也可能在为一段反复调不通的代码焦虑到睡不着。但请相信只要今天比昨天多解决了一个问题这段经历就不会白费。就算最终没有拿到理想中的奖项在一次完整备赛过程中培养出的调试思路、代码组织习惯、团队配合能力也远比一张奖状更持久。我们现在再回头看脑子里留下的最深的画面不是哪一个瞬间的荣誉而是一起排查问题时的激烈讨论和系统第一次按要求完整运行时的兴奋感。如果这篇笔记能帮你在报名前少一点犹豫在备赛中少踩几个坑或者在比赛现场更快定位一个问题那它就完成了我写下来的意义。希望它能成为你电赛备赛路上的参考之一。电赛从来不是一条轻松的路但认真走下来真的值得。
返回列表