- 博客(42)
- 收藏
- 关注
原创 从零开始学嵌入式之STM32——30.使用触发输入和从模式测量PWM信号的占空比
本定时器将经过处理的自己的信号传给其他的定时器或DAC/ADC、可以用于和其他定时器做级联,触发其他定时器的一些动作,或者触发其他的一些外设的工作。进一步,如果要得到PWM的占空比信息,就需要记录上升沿信息后的第一个下降沿的时间t1和第一个上升沿的时间t2,其中的t1就代表了高电平的持续时间,t2代表了PWM的周期,占空比就是t1/t2。当定时器的一些动作需要通过外部信号驱动时,定时器就需要工作在从模式下,STM32中的定时器设置了多种从模式,以应对不同的使用场景,从模式的选择需要通过。
2026-03-24 11:42:36
402
原创 从零开始学嵌入式之STM32——29.通用定时器-输入捕获模式测量信号的周期和频率
STM32系列中的通用定时器的通道如上图所示:每个通用定时器都有有四个输入输出通道(可能个别型号会有差异,以数据手册为准),每个定时器的输入输出通道的引脚其实是复用的。2.滤波功能选择,在输入信号质量不佳时,可以开启滤波功能。这样在不对输入的信号进行分频操作的情况下,我们可以测量的信号的频率范围大致为:16Hz~1MHz。使用通用定时器的输入捕获功能,可以捕获输入通道上信号的上升沿或下降沿,并产生相关的中断和事件。1、上图中可以看出:输入捕获的4个通道中,通道1可以接入通道1、2、3的信号进行比较。
2026-03-20 16:21:33
609
原创 从零开始学嵌入式之STM32——27.基于STM32F103C8T6MCU的寄存器方式实现按键调整PWM占空比,调整输出功率
调节范围:亮度值量化为 0~100 的整数(对应输出功率 0%~100%),其中:亮度值 = 0:LED 无输出,完全熄灭;亮度值 = 100:LED 满功率输出,达到最大亮度。调节步长:单次按键操作的亮度调节步长为 5,兼顾调节实用性与亮度变化的连续性。
2026-03-18 13:52:10
1119
原创 从零开始学嵌入式之STM32——26.STM32的通用定时器-生成PWM方波
通用定时器的功能很强大,针对不同功能配置了众多的寄存器,我们在学习时可以按照功能来学习寄存器,这样更有利于对通用定时器的掌握。使用定时器的输入输出功能时,GPIO端口配置成复用推挽输出模式即可,因为在输出模式下,输入功能也是打开的。简称脉宽调制,通过调整信号中的高电平的占比时间(占空比)来调整输出功率的大小,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。当然也可以输出其他波形。影响的是PWM模式时的通道输出的有效电平,严格来讲,PWM模式输出低电平有效更为合理,因为是低电平点亮LED。
2026-03-16 13:26:12
591
原创 从零开始学嵌入式之STM32——25.STM32的基本定时器
STM32F103 增强型系列(包含 STM32F103xC、STM32F103xD、STM32F103xE 子型号)集成了 TIM6 和 TIM7 两个基本定时器。
2026-03-13 12:04:38
525
原创 从零开始学C语言--22.指针-C语言的精华(二)
指针数组,本质是数组,只是数组的元素是指针。数组指针,本质是指针,指针指向的是数组,这个数组可以是字符数组、可以是整型数组等。// 定义了一个具有5个元素的二级指针数组arr3,这些元素是指向一个字符指针的指针。情况1:在sizeof(数组名)这个时候,数组名表示整个数组,计算的是整个数组的大小,单位是字节。int (*parr2)[10] 这是一个有10个int元素的数组的指针。对二维数组的数组名解引用,得到的是对应的每一行的一维数组的地址。数组指针,是一种指针类型,本质上是指针,是指向数组的指针。
2026-03-06 15:11:36
525
原创 从零开始学嵌入式之STM32——13.使用STM32自带硬件模块实现IIC协议通讯
T_pclk 代表I2C_CR2寄存器中设置的PCLK频率的时钟周期,是I2C模块的基础时钟周期:若I2C_CR2寄存器中设置的PCLK频率为36MHz,则 T_pclk = 1/36MHz = 1/36 μs。在STM32中,有专门负责I2C协议的硬件外设,在使用时,仅需配置好对应的I2C外设,就可以实现I2C协议的通讯,这种由I2C外设实现的通讯方式减轻了CPU的工作,且使得软件设计更加简单。在发送数据时,通过TxE位判断是否有数据正在发送,通过BTF位判断当前在发送的数据是否发送完成。
2026-03-01 17:03:17
1286
原创 从零开始学嵌入式之STM32——12.使用STM32普通引脚通过软件模拟实现I2C通讯协议
IIC协议,是嵌入式领域常用的通讯协议,本文介绍了使用软件模拟IIC协议的简单实现,通过阅读本文,可以了解IIC协议的基本原理和实现。目录一、I2C协议简介二、I2C的物理层1.I2C通信物理层规则三、I2C的协议层四.操作时序图整理五、软件模拟I2C1.硬件电路2.软件模拟实现I2C协议2.1.头文件3.2.IIC协议函数实现六、信息的读写操作1.头文件2.源文件七、其余辅助功能模块1.延时模块2.串口输出模块一、I2C协议简介I2C(inter-integrated circuit,集成电路总线)
2026-02-24 11:04:51
1135
1
原创 从零开始学嵌入式之STM32——11.STM32---USART串行通讯
通讯开始前,发送方先发送一个低电平作为开始信号。起始位作为通讯的开始信号。发送方发出起始信号后开始发送数据。发送时,发送一个字节先从低位开始发送。完成一帧数据发送后,再单独发送一个高电平,作为停止信号,在平时不通讯时,使用高电平作为空闲状态。
2026-02-08 10:17:40
1276
原创 从零开始学嵌入式之STM32——10.STM32的中断系统
有了中断后事情就变的简单了,主程序不需要循环不断的去检测按键,当有按键按下的时候,CPU执行被打断,去执行按键处理程序。当没有按键按下的时候,CPU完全可以正常执行代码,丝毫不受任何的影响。比如我们要检测按键是否按下,如果没有中断,就需要循环的方式不断的去检测按键对应的IO口的电平,这是比较耗费CPU的时间的。中断B能否打断中断A,要看它们的优先级,优先级高的可以打断优先级低的,优先级低的无法打断优先级高的。A中断产生,但是CPU正在处理B中断,且B中断的优先级较高,A中断将被挂起,待处理完B后再处理A。
2026-02-06 08:30:00
1687
原创 从零开始学嵌入式之STM32——9.STM32的时钟系统
高速外部时钟,由外部时钟源提供,目前几乎所有的STM32单片机的设计都是在外部接一个8MHz的晶振,经过PLL倍频(9倍频)后得到一个72MHz的系统时钟。系统默认设置就是这个时钟,在启动文件中可以看到相应的配置。
2026-02-05 11:48:33
1001
原创 从零开始学嵌入式之STM32——8.流水灯
本文以 STM32F103 单片机为核心,采用实现经典的流水灯案例,直接操作寄存器配置 GPIO 外设。通过从底层硬件原理出发,拆解 GPIO 时钟使能、工作模式配置、电平控制的完整流程,帮助读者摆脱 “库函数黑盒”,深入理解 STM32 GPIO 外设的工作机制;同时结合模块化编程思想,将 LED 控制、延时功能拆分为独立模块,既兼顾代码的可移植性与可读性,也为嵌入式入门开发者建立规范的底层编程思维。
2026-02-03 11:30:16
977
原创 从零开始学嵌入式之STM32——7.STM32的系统架构
STM32单片机内部是由内核、总线系统、时钟系统和片上外设等模块构成的,可以按照类型分为三类:被动单元、主动单元、其他单元。:通过外部的DCode总线连接到总线矩阵,然后与闪存存储器的数据接口相连接,实现从Flash加载常量和调试访问。:内部闪存存储器,用于存放程序、程序执行时用到的常量(全局)---类比于电脑的硬盘。:通过外部的System总线连接到总线矩阵,用于控制总线,专门发送控制信号。ICode 总线(I-Bus,指令总线)—— 内核的 “专属快车道”通过DMA总线,连接到总线矩阵,发出控制信号。
2026-02-02 10:43:03
692
原创 从零开始学嵌入式之STM32——6.与GPIO相关的7个寄存器--重要知识
(1)寄存器的复位值是0x4444 4444,这时寄存器内部的各位:01 00 也就意味着:GPIO接口的默认模式为:浮空输入模式。这样设置可以简化编程,有了这个寄存器,在编程时就会省去置0时对右操作数的取反操作,也不会再有按位或的运算,会简化编程的逻辑。位16LCKK:锁键(lock key),锁定的是位15:0LCK锁定寄存器的锁定位,一旦锁定,需要复位后才能再次更改。位15:0LCK锁定寄存器的每一锁定位针对的是CRH和CRL的4个位的锁定。(2)这里的上下拉在一个控制位,配置时取端口的初始状态。
2026-01-31 15:13:50
1097
原创 从零开始学嵌入式之STM32——5.GPIO外设
GPIO:(general-purpose input/output),通用型输入输出。是芯片与外界交互的桥梁。其存在的意义就是使用程序控制这些引脚读取或输出数据。本文以STM32ZET6芯片为例,介绍了GPIO的相关内容。
2026-01-30 15:28:28
1108
原创 从零开始学嵌入式之STM32——4.使用寄存器点亮一个LED灯--代码优化
这个代码还可以进一步提高可读性,因为后边这些“0x04、0x33”数据是没有明确的含义的,我们可以思考一下:我们做的这些操作其实就是将寄存器的某一位进行了改变,那我们是不是也可以将寄存器的这一位做一个宏定义呢?结合官方芯片手册中的RCC寄存器地址映像表可以发现:结构体是模拟了一个RCC寄存器的结构,其中的每一个寄存器都按照顺序在结构体中对应,偏移量就是结构体的成员变量的大小。这种写法兼顾了底层操作的灵活性和代码的可读性,是裸机开发的最优实践(比直接操作地址易维护,比 HAL 库代码执行效率更高)。
2026-01-28 21:31:50
735
原创 从零开始学嵌入式之STM32——3.使用寄存器点亮一盏LED灯
适配外设特性:不同外设(如 GPIO、串口、ADC)的设计工作频率不同,时钟配置可精准匹配其运行需求;优化资源利用:避免所有外设都以高频运行,减少不必要的功耗与资源占用,提升系统效率。控制GPIO的寄存器:要访问 STM32 的时钟寄存器,我们需要通过基地址 + 偏移地址的方式来确定其物理地址:首先从芯片数据手册中获取目标外设的基地址(本示例中时钟相关外设的基地址为 0x40021000,该地址可在手册对应章节中查阅);再结合寄存器的偏移量(本示例中时钟使能寄存器的偏移地址为 0x18),
2026-01-27 12:13:32
1149
原创 从零开始学嵌入式之STM32——2.STM32的开发方式和学习方式、编译器环境准备、芯片启动文件准备
现在所做的这些工作是为了使用寄存器的方式开发芯片,以便于我们更好的了解芯片的底层原理,等完成学习后再迁移到HAL库的开发,这样会使得我们对芯片有更深入地理解,当某一天要开发其他芯片的时候,也可以迅速的上手。startup_stm32f10x_hd.s:该文件适用于大容量(256KB-512KB)的F101xx,F102xx,F103xx系列芯片。startup_stm32f10x_md.s:该文件适用于中容量(64KB-128KB)的F101xx,F102xx,F103xx系列芯片。
2026-01-26 11:45:56
881
原创 从零开始学嵌入式之STM32——1.什么是STM32
它是ST公司推出的一系列单片机的统称。ST----指的是ST公司----意法半导体。意法半导体,成立于1987年,是由意大利的SGS微电子公司和法国的Thomson半导体公司合并而成。ARM目前主要是ARM架构处理器及外围组件的电路设计方案,知识产权授权的形式收取费用,其他公司根据ARM的方案设计出CPU产品。,它以应用为核心,软硬件可裁剪,旨在实现对设备的控制、监测或辅助功能,区别于通用计算机(如 PC、服务器)的 “一机多用” 属性。在嵌入式领域,目前主流的是cortex-M3内核推出的芯片。
2026-01-24 11:19:41
1747
原创 .从零开始学C语言--21.指针-C语言的精华(一)
指针的关系运算,是对指向同一段连续内存区域、且类型相同的指针,通过关系操作符(/<=/>=/==/!=)比较指针存储的内存地址大小,从而判断它们指向的元素在内存中的相对位置(如 “前 / 后”“是否指向同一元素”);如果没问题,会输出什么结果呢?是因为char类型的指针再被解引用时,只能访问一个字节的空间,而256这个数字的存储空间已经超过了一个字节。指针也是一种变量,也是需要存在内存中的,因此也会有地址,也可以有指针指向它。基于上边的知识,我们在访问数组的时候,可以使用下标访问,也可以使用指针访问。
2026-01-23 12:53:05
1017
原创 51单片机UART-串口通讯的配置方法
/将定时器1的寄存器(BIT4-BIT7)复位 TMOD |= 0X20;在我们配置51系列单片机的串口时,涉及到定时器寄存器、中断寄存器、串口寄存器等多个寄存器,且在厂家的芯片手册中处于分散的位置,查阅不便,因此本文将51单片机中UART-串口通讯的配置过程进行了归纳汇总,方便学习和配置。51单片机的模式1和模式3是可以通过定时器1的溢出率来调整波特率的,我们常用的波特率有2400、4800、9600、19200等。公式中的n = 8(采用的是8位重装模式),因此2的8次方就是 256。
2026-01-22 22:39:50
698
原创 从零开始学C语言--20.C语言的操作符--(三、赋值操作符、关系操作符、逻辑操作符、位操作符的使用介绍)
a = a ^ b;//a承载了a和b两个变量的信息 b = a ^ b;//利用x^x=0的特性,剔除b的信息,剩下a的信息赋值给b完成一次交换 a = a ^ b;//利用x^x=0的特性,剔除a的信息,剩下b的信息赋值给a完成第二次交换。//左值是常量,非法操作 //a + b = 20;→ 先执行c = 10,再执行b = c,最后执行a = b,最终 a/b/c 均为 10。示例:a > b == c > d → 先算a>b和c>d,再比较两个结果是否相等。
2026-01-21 12:00:47
1293
原创 从零开始学C语言--19.C语言的操作符--(二、算术操作符)
这里,就是除法的一个特殊的地方:两个整数相除,得到的还是整数,会自动将小数部分去掉,那么我们该如何得到一个小数呢?本文主要介绍 C 语言算术操作符的定义、使用方法及核心注意事项,通过示例代码拆解算术转换、整型提升、除法特殊性等细节,帮助读者掌握算术操作符的使用规则。关于算术操作符,还有几个复杂的情况需要讨论:请看下面的代码,在看答案之前,大家可以先自己判断一下到底会输出什么。2.类型转换的要点:不同类型进行运算时触发“寻常算术转换”(整型提升也是算术转换的一种),低精度向高精度转换。
2026-01-20 14:57:45
811
原创 从零开始学C语言--18.C语言的操作符--(一、操作符简介)
本文主要介绍 C 语言操作符的定义、分类及其核心特性(优先级、结合性、目数),通过阅读本文,您可以系统理解操作符的本质、分类规则,以及如何快速记忆操作符的优先级与结合性。(决定 “先算谁”)。C 语言操作符优先级无需死记硬背,记住 “优先级梯队”+“特殊例外” 即可,即使在不了解哪个操作符优先级高的时候,也可以使用。优先级相同时,按 “左结合”(从左到右)或 “右结合”(从右到左)执行(决定 “同优先级算序”)。简言之:操作符是 “动作指令”,操作数是 “动作的对象”;&(取地址)、*(解引用)
2026-01-19 10:51:16
803
原创 从零开始学C语言--17.一维数组简介
本文系统介绍了一维数组的基本概念与应用。主要内容包括:数组的定义(内存中连续的同类型数据集合)、类型分类(整型、字符型等)和存储形式(以32位小端系统为例)。重点讲解了数组的创建、初始化和访问方法,强调初始化的重要性及避免越界访问。同时指出数组名的双重含义:在sizeof和&操作中代表整个数组,其他情况下表示首元素地址。通过实例代码说明了数组的正确使用方法及注意事项,为后续学习指针和更复杂数据结构奠定基础。
2026-01-16 12:22:12
1385
原创 关于DS1302时钟芯片中小时寄存器的12/24小时工作状态、上下午状态、时间显示的应用以及BCD码的讨论
DS1302时钟芯片是常用的时钟芯片,在我们使用时,常会遇到一个问题:小时寄存器到底该怎么设置?如何通过这个寄存器实现12/24小时制状态查询和切换、上下午状态的查询和切换呢?就让我们来深入讨论一下这个信息量有点多的“小时寄存器”吧!
2026-01-14 15:48:03
539
原创 从零开始学C语言--16.程序的基本控制流结构(五、循环 while(do while)循环)
while循环是C语言中常用的“条件型循环”,常用于“基于条件重复执行”。形式一:while形式while(条件判断表达式)循环代码块;形式二:do-while形式do循环代码块;}while(条件判断表达式);//注意:这里的分号";"不可省略while:每次循环时,先判断循环条件是否为真,为真时执行循环体;do-while:每次循环时,先执行循环体,再判断循环条件是否为真,为真时才会开始下次循环;无论循环条件是否成立,do-while都会先执行一次循环体再说,而while循环则不会。
2026-01-14 14:39:40
1222
原创 从零开始学C语言--15.程序的基本控制流结构(四、循环 for循环、break和continue关键字的用法)
本文从语法、实战用法角度全面讲解 C 语言控制流中的for循环,帮你掌握这一核心计次循环结构的使用方法、执行逻辑及典型应用场景,理解它在 “已知循环次数” 场景下的核心优势。对于它的使用,有一个小建议:如无需要,尽量不要在循环体内修改循环变量的值,以免循环失控。说明:在初始值i确定的情况下,循环的执行是可预测的,无本质问题,但可读性下降。for循环是常用的一种循环结构,主要适用于计次循环的场景,当然有时也会用在条件判断等场景。在上面的例子中,由于在循环体内将i的值改为了1,导致循环陷入死循环。
2026-01-13 15:08:10
839
1
原创 从零开始学C语言--14.程序的基本控制流结构(三、选择 switch-case)
switch(表达式)case 常量1:语句;break;// 跳出switch结构case 常量2:语句;break;default:// 所有case不匹配时执行语句;break;switch后边跟一个括号,括号中是表达式,表达式的值必须是整型 / 字符型(如intchar、枚举类型,float/double 等浮点型不支持);case后必须跟常量 / 常量表达式(如数字、字符、枚举常量,不能是变量),且常量值不能重复;
2026-01-12 15:44:39
1005
1
原创 从零开始学C语言--13.程序的基本控制流结构(二、选择 if-else)
if-else是我们写代码时很常用的语法结构,可以帮助我们解决很多问题,我们可以用它实现单分支、二分支、多分支等各种条件分支,这样我们的代码就摆脱了流水账式的平铺直叙,变得灵动。因此,我们在实际的应用中,需要合理的规划代码,将在逻辑上相互关联、判断条件互斥的逻辑组成if-else结构,这样会使得我们的代码更加优秀!代码二,一条if闯天下,如果程序较长,可能很难搞清楚这段代码是要干啥。代码一,采用了一个清晰地逻辑结构,有效的提高了代码的可读性;上面的两段代码中,我们能看到的差别:(代码中的&&是并且的意思)
2026-01-10 17:42:05
1384
1
原创 从零开始学C语言--12.程序的基本控制流结构(一、简介)
前言:到这篇博文为止,我们大概介绍了组成C语言的一些基础:关键字、数据类型、变量、常量、字符串、转义字符、注释等,这些好比是一块一块的砖头,接下来,我们再探讨一下能将这些砖头组织起来、形成特定的结构的框架:控制流。在C语言(以及所有结构化程序设计语言)中,顺序、选择、循环是程序的三大基本控制流结构,通过这三大基本结构以及它们的相互组合,能够实现复杂的程序逻辑,是编写代码的基础框架。由于这些知识点较多,我们分为多个博客进行介绍代码按照书写顺序依次执行,是程序最基础的执行方式,无任何分支或重复。
2026-01-09 15:44:36
705
原创 从零开始学C语言--11.C语言中的注释
注释就像代码的 “备注” 或 “说明书”—— 编译器看不到这些备注,只有阅读代码的人能看到,目的是让自己(或团队)后续能快速理解代码的含义,也方便他人协作。写好注释是程序员的基本素养 —— 一段无注释的复杂代码,哪怕是自己写的,过一段时间也可能看不懂;我们在编程时,一般会在程序文件的开头位置、函数的开始位置、关键变量、关键的逻辑表达式等位置作注释,对我们的代码进行相关说明。以\*开头,以*\结尾,在\**\范围内的内容即为注释内容。由此可见,注释对于代码的可读性和可维护性的重要程度。
2026-01-05 09:00:00
1249
原创 从零开始学C语言--10.转义字符
本文旨在介绍C语言中的转义字符的内容,通过阅读本文,可以较为全面的了解转义字符的使用以及注意事项。转义字符在上一篇文章中,我们在探讨字符串的时候,了解到了一个用于字符串结束标志的转义字符:“\0”,那是不是还有其他的转义字符呢?答案是肯定的,那我们就深入了解一下C语言中的转义字符吧!!!一、定义C语言中的转义字符,是一种以反斜杠 “\” 开头、后边跟特定字符(或数字)的特殊字符序列。它的作用就是“转换字符原有的含义”,用于表示那些无法直接通过键盘输入(换行、制表符)或有特殊语法含义。
2026-01-04 13:27:30
1045
1
原创 从零开始学C语言--9.C语言中的字符串
在C语言中,并没有专门定义字符串数据类型。我们这里提到的字符串(String)的本质是:由一组以\0(空字符,ASCII码值为0)作为结束标记的字符序列构成的字符数组,存储在内存中连续的字节空间里。在C语言中,字符串表现为用英文双引号括起来的字符序列。(在C语言的语法中,所有参与编译的符号都需要是英文字符)
2026-01-03 12:01:16
1102
原创 从零开始学C语言--8.C语言中的常量
本文简要的介绍了C语言中的常量的基础知识,可以帮助大家更好地、较为全面的认识C语言中使用的常量,以及需要注意的问题。我们还是老生常谈,再拉出之前的超市进销存软件的例子,在这个软件的开发过程中,我们会发现:有些数据是不能发生变化的,例如人民币的面值。字面常量、#define、const等(const用于修饰变量,其修饰的变量称为常变量,不可被修改,具有一定的常量的特性)C语言中的常量(constant),是指程序运行过程中值不可被修改的固定数据,是占用内存的、具有明确类型的静态数据。
2025-12-31 20:52:21
731
原创 从零开始学C语言--6.C语言的数据类型简介
所有的计算机语言都有一个共同的目的:解决现实中的问题。想要解决现实中的问题,就必须有能力来描述现实中的问题。例如,一个大型超市,如果完全依靠人工进行进销存的管理,可能会是一个比较复杂的工作,在计算机发达的信息时代,完全可以将这些工作交给计算机完成。这就需要用一种计算机可以读懂的语言构建一个购物商城的软件。在构建一个购物商城的软件的过程中,会有这样的场景:对商品的库存数量、单价、销量等数据进行统计、计算、管理的。这时,如果需要用计算机语言去描述,就需要有数据类型的概念了。
2025-12-29 09:47:36
1097
原创 从零开始学C语言--5.C语言中的关键字
C语言中的关键字(Keyword),又称“保留字(Reserved Word)”,是由C语言标准预先定义、具有固定且特殊的语法含义的标识符。其核心特性如下:1.关键字是编译器内置的“语法标记”,用于标识数据类型、控制结构、存储属性等核心语法要素,不可被程序员重新定义(不能用作变量名、函数名、数组名等标识符)。2.关键字的大小写敏感(C语言中所有的关键字均为小写,Int、IF等均不被视为关键字,但是也不推荐程序员使用,以免造成混淆)。
2025-12-27 14:37:10
828
原创 从零开始学C语言--4.组成C语言的关键要素
{}两个大括号括起来的内容,表示一个代码块(又称复合语句),用于包裹一组语句,同时定义了变量的作用域,代码块内的局部变量仅在块内可见。
2025-12-26 13:25:07
1095
原创 从零开始学C语言--3.第一段C语言程序
printf是一个库函数,是用来在屏幕上打印信息的我们可以这样使用它:(更多的、更复杂的使用方法我们后边会单独介绍)//在屏幕上打印一串字符串 printf("this is my Cprogram\n");//在屏幕上打印一个整数 printf("%d\n", 10);//在屏幕上打印一个小数 printf("%f\n", 10.1);
2025-12-24 11:24:10
401
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅