- 博客(76)
- 收藏
- 关注
原创 FWD八位单片机调试问题
一个是加权求平均值,现在是用的峰值来对比恢复电压,可以给采样到的几次峰值进行加权求平均,但它会引入一点时间上的滞后,并且要注意如果电压发生突变,比如说从220V突然跳变到140V或者300V,那采样的第一次是正常电压,加上后面几次不正常的电压进行加权平均,算的值是非常不准的,后面的周期采样会准,但是由于第一次采样不准,很影响后续的分闸合闸操作,对于过欠压的检测这个系统来说是毁灭性打击。LED任务是一个时间敏感任务,需要一个绝对精准的后台来管控,中断拥有绝对的实时性,硬件计时,时间精度很高,并且非阻塞。
2026-11-13 16:17:59
181
原创 PWM波形调试
AAR寄存器:自动重装载寄存器,主要影响pwm的频率。简单来讲,cnt从0开始计数,计数到AAR设置的值就清0,也就是说AAR的值越大,PWM的频率就越低。CCR寄存器:捕获比较寄存器,在pwm模式1下,cnt小于CCR则输出高电平,cnt大于CCR则输出低电平。它决定pwm的占空比。PWM,脉冲宽度调制,是一种通过控制高电平持续时间(占空比)来模拟连续电压信号的办法。逻辑分析仪抓到的波形。
2026-10-29 13:59:12
9
原创 关于can的调试
位于can外设的寄存器空间,不在SRAM里,所以不能用memset,memcpy操作,只能通过HAL API或直接读写寄存器来操作。在外设寄存器,跟fifo相比是一个深度为3,不按照先后顺序,每格带独立状态的发送缓冲区,它存在的首要目的不是存数据,而是为了让CPU不要等待总线。数据先发到邮箱,硬件等待总线空闲,由can内核进行组帧同时回环给接收端,CRC校验,经由滤波器检查对照id,发到fifo中,等待数据被取走。作为远程发送请求位,为0时是显性电平,代表数据帧(CAN_RTR_DATA。
2026-10-28 17:55:15
194
原创 jlink以及时钟相关的问题
目前推测可能是因为hse起振后停振,系统时钟消失,jlink可以握手但是后续的操作都要经过ahb总线,ahb总线需要系统时钟,所以没办法完成后续对CPU的操作,jlinkcommander上面显示can not to attach cpu。后续选择通过HSI给板子提供时钟,给到了48MHZ是没有问题的,但是给到64MHZ就出现了相同的问题。点下载后,在连接建立的瞬间松开 NRST,Keil 随即擦除旧程序并烧入新程序,从而避免旧程序再次跑飞。因为串口波特率,定时器,RTC全部都依赖于时钟精度。
2026-10-28 09:52:00
172
原创 关于adc采集
由时钟控制器提供的ADCCLK和pclk(apb2),RCC控制器为ADC提供一个专用的可编程预分频器。最大可到14MHZ,实际上分频后最大只能拿到12MHZ,转换时间大概是1.17us左右。adc只有一个寄存器存值,寄存器地址不能选择递增。因为adc精度最高14位,所以选择Half Word。等待ADC转换完成后接收的返回值。adc读取数据的三种方式。
2026-10-27 17:07:09
138
原创 串口的一些调试
是 HAL 给每个串口配的**“控制块”**,里面记录:用哪个硬件、怎么配、当前在干什么。dma适合传输高速,大量的数据。串口,adc的连续采样,spi的屏幕刷图都适用。其本质是为了绕开cpu。空闲中断接收不定长数据。关于uart的结构体。
2026-10-27 11:22:30
212
原创 线程邮箱项目整合
mqtt的工作流程,先把收来的数据打包成json格式,然后封装MQTT消息,将这个json字符串装入message结构体,设置好Qos服务质量和服务等级,接着,通过 MQTTClient_publishMessage,将消息发送到预定义好的设备属性上报主题(Topic)上。首先通过mqtt-init建立起与云端的长连接,在mqtt_init里,先进行tcp的三次握手,然后发送mqtt的连接报文,报文里就包括我的身份信息,ID,设备名,Token秘钥等。根目录 /` 是您的“系统内部空间”,是易碎的。
2026-09-06 16:23:15
218
原创 俯仰角与互补滤波
使用互补滤波,只解析得到一个俯仰角MPU6050是一款集成度极高的,它将三轴加速度计和三轴陀螺仪封装在同一个芯片内,通过I2C接口直接输出原始数据加速度计本质上是一个的传感器MPU6050 内部是一颗芯片,里面有极其微小的硅晶片结构。:质量块(小球)被微细的硅弹簧悬挂在中间,它的四周有极其精密的梳齿状电容。静止时,中间的小球和四周的梳齿保持均匀的距离。:当芯片(也就是小车)向前加速时,中间的质量块因为惯性会,导致后面的间距变小,前面的间距变大。
2026-08-31 15:51:20
154
原创 stm32小车
接线图OLEDKeil的字符编码解析与源文件实际的UTF-8编码不匹配,导致中文字符串在编译器眼中被“切断”或“乱码化”,源文件是编码(汉字占3个字节)Keil 默认按编码(汉字占2个字节)去解析文件,编译器按2个字节切分3个字节的中文,导致字节错位LED通过LED_Init函数开启GPIOC端口时钟,并将PC13引脚配置为推挽输出模式,同时默认输出高电平使灯处于熄灭状态TIM这个板子只有4个定时器TIM1提供1ms的定时中断TIM1 是高级定时器,APB2 上挂载的都是和。
2026-08-28 13:48:25
283
原创 进线程相关
进程的独立空间是通过“虚拟地址 + 页表”实现的:每个进程拥有独立的虚拟地址空间和独立的页表,CPU 发出的虚拟地址经 MMU 查页表转换为物理地址,不同进程的页表指向不同的物理页框,从而实现“看到的相同虚拟地址,对应不同的物理内存”的效果。给进程 A,进程 B 的地址空间完全不受影响,比如浏览器每个标签页独立进程,一个崩溃不影响其他,多进程的创建与切换开销大,内存占用高;笼统的说,有就绪态,运行态,阻塞态,在Linux中有,用户运行态,内核运行态,就绪态,可中断睡眠,不可中断睡眠,僵尸态,暂停态。
2026-08-26 14:05:15
244
原创 SPT660三相多功能表
各相及总的有功功率(Pa/Pb/Pc/P)、无功功率(Qa/Qb/Qc/Q)、视在功率(Sa/Sb/Sc/S)。在 Modbus RTU 中,主从通信的本质就是主站发送一帧“命令”,从站回复一帧“数据”。:相电压(Ua/Ub/Uc)、线电压(Uab/Ubc/Uca)、各相电流(Ia/Ib/Ic)、频率(F)。,不可能去读它内部的寄存器(因为那是厂家的商业机密),只能用。:各相和总功率因数(PFa/PFb/PFc/PF)。(紧凑、高效,工业界 95% 都是这个)。:电压/电流/功率/因数/频率(27 个)
2026-08-25 13:57:37
193
原创 can总线相关
首先,双方同时发送显性电平的起始帧,随后在各自的 11 位标识符(ID)上开始“掰手腕”:由于 0 是显性、能强制覆盖隐性的 1,且每个节点都具备“边发边听”的硬件机制,发送隐性位(1)的节点若在回读时检测到总线为显性(0),便会立刻判定自己仲裁失败,并在不丢失任何数据的前提下自动退让,转为监听等待;,就是防止信号跑到终点撞墙反弹的“吸收堵头”,它同时为总线空闲提供了稳定的基准电压,是 CAN 总线能够高速、长距离稳定通信的。,能够强制覆盖隐性电平。普通串口下,两个节点同时发数据,一个发 1,一个发 0,
2026-08-25 10:31:33
234
原创 ADXL345调试
等您的 MCU 闲下来了,可以一次性把 32 个数据读走,保证数据不丢失。硅片内部有一个弹簧,另一端悬挂着一块可移动的质量块,在质量块的上方和下方(或两侧),分别固定着两块金属板。:内部集成了低通滤波器,用于去除高频噪声(比如外部轻微的机械抖动),保证输出的模拟电压平滑且真实。ADC 转换出来的原始数据,并没有直接送到总线上,而是先经过了内部的“指挥中心”。质量块产生的电容变化微乎其微(皮法级别),必须经过内部的精密电路处理。此时,真实的“物理加速度”就变成了电脑能处理的“数字信号”。
2026-08-22 15:41:39
257
原创 BH1750调试
并通过写入寄存器,指挥芯片内部的硬件电路自动在 SCL 和 SDA 引脚上产生准确的电压波形(包括起始位、地址、数据、ACK和停止位),同时实时监控硬件状态寄存器的变化,确保数据成功发送或接收。通过光敏二极管将光信号转变为微弱的模拟信号,通过运算放大电路放大后交给adc,adc对电流进行采样并量化为一个16位的二进制数字存在寄存器。指向的是 I2C1 总线,核心层就会把写好的“标准快递单”准确无误地扔给负责 I2C1 总线的。它负责把上层(核心层)封装好的标准 I2C 数据帧,等一套标准 API。
2026-08-21 00:04:05
242
原创 MQ135调试
MQ135MQ135 是一款。它内部有一个对气体浓度敏感的半导体(二氧化锡 SnO₂)材料。。在您的工厂项目中,它可以用来检测车间内是否有烟雾(火灾预警)或有害气体泄漏。。:它内部有一个加热电阻,通电后需要大约的预热时间,才能进入稳定工作状态(预热期间数值是跳动的)。它的核心是一个(Rs)。:气敏电阻阻值非常大,接近无穷大。:气敏电阻阻值会迅速。:由于 MQ135 模块上通常会自带一个(即一个与气敏电阻串联的固定负载电阻 RL),气敏电阻阻值下降,会导致分压点(即模块的)的电压。
2026-08-20 13:21:36
236
原创 传感器调试1
首先发送一个起始信号,拉低电平20ms,然后主机释放总线13ms。DHT11的data引脚检测到外部电平为低电平时,等待外部信号结束,延迟后data引脚为输出状态,输出一个83ms的低电平作为应答信号,后输出87ms的高电平通知主机我准备发数据。湿度 20%~90%RH(精度 ±5%RH)。(也就是说,你不能毫秒级去读它,它最快1秒更新一次数据)。:上述过程重复 40 次,直到读完 5 个字节。:供电正极,通常接 3.3V 或 5V。:单总线(1-Wire)协议。:单总线数据引脚,双向通信。
2026-08-19 15:52:12
218
原创 嵌入式---驱动7
内核计数器是,用于安全地记录各种事件发生的次数,比如中断次数、错误次数、数据包数量等。赫兹(Hz)在内核中表示系统一秒所对应的节拍数量,目前为100。在内核中的.config 中定义, jiffies表 示系统节拍,记录系统启动到当前累加的数字,如果想通过内核定时器计时则定时时间为:)定时时间到达后可以调用回调函数。函数接口每次中断只是调用mod_timer重置超时时间,,开销极小。kworker线程不会被阻塞,能及时处理其他任务。适合场景(比如编码器、高频按键)。jiffies。
2026-08-12 16:44:16
208
原创 嵌入式---驱动6
当一个进程因为等待锁而陷入睡眠时,内核需要保存当前进程上下文,把他从队列中移出,选择下一个进程,切换页表,恢复新进程的上下文,重新执行新进程等一系列操作,产生很大的上下文切换开销。而自旋锁在锁被调用时,不会放弃cpu,不停自旋检查,等待开销很小。:自旋锁会让持有 CPU 核心空转 1 毫秒,而互斥锁只需要花 10 微秒去切换一下线程,然后这个 CPU 核心就可以去运行其他任务。,缺点是在等待时 CPU 会空转。自旋锁是一种忙等待的同步机制,在锁被拿走后cpu会不停自旋检查锁是否被释放,适用于短临界区多核。
2026-08-11 13:08:43
192
原创 嵌入式----驱动5
相关函数接口linux中断子系统中断会打断内核进程正常调度和运行,所以系统对高吞吐量的追求势必要求中断服务尽量短小精悍,快进快出,所以Linux中断处理程序架构为:为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点Linux将中断处理程序分解为两个半部:Top Half和BottomHalf上半部:也称为中断顶半部,用于完成尽量少的比较紧急的功能,通常被设置为不可被新中断打断。下半部:也称为中断底半部,用来完成中断事件绝大多数任务,可以被新的中断打断,这。
2026-08-10 17:40:24
208
原创 嵌入式---驱动4
现代芯片的引脚大多很“忙”,一个物理引脚可以被复用为 GPIO、UART、SPI、I2C 等多种功能。pinctrl 就像是一个“功能开关”,负责把一个引脚从“普通 GPIO 模式”切换到“UART 发送模式”。这包括配置引脚的上下拉电阻(比如上拉、下拉或悬空)、驱动电流强度、信号压摆率等。这些配置保证了信号传输的稳定和硬件的正常通信。设备树采用了“分层设计”,底层的物理细节对高层的设备驱动隐藏了。原设备的寄存器地址相关信息被封装到了更底下的设备树节点中。来复用引脚,包含引脚的配置,方便客户段的使用。
2026-08-07 16:47:33
274
原创 嵌入式--驱动3
设备树是硬件的"说明书",告诉内核系统里有什么硬件、怎么配置。它让同一个内核可以支持不同的板子,修改硬件只需改设备树而不需要重新编译内核。设备树描述引脚复用、时钟、中断、内存等硬件信息,驱动根据设备树自动配置硬件。创建杂项设备,通过设备树的节点查找到设备,通过字符串查找这个节点下的属性,读寄存器数组,建立reg的映射。:每对值表示一个寄存器起始地址和长度。:绑定设备与驱动程序的标识符。:自定义的控制设备节点名称。:表示子节点或寄存器地址用。:显示启用该设备,若为。:表示地址范围长度用。
2026-08-06 17:28:07
229
原创 嵌入式驱动2
device_create_file 函数,创建设备的属性的属性,用_ATTR, 填充 属性结构体。,自动创建设备节点。适合 LED、GPIO、按键等小型设备,代码简洁,注册/注销方便。,读写权限,读函 数,写函数。的返回值,要返回该函数形参的,最后一个参数。Misc 设备驱动是字符设备的简化版,主设备号固定为。内核信息的"展示窗口",通过文件查看/控制内核对象。,用于管理那些不适合归类到其他类别的小型设备。的返回值,需要返回值输出字符串的长度。创建好设备的类型以及设备节点,,寄存器的设置,都建议在。
2026-08-05 17:30:30
175
原创 嵌入式---驱动1
标准的压缩内核镜像是 zImage 加上 64 字节。uImage 头部包含了等信息,让 U-Boot 可以自动验证和加载内核。驱动的编写两种加载方式驱动代码被(如zImage系统启动时,内核会这些驱动,它们会在内存中,无法被卸载。:驱动代码被.ko。这些模块出现在内核镜像中,而是在系统启动后,根据需要加载到内核中运行,用完之后也可以,释放内存。三种驱动模式:数据以的形式按顺序传输,不支持随机访问。:以(扇区,通常 512B 或 4KB)为单位进行读写,,并且有机制。:不通过设备文件访问,而是通过和。
2026-08-05 12:38:02
199
原创 系统移植1
(常简称为 8780)主要是由硬件设计、Linux 内核以及 U-Boot 三方协商约定的结果。,32kb i-cache(指令缓存),32kb d-cache(数据缓存)作用是在内核加载前对硬件设备初始化,为内核的运行提供引导功能。让操作系统(如 Linux)在特定的硬件平台上运行。u-boot.imx在bin文件前加了一些信息文件。个外设时钟使能寄存器,默认打开所有的外设时钟。uboot.bin 与 uboot.imx。的命令,让你可以在 Vim 等编辑器中。提供引导所需的所有关键信息的。
2026-08-04 09:21:40
218
原创 硬件14 PWM
的值相等,此时,当前的PWM周期结束。在下一个脉冲到来之前,引脚电平重回高电平,计数器置0x0000,下一个周期开始。PWM 硬件自动输出波形,FIFO 空时触发中断,CPU 在中断中补充新数据,实现占空比的连续变化。频率就是开关速度,把一次开关算作一个周期,那么频率就是 1 秒内进行了多少次开关。进行实时比较,当值相等时,硬件触发比较匹配事件,将引脚拉至。,实现占空比的连续更新,无需 CPU 频繁干预。本质上来说PWM的目的是产生一个方波。,用于配置 PWM 输出引脚的行为模式,包括。
2026-07-31 09:17:04
187
原创 硬件13 SPI
(Clock Phase):时钟相位,决定接受方在第几个边沿采样,0表示在SCLK第一个边沿采样,1表示在SCLK第二个边沿采样。CPHA:时钟相位,决定接收方在第几个边沿采样,0为在SCLK第一个边沿采样,1为在SCLK第二个边沿采样。(Clock Polarity):时钟极性,空闲时 SCLK 的电平,0为低电平,1为高电平。SPI 是"交换"数据,不是"发送"数据。CPHA=0 :sclk空闲时为低电平,spi在上升沿采样。CPOL:时钟极性,空闲时SCLK的电平,0为低电平,1为高电平。
2026-07-29 09:45:49
172
原创 c语言题目相关
会打印随机值,因为数组没有被初始化,里面全是垃圾信息,strlen是函数,会细数“\0”之前的全部字符数,而sizeof是运算符,且体现的是占用空间大小,不需要初始化数组。p是个野指针,存的是随机垃圾值,解决办法有两个,1是定义一个普通变量来替换,2是给p在堆上开一个空间用malloc,最后记得用free回收这个指针。数组是一段连续的内存空间,随机访问,通过下标直接取,速度快,但是不方便操作,插入删除需要移动大量元素。程序崩溃,在函数里传递的是形参,没有改变str的值,str一直为NULL,
2026-07-27 17:19:00
215
原创 c语言相关手撕复习
内存重叠:当源内存区域(src)和目标内存区域(dest)有重叠部分时,复制操作可能导致数据被覆盖或损坏。冒泡本质上是通过比较相邻元素,将最大或最小的元素冒泡到序列的一端,外层控制排序轮数,内层循环控制比较次数。插入:将数组分为有序和无序部分,每次在无序部分拿出一个元素插入到有序部分的合适位置,重复这个过程。快速排队:找出其中一个元素,比这个元素小的或者等于的排到左边,比这个元素大的排到右边,1.冒泡排序(并讲述原理,判断输入的整数二进制数1的个数),快排,插入,二分查找。(8 位),取值范围是。
2026-07-27 16:38:49
322
原创 硬件11 通信串口与I2C
同步通信(SPI,I2C)通过时钟线同步双方节奏,速度快,效率高,异步通信(UART)靠波特率约定速度,双方各自使用自己的时钟,需要起始位和停止位进行同步,速度相对较慢。同步异步uart初始化发送单个字符发送字符串从指针p指向的地址开始,逐个取出字符发送,直到遇到字符串结束符'\0'为止。接收URXD是32位寄存器,只有低8位存放着实际存储的数据,如果不做掩码处理,传回完整的32位数据的话,高位可能包含错误标志或状态位,会污染数据。使用0xFF进行与运算,保留低8位,清除高位。是一种简单的。
2026-07-25 12:08:16
175
原创 硬件10 定时器
它是一款设计目标非常专一的定时器,核心功能就是产生精确的周期性中断,结构简单,配置方便,适用于像LED精确翻转、按键消抖、操作系统时间片调度这类需要稳定周期信号的场景。是 i.MX6ULL 等 ARM 处理器中的一个多功能定时器模块,用于实现各种定时、计数、输入捕获和输出比较功能。相比EPIT,它的功能要丰富和强大得多,是一个真正的多功能定时器模块。:它可以选用IPG_CLK等多种时钟源,并支持1~4096范围的分频,方便你得到想要的计数频率。)重新装载初始值,并开始下一轮计数,产生的是。
2026-07-23 17:47:01
236
原创 硬件9 arm时钟树
在使用中断的时候需要初始化 GICC_PMR 寄存器,此寄存器用来决定使用几级优先级, GICC_PMR 寄存器只有低 8 位有效,这 8 位最多可以设置 256 个优先级,但是由于我们使用的Cortex-A7只有32个优先级,所以还不得不按照GIC手册第131页的说明对 GICC_PMR 进行设置。先配置旁路时钟,让片上系统的电平传进去,pll1输出暂时改为step_clk,让arm暂时工作在24mhz,防止内核因频率上升过快导致故障,然后配置好二分频和倍频因子,最后改为pll1_main。
2026-07-22 17:55:32
206
原创 硬件8 arm
GIC-400理论最大支持1020个中断(编号0-1019),分三大类:SGI软件生成中断(编号0-15,共16个),由软件写寄存器触发,用于核间通信和多核调度;先保存所有寄存器,此时仍为irq模式,然后单独保存一下r0和r1的状态,切换到system模式,保存system的lr,然后调用c函数,此时可以进行中断嵌套,后面进行一系列恢复操作,最后要把中断号写回。上电复位,触发_reset_handler,进入irq模式,设置irq的栈,切换system模式,设置system的栈,使能所有外设时钟,点灯。
2026-07-22 17:44:31
241
原创 硬件7 arm相关
是反汇编和文件分析工具,可以查看 ELF 文件中的汇编指令、段信息、符号表以及地址分布,常用于裸机程序调试和分析。是文件格式转换工具,主要用于将 ELF 文件转换为适合烧录到开发板中的二进制文件,例如 .bin 或 .hex 文件,同时可以去除 ELF 文件中的调试信息。是链接器,用于将多个目标文件和库文件进行合并,根据链接脚本分配程序中各个段的存储地址,最终生成 ELF 格式的可执行文件。2. .text段、.bss段、common段、.data段、.rodata段的区别。,如指令执行错误、系统调用。
2026-07-22 12:46:04
201
原创 数据结构 链表3
采用链式存储结构的栈,通过节点之间的链接关系实现后进先出(LIFO)的数据存取,栈顶为链表的头节点,插入和删除都在栈顶进行。与单向链表相比,单向链表需要通过遍历找到倒数第二个节点。必须找到前驱才能修改其pnext。普通链表是把数据塞进链表节点,内核链表是把链表节点塞进数据。,是数据结构中一种线性存储结构,由编译器自动管理。注意多种情况,某个节点位于头或尾的情况下的条件。与单向链表相比需要额外处理前驱指针。本质:双向循环链表,有头链表。计算成员在结构体中的偏移量。
2026-07-17 11:20:04
191
原创 硬件6----arm指令
学习arm汇编的主要目的是为了编写arm启动代码,启动代码启动以后,引导程序到c语言环境下运行。CMP比较指令用于比较两个寄存器的值或者比较一个寄存器和立即数的值,其原理是对待比较的两个数求差,看结果是否为0,这个指令会无条件修改N,V,C,Z位。大多数指令的格式为opcode rd, rn ,rm,其中,rd是目标寄存器,rn是第一操作数寄存器。加载立即数2到寄存器r0,MOV{S}<c> <Rd>, #<const>将r0寄存器的值加载到r1,MOV{S}<c> <Rd>, <Rm>
2026-07-17 10:31:37
236
原创 硬件基础5--arm基础
current programmer status register,当前程序状态寄存器,存放程序运行到某一步时相关的状态(溢出、进位、借位):save programmer status register,保存程序状态寄存器,当异常发生时,保存CPSR寄存器中的值。程序计数器,本质上是一个指针,指向当前正在处理的指令的下一条指令。小端存储:内存低地址存放低数据位,内存高地址存放高数据位(SOC)异常向量表 :数组,数组中存放的是跳转到对 应异常服务函数的指令。
2026-07-16 09:42:52
232
1
原创 硬件基础4
1.主机将总线拉低小于15us,告诉从机开始写数据,然后释放总线,呈现高水平,驱动“1”电平到总线上,从机此时释放总线。1.主机首先将总线拉低小于15us,告诉从机开始写数据,然后持续拉低60us,驱动 '0' 的低电平到总线上。2.ds18b20在30us---60us内进行采样,此时总线如果是低水平,则ds18b20读0。4.ds18b20将总线拉低60---240us,回复响应脉冲,向主机应答。1.主机将总线拉低480---960us,发送复位脉冲,告诉从机准备复位。
2026-07-14 17:26:53
231
原创 硬件基础3
(负逻辑):高电平(1):-3V - -15V 低电平(0):3V - 15V ,本身为负逻辑(高电平=负电压,低电平=正电压),需要电平转换芯片(MAX232),单端信号,抗干扰一般。(差分):高电平(1):2V - 6V 低电平(0) :-6V - -2V, 其差分信号为两根线的电压差代表数据,传输距离长,抗干扰能力强,支持多节点,为半双工通信。偶校验:校验位是'0',用数据位中的'1'的个数加上校验位的'0',如果的'1'的个数是偶数, 代表偶校验通过。
2026-07-13 22:16:54
233
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅