![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STM8学习笔记
文章平均质量分 76
嵌入式@hxydj
这个作者很懒,什么都没留下…
展开
-
stm8单片机例程下载链接
在这篇文章中将自己上传的资源做一个下载链接的目录方便查找下载单片机解析字符串命令示例STM8单片机双通道PWM互补输出STM8单片机5通道ADC采样STM8单片机串口接收引脚单独作为AD采样引脚使用stm8单片机模拟串口功能实现STM8S003单片机串口实现printf函数功能STM8单片机输出SPWM波STM8单片机PWM单脉冲模式STM8S003单片机定时器4TIM4功能实现STM8S003单片机定时器2TIM2功能实现STM8S003单片机定时器1TIM1功原创 2021-04-23 22:28:22 · 582 阅读 · 1 评论 -
Modbus协议学习方法
在刚开始接触modbus协议的时候,很容易被里面的各种功能码搞晕,同时在编写程序的时候也容易搞不清楚每一位数据代表的含义。如果在学习的过程中有实际的发送和接收数据的例子话,那么理解modbus协议就会更容易一些。下面我将自己借助软件学习的方法分享给大家原创 2023-06-28 18:16:14 · 1205 阅读 · 1 评论 -
如何将bootloader和APP程序一次性烧录到单片机中
首先将bootloader程序烧写到单片机中,然后通过串口将app程序写入到单片机内容,在平时学习和测试的时候这种方法没啥问题,但是如果产品需要量产,每次少些程序的时候都有通过这种方法的话,那效率就要低很多。这里添加刚才新合并的hex文件,将文件添加进来之后,在底下的信息框中就可以看到这个hex文件是由两部分构成的。这个地址分别是bootloader和app文件的地址。将bootloader的hex文件和app的hex文件合并成一个新的hex文件,接下来使用j-link的烧写软件进行烧写。原创 2023-06-11 11:05:45 · 2478 阅读 · 4 评论 -
使用Notepad++查看16进制文件遇到的大坑
按理说这个插件是直接从官方渠道安装的,没有什么问题。在调试程序的时候就发现,单片机接收到的数据和在这个notepa++里面看到的数据不一样,还以为是自己的串口受到了干扰,单片机和串口模块检查了好久都没发现啥问题,又在程序上排查了好久,还是没找到问题。最近在调试单片机的IAP升级功能,需要将bin文件直接通过串口发送给单片机然后升级程序,在调试代码的时候,为了方便观察发送的数据是否正确,就直接使用了Notaped++里面的16进制插件来查看bin文件,谁知道这个插件却给自己埋下了一个大坑。原创 2023-06-11 09:38:04 · 3090 阅读 · 6 评论 -
keil从非0x08000000地址调试STM32单片机程序方法
在使用stm32单片机的串口IAP升级功能时,需要调试bootloader程序和app程序,一般bootloader的程序都是从0x08000000地址开始运行的,使用keil软件可以直接进行仿真,但是如果调试app程序的话,由于它不是从0x08000000地址开始的,使用keil仿真的时候,仿真不了。为了可以直接使用keil仿真APP程序,在网上找了好多方法,不过好多方法都讲的比较凌乱,看起来也不方便。下面就将自己总结的2种方法分享出来。原创 2023-06-07 19:59:55 · 3491 阅读 · 7 评论 -
由一个按键程序引发的思考(下)
上文[由一个按键程序引发的思考(中)]讨论了如何实现按键单次按下后能立即执行按键动作,同时又能滤除掉按下时间非常短的无效按键。但是在实际项目中,一个按键往往会具有多种功能,可以通过单击、双击、长按等方式切换不同的功能。 那对于单击、双击、长按这些功能要如何有效区分呢?下面就从按键的波形和判断逻辑来讨论这三种情况如何区分?原创 2022-11-05 11:55:29 · 935 阅读 · 3 评论 -
由一个按键程序引发的思考(中)
按键的波形无非就是高、低、高三种状态。要判断按键从根本上来说就是对这三种状态的检测和分析。由于按下未按下时和弹起时都是高电平,那么直接通过电平判断不能有效区分这两个高电平的状态,就不能直接同电平来判断。观察按键波形可以发现,按键按下的一瞬间电平出现了下降沿,按键弹起的一瞬间出现了上升沿。这样通过上升沿和下降沿就能区分出按键按下或者弹起。原创 2022-10-30 10:24:09 · 2368 阅读 · 9 评论 -
由一个按键程序引发的思考(上)
说起按键程序,只要会单片机的肯定都很熟悉。一般开始学习单片机的时候,入门程序基本都是LED灯和按键。那么这个按键程序有什么特别的吗,还需要专门去思考吗?如果我刚开始学单片机的时候也会这么想,但是随着项目的积累,经验的增加,越来越觉得`复杂的事情简单做,简单的事情复杂做`,这句话很有哲理,越是看起来简单的事情,真正做好却很不容易。下面就抽丝剥茧的来慢慢分析下这个按键程序有什么特别之处。原创 2022-10-29 19:21:35 · 3476 阅读 · 6 评论 -
IAR自定义文件注释模板和函数注释模板
在IAR编辑器中自定义函数注释模板和文件说明模板,在写代码的时候可以一键插入自己定义的代码段或者注释。原创 2022-10-28 17:21:47 · 1833 阅读 · 1 评论 -
在嵌入式开发中如何提高自己的代码水平
但是随着项目的增加和需求的各种变化,就会发现,第一种代码修改起来比较麻烦,比如LED口发生了变化,那么头文件和和初始化函数都需要修改,变动一次要修改好几个地方,修改的时候容易漏掉有些地方,导致调试起来各种问题不断,增加了调试的难度。如果感觉自己的技术比较好了,那么就可以去看库函数的源码,或者操作系统的源码,看看官方的源码是如何将不同类型不同型号的单片机抽象为统一的函数。如果哪天你看到别人的代码之后,一眼就能看出代码的优缺点时,那么就说明你的水平已经很高了,已经突破了自己的瓶颈了。这是 led.h 的代码。原创 2022-09-07 19:37:43 · 35593 阅读 · 42 评论 -
STM8单片机低功耗---活跃停机(Active Halt)模式实现-3
在STM8单片机上使用低功耗模式中的活跃停机模式实现LED灯的闪烁,在IAR编译器上使用寄存器开发。原创 2022-04-22 11:33:17 · 1196 阅读 · 0 评论 -
STM8单片机低功耗---活跃停机(Active Halt)模式实现-2
AR开发环境中在STM8S003单片机上实现低功耗模式 活跃停机 Active halt,使用寄存器开发。原创 2022-04-22 09:49:32 · 1620 阅读 · 1 评论 -
STM8单片机低功耗---活跃停机(Active Halt)模式实现-1
IAR开发环境中在STM8S003单片机上实现低功耗模式 活跃停机 Active halt,使用寄存器开发。原创 2022-04-21 16:45:16 · 1784 阅读 · 0 评论 -
STM8单片机低功耗---停机(Halt)模式实现
在STM8单片机上使用IAR编译器,用寄存器实现 单片机进入低功耗 Halt模式。原创 2022-04-21 13:38:18 · 2516 阅读 · 0 评论 -
STM8单片机低功耗---等待(Wait)模式实现
STM8单片机低功耗模式 等待模式(Wait)代码实现原创 2022-04-21 11:26:05 · 1858 阅读 · 0 评论 -
STM8单片机通过PWM触发ADC同步采样
在做数字开关电源开发过程中使用最多的就是PWM功能和ADC采样功能。ADC采样时采样的时间点很重要,必须在PWM输出高电平的时候取采样,这样采样出来的数据才是最准确的。在STM8单片机中,可以通过定时器的TRG信号去触发ADC采样,这样就可以将PWM波形的输出和ADC采样结合在一起了。 下面就演示一下,如何在输出PWM波的过程中触发ADC采样。 首先看ADC的初始化代码。#include "adc.h"#include "main.h"#include "led.h"u16 DATA原创 2021-12-13 17:30:03 · 6508 阅读 · 3 评论 -
STM8单片机ADC采样功能通过定时器触发
在使用STM8单片机的ADC功能时,读取ADC数据时一般有两种方式,一种是通常不断地读取采样标志位,来判断ADC采样是否结束,一种是通过中断的方式来通知系统采样是否结束。 有时候采样ADC数据的时候,需要按照一定的时间间隔,定点的去采样数据。一般使用的方式就是通过定时器定时,然后在定时中断函数中再去读取ADC采样的数据。但是这种方式采样的时间是不固定的,比如进入定时器中断后,ADC采样刚结束,就可以直接使用当前采样到的数据。但是如果运气不好的话,进入定时中断后,ADC采样刚开始,那么此时就需要等到A原创 2021-12-13 15:50:48 · 5589 阅读 · 4 评论 -
单片机快速将库函数版代码移植为寄存器代码方法
现在单片机开发越来越多用的是库函数版本的,寄存器版本使用越来越少了。但是在有些项目中使用库函数会导致程序运行速度比较慢,没有直接操作寄存器运行起来速度快。所以在对时间要求比较严格的项目中,还是需要使用寄存器来开发。如果不能够找到寄存器相关示例代码的时候,开发起来还是比较困难的。今天就来总结一个快速将库函数移植为寄存器的方法,这个方式为通用方法,在任何单片机上都可以使用。 现在就用一个STM8单片机库函数的工程来举例。 这个代码的主要功能就是使用定时器1的捕获功能来计算输入波形的频率。对于定时原创 2021-12-13 10:29:43 · 1502 阅读 · 4 评论 -
IAR软件中直接查看编译后代码大小
在使用IAR软件编译代码时,编译后往往看不到编译后代码的大小情况。在调试程序的时候还是比较麻烦的。下面就总结两种最简单的方法在IAR编译器中查看代码大小。通过输出的编译信息查看 IAR默认的编译信息输出很少,基本就只能查看一下错误和警告的数量。 如果想要输出更多的编译信息,在这个Messages信息框中,单击鼠标右键选择All。 这时再重新编译一次代码。 此时就可以看到编译信息输出了很多,其中就包括了代码占用空间情况。这样通过一个简单的设置就可直接在编译器输出信息中查看代码的大小原创 2021-12-06 11:44:52 · 4512 阅读 · 1 评论 -
STM8单片机串口同时识别自定义协议和Modbus协议
在单片机开发中,串口是最常用的和外界交换数据的渠道,要使用串口,那必不可少的就是通信协议,通信协议就是单片机和外界通信的语言,要想正常和其他设备正常交流,首先语言必须相通。 在实际开发过程中由于各种原因,导致很多时候单片机和外界其他设备协议不兼容,在使用的时候就比较麻烦。比如单片机要和两个设备通信,但是这两个设备的通信协议的不一样,在使用时单片机就必须使用两个串口分别和两个设备通信。如果这两个设备同时使用时还不感觉到资源浪费,如果每次只接一个设备,那么另一个串口也不能作为其他功能使用,还得留着备用。原创 2021-12-03 21:16:58 · 6092 阅读 · 6 评论 -
在STM8单片机中自己实现 printf()函数功能
由于STM8单片机本身内存比较小,而系统自带的printf()函数又比较占据空间,所以在稍微大一点的工程中有时候一使用 printf() 函数就会导致单片机内存不足,于是想着能不能自己写一个比较小的函数来实现类似printf()函数的功能。经过网上查找资料和总结终于找到了一个占用内存比较小,又能实现串口打印功能的方法。 现在将自己的方法分享出来,这里使用 STM8S003F3P6单片机测试。 首先新建一个工程,专门用来测试串口功能。 串口部分相关代码如下://串口void Uart1_I原创 2021-12-03 15:58:39 · 2357 阅读 · 0 评论 -
使用STM8单片机+NTC热敏电阻自制简易温度巡检仪
最近在测试设备的时候需要监测设备的温度,平常测试时都是通过红外热成像仪测试,然后手动记录数据。这样测试的话工作量比较大,需要几分钟就记录一次数据。于是想着能不能用单片机做一个测试温度的装置,用电脑自动记录数据。手头刚好有STM8S003单片机和 5K的NTC热敏电阻,于是就做了一个简易的温度测试装置,并使用伏特加上位机软件将温度波形显示出来。 最终测试效果如图所示: 下面将制作步骤分享出来,首先设计NTC热敏电阻的采样电路。 这里使用最简答电阻分压电路,将热敏电阻和一个10K电阻串联分压,原创 2021-11-25 15:42:28 · 5447 阅读 · 2 评论 -
串口示波器---伏特加 彻底的爱了
最近在调试代码的时候发现了一款串口示波器软件,功能相当强大,而且上手起来非常容易。目前是我自己使用过的多款串口显示软件里功能最强大的,而且是免费的。 软件名字叫 VOFA+,中文名称叫伏特加。官网地址:https://www.vofa.plus/ ,官网界面如下: 点立即下载按钮进入到下载界面 支持在多个系统上运行,其中Windows版本还可以下载免安装版,也就是下载的文件夹解压后就可以直接运行。功能和安装版没有任何区别。这里下载的是免安装版。解压后文件夹如下: 双击vofa+.原创 2021-11-23 22:11:54 · 11138 阅读 · 11 评论 -
自己实现整数换字符串函数和字符串转整数函数
对于整数转换为字符串,或者字符串转换为整数,可以直接使用库函数中提供的方法。如常用的字符串转换相关函数如下:atof():将字符串转换为双精度浮点型值。atoi():将字符串转换为整型值。atol():将字符串转换为长整型值。strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。 对于单片机来说,库函数比较原创 2021-10-14 16:27:52 · 1017 阅读 · 0 评论 -
如何通过map文件优化代码
在平时写代码的时候,特别是嵌入式相关的代码时,能想到的优化方法一般就是通过设置编译器的优化等级。或者是在定义变量的时候考虑变量的使用范围,然后根据数据范围选择比较适合的数据类型。但是这种优化方式操作起来都比较模糊,没有一个直观的感受。为了让代码的优化有个直观的感受,今天就借助map文件来优化代码。 首先看一段简单的示例。 这是一段很简单的测试代码,就是在主程序里面让LED灯闪烁,同时给x变量每次加0.1。这个代码还需要优化吗?别着急,先打开工程中生成的map文件看看。 map文件在工程目原创 2021-10-13 21:58:37 · 569 阅读 · 2 评论 -
C语言小知识---递归函数的使用
C语言允许函数自身调用自身,这种调用就被称为递归。好多人刚开始学习递归的时候,往往被一层层嵌套调用搞糊涂了,搞不清楚到底是怎么调用的?现在就通过一个小例子来演示一下,递归调用时,函数是如何运行的。void up_and_down(int n){ printf("---- Level %d: n location 0x%p \r\n",n,&n); if(n<4) up_and_down(n + 1); printf("**** Level %d: n location 0x%原创 2021-10-01 14:15:43 · 1176 阅读 · 0 评论 -
C语言小知识---printf()函数转换符的意义
printf()函数大家已经很熟悉了,它的转换符在打印数据的时候也会经常使用,比如%c,%d,%f等。那么为什么打印的时候一定需要转换符呢?系统难道不能自动识别吗?转换符存在的意义又是什么? 下面就通过一个简单的例子来看一下,转换符存在的意义,在8位单片机上通过不同的转换符打印两个整数。通过不同的转换符打印两个整数,一个正整数,一个负整数。核心代码如下:short num1 = 666;short num2 = -32700; printf( "num1: short --- %6hd,原创 2021-10-01 14:12:53 · 737 阅读 · 0 评论 -
C语言小知识---printf()函数
说起printf()函数,写代码的同学肯定都很熟悉,这是C语言中标准的打印函数,在调试代码或者信息输出的时候会经常用到。其中printf函数的转换说明如下:转换说明修饰符printf()中的标记下面就通过一个实际的例子来说明修饰符和标记的功能。比如现在通过3个传感器采集外部设备电压值,并通过串口将采集的数据实时打印出来。打印相关代码如下: printf( "\r\n ch max min rms ave \r\n" ); adc_all_va原创 2021-10-01 14:10:51 · 1484 阅读 · 0 评论 -
C语言小知识---数据类型
看到这个题目好多人肯定会迷惑,数据类型有什么可说的,这不是编程的基础吗?凡是会写代码的肯定都熟悉数据类型,不就是char,int,float,double这些每天都用成百上千次的的类型吗?各位看官切莫着急,且听我慢慢道来。 对于上位机开发来说,数据类型基本没有什么特别注意的,无非就是32位系统和64位系统的数据长度不一样。正是这个数据长度的问题,对于单片机开发来说,却是至关重要的。因为单片机有8位、16位、32位。如果不注意数据类型,不注意数据长度,那么在编写代码的时候,很容易就会造成数据溢出,导致原创 2021-10-01 14:08:12 · 4458 阅读 · 1 评论 -
使用IAR在线调试功能显示数据变化曲线
在调试代码的时候,如果要监控一个变量值的变化情况,一般方法就是将这个变量添加到观察窗口中,或者将这个变量的变化情况通过串口打印出来,又或者将变量添加到数组中,通过断点来观察变量变化情况。但是这些方法都比较麻烦,而且看起来不直观。 IAR中自带了变量值打印功能,同时还能将变量值的变化情况以曲线的形式输出。 下面就来演示一下如何使用变量观察功能。代码进入在线调试界面后,选择ST_LINK选项中的Data Sample Setup选项。选择界面中就会出现一个添加数据的框。在这个框里面单击鼠标左原创 2021-09-03 17:54:57 · 3765 阅读 · 5 评论 -
IAR执行到断点处不能单步运行解决方法
最近在使用IAR调试程序的时候,突然发现程序中如果有断点,程序就不能单步执行了。 如下图所示,程序全速执行到断点处。这时候如果点最上面工具栏的单步调试按钮时,程序会一直在这一行,不能继续往下走。以前调试时到断点后点单步执行,程序就会继续往下执行。但是最近突然出现了这种情况,在网上找解决方法一直没找到。今天无意间发现了,原来是一个地方设置的问题。不能单步执行,就是没有勾选SL_LINK 中的 Disable interrupt when stepping这个选项。这个选项的意思就是当单步运原创 2021-09-03 16:43:05 · 2201 阅读 · 0 评论 -
泰克示波器MDO3014波形频率分析FFT功能使用方法
一般在用示波器查看波形的时候,都是直接将波形的频率参数显示出来,如果波形的频率变化不大的情况下用这种方式观察起来比较方便。如果波形是变频的,而且频率变化比较快的情况下,直接观看频率就比较麻烦了,要想知道当前波形频率的变化范围,就只能一遍滚动波形,一遍查看频率。比较耗费时间,而且准确性也比较低。 如果示波器带有FFT功能的话,那么就可以直接使用FFT功能区分析波形的频率变化范围。 现在用泰克 MDO3014示波器演示一下,如何使用FFT功能。这是捕获的一组频率变化的波形。 下来按示波器右边数原创 2021-08-27 16:13:46 · 11613 阅读 · 0 评论 -
STM8单片机ADC模拟看门狗功能实现
看门狗的功能大家都知道,而这个模拟看门狗又是什么东西呢? 简单的说就是这个模拟看门狗可以实时监控ADC采样的数据,当采样的数据值小于设置的最小值或者大于设置的最大值时,单片机就会触发ADC中断。这个在温度监控中非常实用,比如现在要监控设备的温度值,当温度值不在设置范围内的时候,就会自动触发中断,而不需要程序一直去采集ADC通道的值,然后使用软件来判断当前的温度值是否超出正常范围。官方介绍如下: 下面直接通过代码来演示一下这个模拟看门狗的功能:#include "adc.h"#includ原创 2021-08-25 09:55:18 · 2175 阅读 · 3 评论 -
STM8单片机定时器1编码器功能使用详解
目录编码器简介编码器简介这里使用的编码器是点位编码器,点位编码器在各种仪器上使用的比较多。它的具体参数这里就不说了。它的外形如下:引脚功能如下:这里使用的是带开关功能的,所以有5个引脚,如果不带开关的话,就只有3个引脚。编码器左右两个比较大的引脚只是启固定作用的,是不带任何功能的。上面一排的3个引脚就是编码器的信号输出引脚,中间的引脚接地线,左右两个分别是信号输出引脚。底下两个引脚主要是按键引脚,按键未按下时;两个引脚不通,当按键按下时,两个引脚导通。 这里要注意原创 2021-08-19 16:23:15 · 3672 阅读 · 8 评论 -
STM8单片机ADC连续扫描模式
当STM8单片机使用ADC功能读取多个通道的值时,可以使用连续模式,但是连续模式一次只能采样一个通道的值,那么如果要采样多个通道时怎么办呢?STM8提供了一个多通道连续采样扫描模式。也就是说多个通道采样时才有扫描模式,从第0通道开始依次向后扫描,扫描完成后会自动开始第二次扫描。而不像单次扫描模式那样,依次结束后ADC就会自动关闭,需要手动开启第二次扫描。连续扫描模式只需要开启一次,就会一直重复的采样,直到手动关闭,才会结束。连续扫描模式相比单次扫描模式,在初始化的时候,只是多了一行代码,就是设置CO原创 2021-08-14 19:40:23 · 1538 阅读 · 2 评论 -
STM8单片机ADC单次扫描模式
当STM8单片机使用ADC功能读取多个通道的值时,可以使用单次模式,采样完一个通道之后,重新初始化另一个通道,然后采样,采样完成后继续重新初始化切换下一个通道。但是这样采样起来太麻烦。STM8单片机提供了一个扫描模式,可以依次按照顺序采样多个通道的值,多个通道全部采样完成后,会置位标志位,这样就可以一次性将多个通道的值全部读出来。其中官方文档介绍如下: 从文档中可以看出,采样都是从0通道开始的,比如想采样3个通道值,那么采样的通道号就为0—3。如果想采样3、4通道,那么也得从0通道开始,也就是说原创 2021-08-14 19:39:10 · 1357 阅读 · 0 评论 -
STM8单片机ADC带缓存的连续采样模式
在上一篇文章中说了STM8的ADC连续采样模式,为了提高采样的精度和速率,STM8单片机还提供了带缓存的连续采样模式,也就是说ADC会连续采集8个数据,放在缓存中,读取数据时可以一次从缓存中读取8个数据,这样就可以通过8个数据数据计算平均值,使得采样的结果更加准确。下面看一下官方文档中的对缓存模式的介绍。 通过文档中可以看出,要开启缓存模式,只需要将ADC_CR3寄存器中的COUNT为DBUF设置为1,就可以开启缓存模式了。 当开启缓存模式后,采样的结果将不会存放在ADC_DR寄存器中,而是原创 2021-08-14 19:37:44 · 1569 阅读 · 0 评论 -
STM8单片机ADC连续采样模式
STM8S003单片机内部ADC为12位,A/D转换的各个通道可以执行单次和连续的转换模式。 单次转换模式的意思就是,ADC每次转换一次数据后,就会停止转换,如果还需要继续转换的话,就需要手动开启第二次转换功能。 连续转换模式的意思就是每次转换结束后,系统会自动开启第二次转换,不需要手动设置第二次转换的开启,也就是说连续转换模式只需要开启一次。ADC框图如下:ADC连续模式转换时序图如下:通过时序图可以看出,在第2次转换完成后,第一次采样的结果才会输出,也就是结果输出比采样滞后了一个周期。原创 2021-08-14 19:36:20 · 3106 阅读 · 1 评论 -
STM8单片机ADC单次采样模式
STM8S003单片机内部ADC为12位,A/D转换的各个通道可以执行单次和连续的转换模式。 单次转换模式的意思就是,ADC每次转换一次数据后,就会停止转换,如果还需要继续转换的话,就需要手动开启第二次转换功能。 连续转换模式的意思就是每次转换结束后,系统会自动开启第二次转换,不需要手动设置第二次转换的开启,也就是说连续转换模式只需要开启一次。ADC框图如下:ADC转换时序图如下:下面用代码来实现ADC的单次转换模式:#include "adc.h"#include "main.h"原创 2021-08-14 19:34:50 · 1419 阅读 · 0 评论 -
STM8单片机读取DHT11温湿度传感器
DHT11是一款温湿度传感器,也是使用一根总线来驱动,使用方法和ds18b20温度传感器很类似。供电电压 3.3~5.5V DC测量范围 湿度5% ~ 95%RH, 温度-20℃ ~ +60℃测量精度 湿度±5%RH, 温度±2℃分 辨 率 湿度1%RH, 温度0.1℃实物图如下所示引脚顺序从左到右,依次为1、2、3、4,引脚功能如下:1Vcc供电引脚 供电范围 3.5V to 5.5V2Data通过单总线输出温度和湿度值3NC没有使用,使用原创 2021-08-09 16:47:21 · 2027 阅读 · 7 评论