STM32Cube_FW_F3固件包安装与HAL工程搭建避坑指南
简介STM32Cube_FW_F3_1.11.0.zip是意法半导体为STM32F3系列微控制器推出的官方HAL封装库软件包面向基于ARM Cortex-M4内核进行嵌入式开发的工程师与学习者帮助其摆脱底层寄存器操作通过标准化API快速驱动GPIO、ADC、DAC、UART、SPI、I2C、TIM、RTC等外设提升代码可移植性与维护效率。压缩包约148.39MB共约2000个文件以C源码与头文件为主体辅以HTML文档、汇编启动文件、JavaScript脚本及PNG图示并包含大量uvprojx、ewp等IDE工程文件与链接脚本覆盖多种工具链与开发环境。资源还附带示例工程、应用笔记及FreeRTOS、USB、TCP/IP等中间件支持兼容STM32F301至STM32F398等多款型号可与STM32CubeIDE、STM32CubeMX配合完成配置与代码生成。目前已有757人学习下载适合需要系统掌握STM32F3 HAL与LL驱动开发、对照官方示例查漏补缺的读者参考使用。1. 拿到 STM32Cube_FW_F3_1.11.0.zip 之后先别急着解压STM32F3 系列在电机控制、数字电源和模拟采集场景里出镜率很高配套的 STM32Cube_FW_F3 固件包几乎是每个项目起步阶段绕不开的东西。但很多人拿到STM32Cube_FW_F3_1.11.0.zip之后第一反应是双击解压、随便找个目录一扔然后在 IDE 里新建工程时发现 HAL 库路径对不上、CMSIS 头文件找不到、链接脚本还是默认的编译报错一屏接一屏。这套固件包不是普通压缩包它是一整套按目录结构组织的 HAL 封装库加中间件加工程模板解压位置、目录层级、IDE 版本三者必须对齐才能跑通。这篇记录面向刚接触 STM32F3 的开发者也面向从标准外设库迁移过来、对 HAL 封装库结构还不熟的人把从下载到点灯验证的完整链路走一遍。2. 环境准备版本、目录和工具链先对齐2.1 确认你手上的芯片和固件包版本匹配STM32Cube_FW_F3 的版本号跟芯片子系列是绑定的。1.11.0 这个版本覆盖的是 STM32F301、F302、F303、F318、F328、F334、F358、F378 等 F3 全系但不同子系列的启动文件和外设实例数量不一样。我一般会先确认两件事芯片具体型号以及当前用的 IDE 是哪个版本。如果你用的是较新的 STM32CubeIDE它内置的固件包管理器可能已经带了更高版本的 F3 包这时候手动解压 1.11.0 反而会造成版本冲突。常见做法是在 IDE 里通过 Help → Manage Embedded Software Packages 查看已安装的 F3 包版本如果已经有 1.11.0 或更高就不需要手动解压。如果 IDE 里没有或者你用的是 Keil MDK、IAR 这类不内置包管理器的环境才需要手动处理这个 zip。提示1.11.0 属于 F3 系列里比较成熟的版本HAL 层 API 已经稳定网上能找到的例程大多基于这个版本或相近版本选它踩坑概率低。2.2 解压位置决定后续所有路径这是最容易翻车的一步。很多人把 zip 解压到桌面或者下载文件夹然后在工程里用绝对路径去引用换台机器就全红。正确的做法是建立一个固定的仓库目录比如# 我一般会在用户目录下建一个统一的固件仓库 mkdir -p ~/STM32Cube/Repository cd ~/STM32Cube/Repository # 把 zip 解压到这里解压后会得到一个以包名命名的文件夹 unzip ~/Downloads/STM32Cube_FW_F3_1.11.0.zip -d . # 确认目录结构 ls STM32Cube_FW_F3_1.11.0/解压后你应该看到这些顶层目录DriversCMSIS 和 HAL 驱动、MiddlewaresUSB、FatFs、FreeRTOS 等、Projects各开发板例程、Utilities。如果解压出来只有一堆散文件说明压缩包结构被破坏了重新下载。逻辑说明-d .表示解压到当前目录解压后会自动创建STM32Cube_FW_F3_1.11.0文件夹。放在~/STM32Cube/Repository下的好处是STM32CubeIDE 和 CubeMX 默认就会扫描这个路径后续新建工程时能直接识别到这个包不用手动指定路径。2.3 工具链版本对照不同 IDE 对固件包的兼容性有差异下面是我在几个常见环境里验证过的组合工具链推荐版本注意事项STM32CubeIDE1.10 及以上内置包管理器优先用它装Keil MDK5.30 及以上需手动添加 HAL 源文件到工程IAR EWARM8.50 及以上注意链接脚本要换成 F3 对应的Makefile GCCarm-none-eabi-gcc 10.3需自己写链接脚本和启动文件引用如果你用 Keil 或 IAR手动建工程时要把Drivers/STM32F3xx_HAL_Driver/Src下的源文件按需添加不要全加否则编译时间会很长。我一般只加用到的那几个外设的.c文件比如stm32f3xx_hal_gpio.c、stm32f3xx_hal_rcc.c、stm32f3xx_hal_uart.c。3. 安装与工程搭建从零建一个能编译的 HAL 工程3.1 用 STM32CubeIDE 导入固件包并新建工程如果你用 STM32CubeIDE最省事的路径是让 IDE 自己识别仓库目录。打开 IDE进入 Window → Preferences → STM32Cube → Firmware Updater在 Repository Folder 里填~/STM32Cube/Repository然后点 Check for UpdatesIDE 会扫描到 1.11.0 这个包并标记为已安装。接下来新建工程File → New → STM32 Project在芯片选择器里输入你的 F3 型号比如 STM32F303CBT6。下一步会问你要不要用 CubeMX 初始化外设选 Yes然后进入引脚配置界面。配置完时钟和 GPIO 后生成代码IDE 会自动把 HAL 库引用加进工程。// 生成后的 main.c 里会有这样的初始化调用 MX_GPIO_Init(); MX_USART2_UART_Init(); // 这些函数由 CubeMX 根据你的配置自动生成 // 底层调用的就是 STM32Cube_FW_F3 里的 HAL 封装库逻辑说明MX_GPIO_Init()内部会调用HAL_GPIO_Init()这个函数来自stm32f3xx_hal_gpio.c。CubeMX 生成代码的好处是外设时钟使能、引脚复用配置、中断优先级都帮你算好了不需要手动查参考手册。参数方面GPIO 模式、上下拉、速度这些都在 CubeMX 的图形界面里选生成后对应到GPIO_InitStruct的各个字段。3.2 手动建工程时的文件引用清单如果你不用 CubeIDE比如在 Keil 里从零建工程需要手动把固件包里的关键文件加进来。下面是我一般会加的清单# 启动文件根据芯片型号选F303CB 用的是这个 Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/gcc/startup_stm32f303xc.s # 系统初始化 Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/system_stm32f3xx.c # HAL 核心 Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c # 如果用到串口再加这个 Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart.c头文件路径也要加Drivers/STM32F3xx_HAL_Driver/Inc、Drivers/CMSIS/Device/ST/STM32F3xx/Include、Drivers/CMSIS/Include。这三个路径缺一个都会报No such file or directory。另外stm32f3xx_hal_conf.h这个文件需要从Projects下某个例程里拷一份过来放在你的工程Inc目录下。这个文件控制哪些 HAL 模块被编译进去默认是全部开启你可以按需注释掉不用的模块来减小体积。3.3 时钟配置HAL 封装库最容易配错的地方F3 系列的时钟树比 F1 复杂HAL 库把 PLL 配置封装成了RCC_OscInitTypeDef和RCC_ClkInitTypeDef两个结构体。我见过不少人直接抄 F103 的配置结果 F3 跑不起来因为 F3 的 HSE 分频和 PLL 倍频系数范围不一样。// 以 HSE 8MHz 晶振、目标 72MHz 系统时钟为例 RCC_OscInitTypeDef RCC_OscInitStruct {0}; RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL RCC_PLL_MUL9; // 8MHz * 9 72MHz HAL_RCC_OscConfig(RCC_OscInitStruct); RCC_ClkInitTypeDef RCC_ClkInitStruct {0}; RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2; // APB1 最高 36MHz RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV1; HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2);逻辑说明PLLMUL设成 9 是因为 8MHz 晶振乘 9 得到 72MHz这是 F303 的常见主频。FLASH_LATENCY_2是必须的72MHz 下 Flash 需要 2 个等待周期设成 0 或 1 会导致取指错误、程序跑飞。APB1CLKDivider设成 2 是因为 APB1 总线最高只能到 36MHz超了外设会工作异常。这些参数在 CubeMX 里会自动算好手动写的话一定要对着参考手册的时钟树核对。4. 避坑与排查装完编译不过的几种典型情况4.1 报错stm32f3xx_hal.h: No such file or directory现象编译时提示找不到 HAL 头文件但明明已经加了Drivers/STM32F3xx_HAL_Driver/Inc路径。原因路径加的是相对路径而 IDE 的工作目录变了或者路径拼写有误比如把STM32F3xx写成了STM32F3。解决在 IDE 的 include 设置里改用绝对路径或者用 IDE 内置的变量如${workspace_loc}。Keil 里检查 Options for Target → C/C → Include PathsIAR 里检查 Project → Options → C/C Compiler → Preprocessor。4.2 链接时报undefined reference to HAL_Init现象编译通过链接阶段报一堆未定义引用全是 HAL 开头的函数。原因HAL 的.c文件没有加入编译或者加了但被排除在构建之外。解决检查工程的文件列表确认stm32f3xx_hal.c在编译列表里。Keil 里右键文件看 Options确认没勾 Exclude from build。IAR 里看文件属性确认没被标记为 excluded。4.3 程序下载后不运行调试器停在Default_Handler现象下载成功但复位后程序不跑调试器显示停在Default_Handler的死循环里。原因启动文件选错了。F303CB 应该用startup_stm32f303xc.s如果错用了startup_stm32f303xe.s中断向量表对不上一进中断就飞。解决核对芯片型号和启动文件后缀。F303CB 是 128KB Flash对应xcF303RE 是 512KB对应xe。在Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/下找到正确的启动文件替换。4.4stm32f3xx_hal_conf.h里模块没开导致函数找不到现象调HAL_UART_Transmit()报未定义但stm32f3xx_hal_uart.c明明加了。原因stm32f3xx_hal_conf.h里HAL_UART_MODULE_ENABLED被注释掉了。解决打开这个头文件确认用到的模块对应的宏是打开的。默认模板里大部分模块是开启的但如果你从别处拷了一份精简过的配置可能被关掉了。4.5 中断优先级配置冲突导致 HardFault现象用了 FreeRTOS 或者多个中断运行一段时间后进 HardFault。原因HAL 库的HAL_Init()默认把 NVIC 优先级分组设为 4所有位都是抢占优先级。如果 FreeRTOS 的configPRIO_BITS设成 4但某个中断的优先级数值超过了允许范围就会触发异常。解决在HAL_Init()之后、任何中断使能之前调用HAL_NVIC_SetPriorityGrouping()设置合适的分组。FreeRTOS 场景下一般用NVIC_PRIORITYGROUP_4然后确保所有中断优先级数值在configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY之下。5. 验证跑通点灯、串口和时钟输出三件套装完环境、编译通过只是第一步真正验证固件包和 HAL 封装库工作正常我一般会跑三个测试GPIO 翻转、串口输出、MCO 时钟输出。这三个覆盖了 HAL 库最核心的 RCC、GPIO、UART 模块跑通基本说明环境没问题。5.1 GPIO 翻转验证// 在 main 的 while(1) 里加这段假设 LED 接在 PA5 while (1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_Delay(500); // HAL_Delay 依赖 SysTick能跑说明时钟配置正确 }逻辑说明HAL_GPIO_TogglePin内部操作 BSRR 寄存器比读改写 ODR 更安全。HAL_Delay依赖 SysTick 中断如果时钟配置错了延时时间会明显不对用示波器或者肉眼就能判断。如果 LED 不闪先查 GPIO 时钟使能了没再查引脚模式是不是推挽输出。5.2 串口打印验证// 重定向 printf 到 UART2需要先实现 _write 或者用 HAL_UART_Transmit uint8_t msg[] F3 HAL OK\r\n; HAL_UART_Transmit(huart2, msg, sizeof(msg) - 1, 1000);逻辑说明HAL_UART_Transmit是阻塞发送最后一个参数是超时时间单位毫秒。如果串口助手收到乱码检查波特率是否和huart2.Init.BaudRate一致以及系统时钟是否配对了。F3 的 UART 时钟源来自 APB1如果 APB1 分频设错实际波特率会偏。5.3 MCO 时钟输出验证// 把系统时钟输出到 PA8用示波器测频率 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);逻辑说明RCC_MCO1SOURCE_SYSCLK表示输出系统时钟RCC_MCODIV_1表示不分频。用示波器测 PA8应该看到和系统时钟一致的方波。如果频率不对说明 PLL 配置有问题回头查RCC_OscInitStruct里的PLLMUL和HSEPredivValue。5.4 验证清单测试项预期现象失败时先查GPIO 翻转LED 以 1Hz 闪烁GPIO 时钟、引脚模式串口输出串口助手收到字符串波特率、APB1 分频MCO 输出示波器测到 72MHzPLL 配置、Flash 等待周期HAL_Delay 精度延时接近 500msSysTick 时钟源从那以后我每次拿到新的固件包都会先跑一遍这三个测试再开始写业务代码。看起来多花十分钟但能避免后面调外设时把时钟问题误判成驱动问题。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI全栈开发工程师修炼指南:技术栈、转型路径与实战复盘

AI全栈开发工程师修炼指南:技术栈、转型路径与实战复盘

1. 角色定位与能力模型解读1.1 什么是AI全栈开发工程师AI全栈开发工程师这个概念,近两年被频繁提起,但很多人的理解还停留在“会调大模型接口的前端后端开发者”。我在实际参与过几个完整的AI项目之后,对这个角色的认知有了明显变化&#xff…

2026/10/18 12:12:18 阅读更多 →
GPT-6.1 Sol Ultrafast 实测:推理速度、成本与API接入全解析

GPT-6.1 Sol Ultrafast 实测:推理速度、成本与API接入全解析

最近这一个来月,我一直在跟新的模型版本较劲。GPT-6.1 Sol Ultrafast 上线那天,我刚跑完一组长上下文压测,本以为又是一次常规迭代,仔细看完文档之后才发现这代模型在推理速度和接口设计上做了些很不一样的东西。很多朋友在后台问…

2026/10/18 12:12:18 阅读更多 →
BIO NIO AIO 区别与原理:一篇文章读懂Java网络IO模型

BIO NIO AIO 区别与原理:一篇文章读懂Java网络IO模型

BIO、NIO、AIO这三个词,但凡做Java后端的人应该都见过,面试八股文里的常客,也是很多人在“阻塞、非阻塞、同步、异步”这几个概念里绕来绕去绕不清的地方。我当年刚接触Netty的时候,也在这上面吃过不少亏,后来把系统调…

2026/10/18 12:12:18 阅读更多 →

最新新闻

开源Code Review解决方案:从规范到工具的全流程实践

开源Code Review解决方案:从规范到工具的全流程实践

1. 为什么我会专门做一个开源的 Code Review 项目先交代一下背景。我所在的团队大概三十来人,前后端、算法、质量都混在一起,日常迭代节奏很快。Code Review 这件事一直都有,但长期处于一种"有等于没有"的状态:PR 挂着两…

2026/10/19 15:03:58 阅读更多 →
open-code-review实践:从规则配置到团队代码质量提升

open-code-review实践:从规则配置到团队代码质量提升

写代码这事,写得越多越觉得“review”才是真正拉开差距的环节。我自己维护过几个开源小项目,也在团队里带过人,最深的体会是:代码审查做得好不好,直接决定一个项目是越改越顺还是越改越乱。但人工review的问题也很明显…

2026/10/19 15:03:58 阅读更多 →
工业级仪表OCR系统:抗模糊、防跳变、可追溯的数字读数自动采集方案

工业级仪表OCR系统:抗模糊、防跳变、可追溯的数字读数自动采集方案

简介:本资源是一套基于计算机视觉的智能测量仪器数字识别与检定数据自动化记录系统,面向计量检测人员、自动化测试工程师及高校测控/仪器仪表方向学习者,旨在解决传统人工读数、手动录入导致的效率低、易出错、难追溯等核心痛点。系统通过摄像…

2026/10/19 15:03:58 阅读更多 →
CNN花卉识别毕设实战:数据准备、模型训练与Web/PyQt双端部署

CNN花卉识别毕设实战:数据准备、模型训练与Web/PyQt双端部署

最近有朋友聊起他带的本科毕设,题目是“基于CNN卷积神经网络的11种花卉识别小程序,Web端和PyQt双端交付”。这个课题我太熟了,自己当年就是从零开始,数据集自己整理、CNN模型搭了好几版、Web端和PyQt端各写一套前端,最…

2026/10/19 15:03:58 阅读更多 →
U盘格式化失败?用cmd命令行diskpart彻底修复与格式化指南

U盘格式化失败?用cmd命令行diskpart彻底修复与格式化指南

1. 什么时候必须用 cmd 格式化 U 盘,而不是右键点“格式化”平时想格式化 U 盘,大家的第一反应肯定是:插上 U 盘,打开“此电脑”,右键,选“格式化”,确认一下就完事。这个方法确实管用&#xff…

2026/10/19 15:03:58 阅读更多 →
千笔·降AIGC助手实测:本科论文如何有效降低AI检测痕迹

千笔·降AIGC助手实测:本科论文如何有效降低AI检测痕迹

不少本科同学写论文,走到最后一步才发现真正卡脖子的不是文献、不是框架、不是数据,而是满屏“AI味”的表述。辛辛苦苦列提纲、喂材料、分段生成,最后成稿拿去审,导师一眼扫过就丢回来一句“机器写的,改人话”。这种感…

2026/10/19 15:02:52 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →