- 博客(519)
- 资源 (24)
- 收藏
- 关注
原创 Qt 利用TCP/IP socket通信 发送与接收结构体(简单通信协议解析)
我们设计一个混合方案:使用QDataStream序列化结构体数据,然后将得到的QByteArray转换为Base64编码的字符串,放入JSON中。这样,我们可以利用JSON的可读性和扩展性,同时保证结构体中浮点数等二进制数据的精度。步骤:定义结构体,并使用QDataStream进行序列化和反序列化。将序列化后的QByteArray转换为Base64字符串,以便放入JSON。构建JSON对象,包含必要的字段,其中结构体数据部分为Base64字符串。通过TCP传输JSON字符串。
2026-02-19 21:03:34
310
原创 C++的RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制
RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。
2026-02-18 21:09:36
583
原创 实时状态机框架 QP/C
QP/C 是一种专门用于嵌入式系统开发的实时状态机框架,全称为 “Quantum Platform for C”,由 Miro Samek 博士提出,基于层次化状态机(HSM,Hierarchical State Machine) 理论,是 QP(Quantum Platform)系列框架(包括 QP/C++、QP-nano 等)中针对 C 语言的版本。传统的有限状态机(FSM)难以处理复杂系统中 “状态嵌套” 和 “行为复用” 的问题(例如,多个子状态共享父状态的通用行为)。适合使用QP/C的情况。
2026-02-09 19:47:24
537
原创 STM32+FreeRTOS 长期可维护架构设计(事件驱动篇)-- 告别“屎山”代码
要解决上述问题,必须通过架构手段强行物理隔离“发生了什么”(事件)和“要做什么”(业务)。不要用 0, 1, 2 这种魔鬼数字,用枚举清晰定义系统中发生的所有事。// 1. 事件类型定义(只描述事实,不描述动作)// 硬件输入类EVT_KEY_SHORT_PRESS, // 短按EVT_KEY_LONG_PRESS, // 长按EVT_USB_PLUG_IN, // USB插入// 通信类EVT_UART_PACKET_RECV, // 收到完整数据包。
2026-02-08 19:09:58
666
原创 嵌入式软件开发之状态机+事件驱动
在图 6 中我们当然可以看出 I1 先于 I2 执行,即事件 E1 发生在事件 E2 之前,但是主函数再次读取事件标志组 g_u8EvntFlgGrp 的时候, 看到的是两个“同时” 被置位的标志位, 无法判断出事件 E1 和 E2 发生的先后顺序, 也就是说有关事件发生先后顺序的信息丢失了, 这就是前面说的第 1 个问题:不同事件集中爆发时,无法记录事件发生的前后顺序。有了数据结构,还要有对应的算法实现,消息机制的数据主体就是一个数组化了的环形队列,环形队列的算法就是我们所要的算法。
2026-02-08 11:58:41
604
原创 STM32模拟IIC读取PCF8563
与STM32微控制器通过I²C总线进行通信时,它具有一个7位的地址选择,可以在硬件上通过引脚电平配置。I²C地址对于确保主从设备之间正确的通信至关重要,PCF8563的默认地址通常是0x51(读取)和0x50(写入)。在实际应用中,如果系统中有多个I²C设备,就可能需要修改默认的I²C地址以避免地址冲突。修改的方法是通过改变PCF8563上的地址引脚(A0、A1、A2)的电平来实现。例如,如果将A0引脚接地,读写地址就会变为0x50和0x51;反之,若将其接高电平,则地址分别变为0x52和0x53。
2026-02-05 12:31:00
116
原创 从STM32F407到STM32H743:使用CubeMx实现基于Lwip+LAN8720A+FreeRTOS的以太网数据传输(MPU、D-Cache、I-Cache踩坑指南)
程序跑一会儿就进 HardFault_Handler,PC 类似 0x32F9xxxx(明显是 SRAM),说明在执行被 DMA 写坏的“垃圾代码”。DMA(ETH、SDMMC 等)直接访问 SRAM,看不到 Cache 中尚未写回的修改。CPU 读写数据 → 先在 Cache 里操作,不一定立刻写回 SRAM;DMA 向 SRAM 写 Rx 数据,CPU 还在读旧 Cache;:所有用 DMA 的外设都必须考虑 和 D-Cache 的一致性。:在不加外部 RAM 的情况下,把性能榨干。
2026-01-29 08:40:26
729
原创 掌握这7种嵌入式C语言设计模式,轻松应对复杂车载控制逻辑
现代车载控制架构正从分布式ECU向域集中式乃至中央计算平台演进。这一转变的核心驱动力来自软件定义汽车(SDV)的需求,要求系统具备更高的算力、更强的通信能力以及更灵活的OTA升级支持。服务化架构的落地实践以AUTOSAR Adaptive为基础,越来越多车企采用基于SOA的服务化通信。// 示例:Adaptive AUTOSAR 服务注册片段中央计算单元的部署挑战在实际项目中,如蔚来NT2平台采用NIO Adam超算平台,将智能驾驶与座舱功能整合至双Orin芯片。
2026-01-17 17:36:11
844
原创 字符串转浮点数函数atof、strtod、strtof和strtold详解
历史背景:C89 标准引入的基础函数,隶属于<stdlib.h>,设计目标是快速转换、接口简洁核心特点:无错误处理机制,仅返回转换结果;自动忽略前导空白字符,遇到非数字字符停止转换适用场景:简单场景(如已知字符串格式规范),无需精确错误判断的快速转换// atof:无错误反馈,返回double// strtod:支持endptr和base(base=0时自动识别十进制/八进制/十六进制)// strtof:单精度版strtod// strtold:扩展精度版strtod。
2025-12-09 16:06:42
674
原创 基于STM32F103驱动AD7124-8 24Bit 多通道ADC数据采集模块采集信号
AD7124-8 是一款高精度、低功耗的 24 位模数转换器(ADC),内置多种模拟前端功能,专为高精度传感器测量等应用设计。它支持最多 8 路差分输入,也可配置为最多 16 路伪差分输入,适用于多通道数据采集。产品特性高精度低噪声:内置 24 位 Σ-Δ(Sigma-Delta)ADC,具备极低的输入噪声。可直接连接微弱信号,无需额外前级放大。灵活的功耗模式:提供三种功耗模式(低功耗、普通、全速),可根据需求权衡功耗、速度和噪声性能。
2025-11-12 21:32:14
1081
原创 STM32之TM1638数码管及键盘驱动
TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。主要应用于冰箱、空调 、家庭影院等产品的高段位显示屏驱动。• 采用功率CMOS 工艺 • 显示模式 10 段×8 位 • 键扫描(8×3bit)• 辉度调节电路(占空比8 级可调)• 串行接口(CLK,STB,DIO) • 振荡方式:RC 振荡(450KHz+5%) • 内置上电复位电路 • 采用SOP28封装。
2025-10-24 20:48:34
817
原创 嵌入式(C/C++)开发模块化配置与编译、裁剪思想【借鉴freertos与HAL库模块化设计思想】
嵌入式模块化配置与编译方法总结 本文介绍了嵌入式开发中借鉴FreeRTOS和HAL库思想的模块化配置方法,主要内容包括: 预处理宏控制:通过config.h定义模块开关宏,利用#ifdef条件编译控制代码包含 模块化文件组织:每个功能模块独立成.c/.h文件,通过宏或工程配置决定编译 HAL库配置参考:模仿stm32f1xx_hal_conf.h设计,使用外设使能宏控制驱动代码 实际应用示例:展示了UART/SPI模块的配置实现方式 开发环境管理:介绍了Keil中文件包含和宏定义配置方法 这种方法显著提高了
2025-10-16 10:03:49
651
原创 【工程模板复用】STM32CubeMX .ioc的工程名修改,保持工程文件目录和代码不丢失
将xx.ioc 文件用记事本打开;找到ProjectManager.ProjectFileName和ProjectManager.ProjectName,把其后面的参数改成你要修改的新名称;
2025-10-12 16:40:42
1024
原创 FreeRTOS互斥信号量解决优先级翻转实战教程
本文介绍了如何使用FreeRTOS的互斥信号量解决优先级翻转问题。通过将二值信号量替换为互斥信号量,当高优先级任务尝试获取被低优先级任务占用的信号量时,系统会临时提升低优先级任务的优先级,防止被中优先级任务抢占。文章详细展示了代码修改过程,包括在FreeRTOSConfig.h中启用互斥信号量、创建互斥信号量的实现原理,并通过串口输出验证了优先级继承机制的工作效果。最后提供了完整的示例代码,演示了互斥信号量如何确保高优先级任务及时执行,避免优先级翻转问题。
2025-10-09 20:27:54
985
原创 FreeRTOS临界资源保护方法
FreeRTOS提供多种临界资源保护方法:临界区通过关闭中断保护短操作(如变量修改),适用于微秒级操作;互斥量通过所有权机制保护长时间资源访问,支持优先级继承避免优先级反转;二进制信号量用于轻量级资源保护或任务同步;原子操作利用CPU指令直接保证简单变量操作的原子性。选择方法需考虑操作时长、频率、优先级关系及实时性要求:短操作用临界区或原子操作,长占用用互斥量,任务同步用信号量。核心目标是确保资源访问的原子性,防止数据竞争。
2025-10-08 21:09:06
989
原创 FreeRTOS任务同步与通信--任务通知
FreeRTOS任务通知是一种高效的任务间通信机制,允许直接向任务发送事件通知并附带32位值,相比传统队列或信号量速度更快且占用内存更少。每个任务拥有通知值和状态字段,通过API函数如xTaskNotify()进行发送和接收。从V10.4开始,任务通知支持数组形式,可通过配置扩展数量。xTaskNotify()更新目标任务的通知值,eAction参数决定更新方式(如设置、递增或覆盖)。该机制可作为轻量级队列替代方案,特别适合资源受限场景。
2025-10-08 13:42:30
1029
原创 stm32 freertos下基于hal库的模拟I2C驱动实现
本文介绍了在STM32 FreeRTOS系统下基于HAL库实现模拟I2C驱动的完整方案。主要内容包括:1)使用DWT实现精确延时函数(delay.c/h);2)通过GPIO模拟I2C协议的实现(i2cc.c/h),包括起始/停止信号产生、应答检测、数据收发等功能;3)关键配置要点,如将SCL和SDA引脚设置为开漏输出模式,以便同时支持输出和输入功能。该驱动可直接移植使用,实现了完整的I2C通信功能,适用于需要软件模拟I2C接口的应用场景。
2025-10-07 19:13:30
665
原创 字符串比较函数strcmp和strncmp以及memcmp详解与对比分析
字符串比较的本质是按 ASCII 码值逐字符对比,而非比较字符串长度。C 语言中字符串以’\0’作为结束标志,这一特性直接决定了strcmp()与strncmp()的设计逻辑差异:简单来说:strcmp()是 “全自动” 比较(直到结束符),strncmp()是 “半自动” 比较(指定最大长度)。两者的返回值逻辑一致 —— 均通过字符 ASCII 差值判断大小,但适用场景和安全性差异显著。
2025-10-07 09:48:38
1340
原创 FreeRTOS任务同步与通信--事件标志组
事件位用于表明某个事件是否发生,事件位通常用作事件标志,比如下面的几个例子:当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置1,当队列中没有消息需要处理的时候就可以将这个位(标志)置0。当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置1,当没有数据需要从网络发送出去的话就将这个位(标志)置0。现在需要向网络中发送一个心跳信息,将某个位(标志)置1。现在不需要项网络中发送心跳信息,这个位(标志)置0。
2025-10-06 11:35:57
902
原创 STM32f407在FreeRTOS中的微秒和毫秒延时函数(IIC/SPI等外设驱动时序需要不带任务调度的延时)
【代码】STM32f407在FreeRTOS中的延时函数。
2025-10-05 21:42:41
560
原创 仿照STM32 HAL库设计思想使用FreeRTOS实现异步非阻塞式设备驱动
作为对比,HAL库给用户提供了HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA等非阻塞式的操作方式,API仅启动的数据传输,后台自己执行数据传输任务,达到非阻塞式的效果,同时,可以在回调函数中指定发送结束需要处理的操作。HAL库提供的非阻塞式API,需要依赖实际的底层硬件和CPU并行操作,如DMA、中断,但是,实际的驱动程序编写场景,例如使用的软件模拟I2C的通信过程很难使用硬件并行的方式消除主程序的阻塞。另外,回调函数的另一个好处是可以屏蔽底层硬件差异。
2025-10-05 20:00:22
1238
原创 VS Code快速使用指南
在使用vscode打开工程文件之后,如果需要对比两个文件之间的差异。然后右键选择“Compare Seleted”即可。只需要ctrl选中两个文件,左键选中对比文件。
2025-10-02 17:53:25
407
原创 优雅动听的歌曲之一-小城画师
小城画师》是由李小贝演唱的国风歌曲,发行于2022年8月13日,歌词通过“折花赠人”“描月牙诉牵挂”等意象,展现诗意场景。歌曲收录于同名专辑《小城画师》,并衍生出合唱版伴奏、现场版等多版本演绎形式。歌词以国风元素为核心,通过“折花”“摘云霞”“描月牙”等意境化表达,构建出古典浪漫的画面感。歌曲《小城画师》由李小贝演唱,由未子夫填词,阿豪谱曲,收录在专辑《小城画师》中。
2025-09-28 21:56:00
236
原创 KEIL MDK程序代码编译成静态库文件及库引用笔记教程
本文介绍了在KEIL MDK中将STM32程序代码编译成静态库文件的方法。主要内容包括:1)库文件的作用(代码复用、模块化开发、保护知识产权等);2)具体操作步骤:移除无关源文件和头文件、修改输出格式为Create Library选项、提取生成的lib文件;3)测试验证方法;4)注意事项(正确声明函数变量、处理依赖关系等)。同时还提供了将多个.c/.h文件生成动态lib库的补充教程,强调保护知识产权和缩短编译时间的优势。文章通过详细图文说明,帮助开发者掌握库文件编译技术。
2025-09-25 20:48:40
1547
原创 STM32 HAL库实现FreeRTOS+FreeModbus(从机和主机)
本文介绍了在STM32 HAL库环境下实现FreeRTOS+FreeModbus(主从机)的移植过程。通过CubeMX配置硬件平台(STM32F407VET6),生成Keil工程,重点讲解了UART通信和中断的设置。移植FreeModbus源码时,需修改port文件夹下的关键接口文件,包括临界区保护、事件通知、串口通信和定时器实现等。其中,使用FreeRTOS的事件组和软件定时器来替代原RTT实现,并调整了定时器优先级。文章提供了详细的代码注释和配置说明,适合开发者参考移植。
2025-09-22 20:37:43
1276
原创 stm32 BootLoader之检查栈顶地址是否合法(否则无法跳转到APP程序)
本文介绍了STM32 BootLoader中检查栈顶地址合法性的原理与实现。以STM32F407ZGT6为例,在跳转到APP区时,需验证栈顶地址是否位于SRAM区域(0x20000000)。通过分析启动文件(startup_stm32h407xx.s)可知,FLASH起始地址存放的是栈顶指针(__initial_sp)和复位处理函数地址(Reset_Handler)。代码中通过判断高16位是否为0x2000来验证栈顶合法性,并结合MAP文件确认栈区范围(0x20004aa0-0x24005a40)。该机制确
2025-09-22 16:47:58
734
原创 STM32CubeMx配置FreeRTOS工程
本文介绍了使用STM32CubeMX配置FreeRTOS工程的注意事项和具体步骤。重点指出FreeRTOS时基源不要使用SysTick,建议切换至其他时钟源以保证时间准确性。文章对比了中断优先级和任务优先级的区别,并详细说明了FreeRTOS的特点,包括任务管理、内存管理等。配置步骤包括时基时钟源选择和FreeRTOS参数设置,通过图形化界面简化了实时操作系统的移植过程。该配置方法适用于STM32系列芯片,能有效提高系统实时性和可靠性。
2025-09-20 22:00:05
1051
原创 STM32 裸机时间片任务调度设计思想探讨
本文探讨了STM32裸机系统中的时间片任务调度设计方法。系统采用1ms定时器中断作为时基,通过任务控制块(TCB)管理多个任务,每个任务实现为独立的状态机。主循环轮询执行就绪任务,任务执行遵循非阻塞原则。该方案具有模块化、时间确定性强等优点,通过状态机模板和临界区保护实现稳定调度,适合对实时性有要求且不愿引入RTOS的嵌入式项目。文中详细给出了硬件定时器配置、TCB结构定义、任务状态机模板和调度器实现等核心代码。
2025-09-20 08:41:20
1233
原创 STM32使用内部FLASH保存程序配置参数(带有配置参数版本识别)
这篇文章介绍了如何在STM32微控制器中使用内部FLASH存储程序配置参数,并实现版本识别功能。主要内容包括:1) 设计了包含版本信息的嵌套结构体,包括配置参数头信息(ConfigHeader)和实际配置参数(AppConfig);2) 提供了FLASH操作函数,包括解锁、锁定、擦除、读写等基本操作;3) 实现了配置参数的保存(Save_Config)和加载(Load_Config)功能,包含CRC校验和版本检查机制;4) 通过定义魔数、版本号等标识确保配置数据的完整性和兼容性。这种方法适用于需要长期保存程
2025-09-19 11:59:43
470
原创 STM32HAL库-移植mbedtls开源库示例(一)
本文介绍了如何在STM32HAL库环境下移植mbedtls开源库,以支持MQTT证书加密功能。mbedtls是一个轻量级的C语言加密库,实现了TLS/SSL协议、X.509证书操作等安全功能,适用于嵌入式系统。文章使用STM32F103CBT6开发板和Keil MDK开发环境,详细说明了移植过程。mbedtls可为物联网通信提供安全加密支持,使TCP、MQTT、HTTP等协议升级为安全版本(TCP(S)、MQTT(S)等),有效防止数据传输中的中间人攻击。该库遵循Apache 2.0开源协议,适用于资源受限
2025-09-17 18:11:47
968
1
原创 在Linux和Windows系统下使用Qt监测U盘的插拔事件
本文介绍了在Linux和Windows系统下使用Qt监测U盘插拔事件的两种方法。方法一通过执行lsblk命令获取U盘路径信息,适用于Linux系统;方法二使用Qt的QStorageInfo类,可跨平台获取存储设备信息,包括U盘名称、路径、文件系统类型及容量等。两种方法均提供了完整的代码示例,其中QStorageInfo方法还能区分USB设备类型,适用于更复杂的应用场景。这些方案为开发跨平台U盘监控功能提供了实用参考。
2025-09-16 21:34:16
860
原创 正点原子STM32F407 U盘升级程序(IAP)OTA Bootloader APP USB升级+FATFS+USB Host
本文介绍了基于STM32F407的U盘IAP升级方案,通过Bootloader和APP分区实现固件远程更新。硬件采用正点原子STM32F407开发板,软件使用CUBEMx配置USB Host和FATFS文件系统。核心内容包括Flash分区管理(Bootloader区64KB,APP区动态分配)、U盘检测与固件读取流程、Flash擦写操作及跳转机制。文中提供了关键代码片段,包括Flash擦除写入函数和状态验证逻辑,并附完整源码链接。该方案实现了通过U盘进行固件升级的完整流程,包括数据校验、错误处理等功能,提升
2025-09-14 21:00:20
1217
原创 软件设计七大原则
软件设计七大原则是构建高质量代码的基石,包括开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)、单一职责原则(SRP)、接口隔离原则(ISP)、迪米特法则(LOD)和合成复用原则(CRP)。这些原则旨在降低对象间的耦合度,提升代码的可复用性、可扩展性和可维护性。例如,OCP强调通过扩展而非修改来适应变化,LSP要求子类完全替换父类而不影响功能,DIP提倡依赖抽象而非具体实现,SRP确保每个类职责单一,ISP拆分臃肿接口,LOD减少模块间依赖,CRP优先使用组合而非继承。合理运用这些原则能有效
2025-09-12 08:25:10
954
原创 【C++设计模式】第四篇:Composite 模式(组合实体模式)- 树形结构的优雅处理方案
摘要:C++组合模式(Composite Pattern)解析 组合模式是一种结构型设计模式,用于处理树形结构对象,将对象组合成树形结构表示"整体-部分"层次关系。它通过抽象组件(Component)、叶子节点(Leaf)和组合节点(Composite)三个角色实现统一操作接口,使客户端能一致对待单个对象和组合对象。典型应用场景包括文件系统、GUI组件、组织结构等树形结构。代码示例展示了如何实现组件基类、叶子节点和包含子节点的组合节点,通过递归操作处理树形结构。组合模式的优点在于简化客户
2025-09-09 08:22:12
697
原创 【C++设计模式】第三篇:观察者模式(别名:发布-订阅模式、模型-视图模式、源-监听器模式)
本文介绍了C++中的观察者模式(Observer Pattern),这是一种行为型设计模式,用于建立对象间的一对多依赖关系。当被观察对象(Subject)状态变化时,会自动通知所有注册的观察者(Observer)。文章通过交通信号灯与汽车的类比解释其工作原理,并列举了该模式的其他别名。观察者模式主要用于解决状态变化通知、对象间松耦合和广播通信等问题,适用于GUI更新、事件处理和分布式系统等场景。核心概念包括Subject(维护观察者列表并通知变化)和Observer(接收通知并响应),以及它们的具体实现类。
2025-09-08 17:59:13
1019
原创 【C++设计模式】第二篇:策略模式(Strategy)--从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
本文深入解析C++策略模式,从基本概念到应用实践。策略模式是一种行为型设计模式,通过封装算法实现定义与使用分离,遵循开闭原则。其核心结构包括策略接口、具体策略类和上下文类。文章通过代码示例展示了策略模式的基本使用方式,并详细分析了其内部原理:封装与委托机制、多态运用、动态切换策略以及策略选择决策方法。策略模式适用于需要动态切换算法、避免条件分支复杂化等场景,能有效提升代码的可维护性和扩展性。
2025-09-04 11:03:20
1280
原创 无法回避的字节对齐问题,从八个方向深入探讨(变量对齐,栈对齐,DMA对齐,结构体成对齐
回答:没有__packed的会出现字对齐等也就是,char型的有可能是占用4个字节的长度的内存空间有__packed 的就不会,就肯定是1个字节的内存空间,是gcc编译器的关键字。(不止vc下面32位的系统里面的内存数据的存取是32位的,处理的时候都是4个字节为单位,通常也就是int的长度。4.若自定义的malloc函数本身没有对分配的内存实现4字节或以上的对齐操作,分配出来的不对齐的内存,编译器是不知道的,所以很可能会产生问题。字节对齐的含义:4字节对齐的含义就是变量地址对4求余数为0;
2025-05-07 09:38:42
1134
原创 深入理解Qt状态机的应用
有限状态机(finite-state machine)又称有限状态自动机(finite-state automaton),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。这个概念在计算机科学、数学、语言学、工程以及其他研究领域都有广泛的应用。有限状态机非常适合用于描述那些通过一系列的输入来转移状态的系统。
2025-04-17 12:02:12
1215
原创 VS Code常见的查找快捷键大全
在查找并替换面板中,你可以输入要查找的文本和替换的文本,VS Code 会在当前文件中查找并替换所有匹配项。在打开的文件中,你可以使用快捷键 Ctrl+F(Windows/Linux)或 Cmd+F(macOS)来查找文件中的文本。VS Code 提供了多种方法来查找和导航文件,包括快速打开文件、文件资源管理器、全局搜索、查找符号、查找文件中的文本、查找并替换、文件导航和使用命令面板。你可以使用快捷键 Ctrl+T(Windows/Linux)或 Cmd+T(macOS)来查找符号(如函数、变量、类等)。
2025-04-13 17:22:12
3173
正点原子STM32F407 U盘升级程序(IAP)OTA Bootloader APP USB升级+FATFS+USB Host
2025-09-15
FreeRTOSv202112.00.zip
2022-01-04
cJSON(STM32CubeMX5.3.0).rar
2021-10-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅