自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(105)
  • 收藏
  • 关注

原创 ESP32-S3 定时器详解:esp_timer 与 GPTimer 的工程级选择

GPIO 是感觉器官任务是执行单元队列是神经系统定时器,是整个系统的节奏控制器理解定时器,并不是为了多记几个 API,而是为了让系统——什么时候该醒、什么时候该动、什么时候该停,都在你的掌控之中。当你开始认真对待定时器的时候,其实你已经从“写功能”,走向了“设计系统”。

2026-01-15 21:41:11 164

原创 从任务到队列:我在 ESP32-S3 上理解 FreeRTOS 的一次完整实践

这篇文章并不是在“教你怎么用 FreeRTOS”,而是记录了我在 ESP32-S3 项目中,从能跑,到开始在意结构是否正确的一个过程。FreeRTOS API 都见过但不知道什么时候该用任务、什么时候该用队列那编码器这个例子,可能会是一个不错的切入点。FreeRTOS 用得好,是能让人写代码写得更安心的。

2026-01-14 20:35:29 400

原创 GPIO 输入到按键中断:我在 ESP32-S3 上把「输入」这件事想明白的过程

这一篇,不是单纯讲 GPIO 怎么配,而是我。

2026-01-13 20:40:48 533

原创 任务看门狗(Task Watchdog)——ESP32 为什么这么“容易重启”?

如果你在 ESP-IDF 项目中频繁遇到 watchdog 错误,

2026-01-12 21:02:24 518

原创 从点亮一颗 LED 开始:ESP32-S3 GPIO 输出的正确学习方式

如何从芯片 → 原理图 → 示例 → API一步步拆解一个 ESP-IDF 外设功能后续无论是 UART、I2C、SPI,学习路径完全一致。只要你坚持用这种方式,ESP32 的外设并不会“越来越难”,只会“越来越熟”。

2026-01-08 21:53:40 1066

原创 跑通 Hello World 之后,我第一次真正用懂了 ESP32 的 menuconfig 和日志系统

hello_world 刚跑通开始写自己的最小工程串口日志越来越多开始意识到“不太对劲”menuconfig 和日志系统,不是高级内容,而是入门必经之路。日志不是随便打的行为不是只由代码决定的menuconfig 是工程的一部分。

2026-01-07 21:16:42 668

原创 我是如何从零开始,把 ESP32-S3 跑起来的

日常生活中,说起ESP32时,我们一般说的是下方形态的模组。但准确点来说,ESP32其实不是一款芯片,而是一个系列的芯片,这个和STM32有点类型,STM32有L系列、F系列、H系列,ESP32也有不同的系列。如果你和我一样,也是刚开始接触 ESP32-S3,希望这篇文章能让你少一点焦虑。不用急着“学很多”,先把第一步走稳,比什么都重要。后续我也会继续以一个刚入门的时候的视角,记录 ESP32-S3 的学习和踩坑过程。如果你也在入门阶段,欢迎一起交流。

2026-01-06 23:42:57 1338 1

原创 LVGL-02 本地字库添加和加载操作指南

需要开启。

2025-12-12 14:03:01 688

原创 LVGL-01从零搭建 LVGL 工程(Linux + CMake)

LVGL 是一套跨平台图形库,可用于 MCU、Linux、RTOS 等多种系统。虽然官方提供示例工程,但要在自己的系统里建立一个干净、可复用、可维护的 LVGL 开发环境,许多人会碰到头文件路径错乱、CMake 找不到配置、版本冲突等问题。本文记录了我在搭建 LVGL 桌面版实验环境中的完整流程,既是经验总结,也是今后移植到嵌入式 Linux/Qt/SDL 等环境的基础。LVGL 源码独立SDK 层抽象输出 include + lib应用工程简单清晰完整 CMake 构建流程全面踩坑记录。

2025-12-10 15:04:37 963

原创 从 sysfs 到 libgpiod ——Linux GPIO 控制的两种方式详解

在嵌入式 Linux 开发中,控制 GPIO 引脚是再常见不过的需求。无论是点亮一个 LED,还是检测一个按键,都离不开对 GPIO 的操作。本文带你从最传统的接口入门,再到现代的libgpiod接口。两者对比之后,你将清楚地知道:哪种方式适合快速调试?哪种方式适合正式产品开发?GPIO(General Purpose Input/Output)是“通用输入输出口”的缩写。输出高低电平(控制 LED、继电器等)读取电平状态(检测按键、传感器信号等)

2025-10-31 12:35:18 1285

原创 【无标题】

基于平台。V3S 的 GPIO 编号是由和。

2025-10-20 16:22:02 343

原创 一文读懂 Linux 的 I/O 函数:`open/read/write/lseek` 与 `fopen/fread/fwrite` 的区别与联系

open():打开一个文件,返回文件描述符(fd)。read():从文件中读取数据到用户缓冲区。write():将用户缓冲区的数据写入文件。lseek():移动文件读写位置。close():关闭文件描述符。这些函数操作的核心是文件描述符(file descriptor),是内核为每个打开的文件分配的一个整数索引。这些函数操作的核心是FILE 指针一个文件描述符(来自系统调用)一个用户态缓冲区文件读写位置、状态标志等函数刷新层级参数类型说明fflush()

2025-10-12 21:21:54 772

原创 Linux碎碎念:网络抓包利器:tcpdump 使用与分析入门

tcpdump是 Linux/Unix 系统上最常用的网络抓包工具之一。它能够捕获经过指定网络接口的数据包,并以人类可读的方式显示,或者保存为文件(pcap 格式),方便后续分析。相比 Wireshark 这种图形化工具,tcpdump更轻量级,适合在服务器或嵌入式设备上使用。

2025-10-12 20:40:23 325

原创 C++ Qt 基础教程:信号与槽机制详解及 QPushButton 实战

信号与槽是 Qt 对象间通信的机制,用于替代传统的事件回调函数。类型安全:编译器会检查参数类型松耦合:发送者不需要知道接收者是谁可复用:一个信号可连接多个槽,一个槽可响应多个信号// 在自定义类头文件中Q_OBJECTpublic:signals:// 自定义信号// 在主窗口类中});信号与槽机制是 Qt 框架的灵魂,它不仅简化了事件处理,还提供了强大的灵活性。理解信号与槽的基本原理掌握 QPushButton 的多种连接方式熟练创建和使用自定义信号与槽。

2025-07-05 17:14:46 704

原创 C++ 基础进阶必备!解锁 STL 宝藏库,深度剖析提升编程效率秘籍

STL 是 C++ 标准库的重要组成部分,它包含了六大组件:容器(Containers)、算法(Algorithms)、迭代器(Iterators)、仿函数(Functors)、适配器(Adapters)和空间配置器(Allocators)。其中,容器是用于存储数据的对象,算法是对数据进行操作的方法,迭代器则用于在容器和算法之间建立联系。STL 是 C++ 编程中不可或缺的工具,它提供了丰富的容器、算法和迭代器等组件,使得开发者能够更加高效地编写代码。通过本文的介绍,我们对vectorlistset和。

2025-06-22 20:35:27 731

原创 C++ 友元:打破封装边界的“特殊权限”

在 C++ 的面向对象编程中,封装(Encapsulation)是三大核心特性之一,它通过将数据和操作数据的函数绑定在一起,并限制外部对内部数据的直接访问,来保证数据的安全性和程序的健壮性。然而,在某些情况下,我们需要在不破坏封装性的前提下,允许特定的外部类或函数访问类的私有(private)或保护(protected)成员。这时,C++ 提供的友元(Friend)机制就派上了用场。友元是 C++ 中一种特殊的机制,它允许一个类或函数访问另一个类的私有成员和保护成员。

2025-06-22 20:34:39 644 1

原创 C++ 基础进阶必备!解锁 STL 宝藏库,深度剖析提升编程效率秘籍

在 C++ 的编程世界里,标准模板库(STL)无疑是一座巨大的宝藏。它为开发者提供了一套高效、通用且可重用的组件,极大地提升了开发效率和代码质量。今天,就让我们一同深入探索 STL 的核心内容,包括容器、vectorlistset和map等。STL 是 C++ 标准库的重要组成部分,它包含了六大组件:容器(Containers)、算法(Algorithms)、迭代器(Iterators)、仿函数(Functors)、适配器(Adapters)和空间配置器(Allocators)。

2025-06-22 18:12:57 963

原创 C++ 基础进阶必看!深度解锁 C++ 模板,开启高效编程新姿势

模板是 C++ 提供的一种机制,它允许我们编写与类型无关的代码。在传统的 C++ 编程中,当我们需要为不同的数据类型编写功能相似的代码时,往往需要重复编写多份几乎相同的代码,只是数据类型不同。这不仅增加了代码量,还使得代码的维护变得困难。而模板的出现,完美地解决了这个问题。模板可以分为函数模板和类模板,它们的核心思想都是将类型作为参数,使得代码能够在编译时根据实际使用的类型生成对应的函数或类。C++ 模板是一项非常强大的特性,它通过将类型作为参数,使得代码能够更加通用和灵活。

2025-06-22 16:20:18 262

原创 C++ 进阶:深入理解虚函数、继承与多态

在 C++ 的面向对象编程中,继承和多态是两个核心概念。今天我们将深入探讨 C++ 中与多态密切相关的几个重要特性:虚函数、virtual关键字、override关键字、多重继承以及虚继承。这些内容是理解 C++ 多态机制和复杂类层次结构的关键。虚函数和virtual关键字:实现运行时多态,通过虚函数表实现函数调用。override关键字:明确表示重写基类虚函数,提高代码可读性和防止拼写错误。多重继承:允许派生类同时继承多个基类,但可能带来菱形继承和命名冲突问题。虚继承。

2025-06-18 22:17:55 647

原创 C++基础学习:深入理解类中的构造函数、析构函数、this指针与new关键字

在C++面向对象编程中,类是构建复杂程序的基本单元。今天,我们将深入探讨类中的几个核心概念:构造函数、析构函数、this指针以及new关键字。这些概念对于理解C++对象生命周期和内存管理至关重要。构造函数、析构函数、this指针和new关键字是C++面向对象编程中的核心概念。构造函数用于初始化对象,析构函数用于清理对象,this指针用于在类内部访问对象成员,而new关键字用于在堆上动态分配内存。理解这些概念对于编写高效、可靠的C++程序至关重要。

2025-06-10 23:01:16 395

原创 解决GIT问题:git@gitee.com: Permission denied (publickey).fatal: Could not read from remote repository.

最常见的原因就是公钥没有配置或者配置不正确。你可以按照上述步骤生成SSH密钥,然后添加到Git服务器,这样通常就能解决问题。要是问题依旧存在,建议联系Git服务器管理员,确认账户权限或者服务器配置情况。

2025-06-10 14:14:31 776

原创 C++ 类基础:封装、继承、多态与多线程模板实现

C++ 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C++ 的关键。本文将深入探讨 C++ 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类继承实现一个简单的多线程开发模板。C++ 类提供了封装、继承和多态等强大的面向对象特性,使得代码更加模块化、可重用和易于维护。合理使用类中的权限控制可以有效地保护数据的安全性和完整性。通过类继承实现多线程开发模板,可以方便地创建和管理多个线程,提高程序的并发性能。

2025-06-09 21:40:26 1011

原创 C++基础进阶:函数、内联函数与Lambda函数详解

for_each 常用于遍历容器并对每个元素应用特定的函数或函数对象。模板参数:InputIterator:输入迭代器类型,表示要遍历的范围。Function:可调用对象类型,用于对每个元素执行操作。参数说明:first,last:输入范围的起始和结束迭代器,遍历范围为 [first, last)。f:函数或函数对象,对每个元素执行的操作。返回值:返回传入的函数对象 f,其可能被修改过(例如,包含了累积的状态)。

2025-06-08 18:49:35 605

原创 C++基础入门必看!命名空间、输入输出、变量类型与流程控制全解析

掌握这些概念是学习C++编程的第一步,它们为后续学习更复杂的C++特性(如面向对象编程、模板、异常处理等)打下了坚实的基础。C++是一种功能强大且广泛使用的编程语言,它结合了C语言的高效性和面向对象编程的灵活性。这些概念是学习C++编程的基石,掌握它们对于进一步学习C++至关重要。是C++中用于组织代码的一种机制,它可以避免名称冲突,特别是在大型项目中。通过使用命名空间,我们可以将相关的类、函数和变量封装在一起,提高代码的可读性和可维护性。在这个例子中,我们声明了四种不同类型的变量,并分别给它们赋了初值。

2025-06-08 17:01:53 171

原创 Makefile学习笔记二:Makefile函数精讲,让构建系统更智能的10个技巧

在上一篇文章中,我们介绍了Makefile的基本语法和核心概念。今天我们将深入探讨Makefile中那些强大而实用的函数,这些函数能够帮助我们更高效地管理构建过程。Makefile函数为我们提供了强大的工具集,能够高效地处理文件名、字符串和列表操作。熟练掌握这些函数可以显著提高Makefile的编写效率和可维护性。在实际项目中,建议根据具体需求选择合适的函数组合,并注意代码的可读性和可维护性。

2025-06-07 13:55:45 463

原创 Makefile基础入门:从编译小白到自动化构建达人

效率提升:减少90%以上的重复编译时间代码维护:集中管理编译配置跨平台:配合Autotools实现一键构建工程化:百万行代码项目的构建基石掌握Makefile不仅是掌握一个工具,更是理解软件构建的艺术。从手动敲命令到自动化构建的进化,正是程序员从"刀耕火种"到"工业化生产"的蜕变之路。自动依赖生成(-MMD选项)条件编译与平台适配结合CMake/Autotools构建系统现在,打开你的编辑器,为下一个项目编写第一个Makefile吧!

2025-06-04 16:32:20 490

原创 Linux中的守护进程:默默守护系统的无名英雄

在Linux系统中,守护进程(Daemon)是一种在后台运行的特殊进程,它不依赖于终端控制,通常用来执行系统级任务或服务。守护进程的名字来源于古希腊神话中的"守护精灵"(daemon)概念,正如其名,它们默默地在后台工作,维持着系统的正常运行。脱离终端控制,在后台运行生命周期通常很长,从系统启动到关闭通常以root权限运行没有控制终端,不会接收终端信号守护进程是Linux系统的基石,它们默默无闻地执行着各种关键任务。

2025-05-30 14:06:48 765

原创 Git紧急救援手册:遇到这些情况时别慌,这样做就对了!

Git虽然强大,但遇到问题时确实容易让人困惑。掌握这些常见场景的解决方案,能让你在遇到问题时从容应对。记住,Git几乎总能让你"回到过去",所以大胆尝试吧!小技巧:遇到不确定的操作前,可以先创建一个临时分支作为备份,这样即使操作失误也能轻松恢复。希望这篇指南能成为你Git旅途中的实用手册!遇到问题时不妨回来查阅,相信总能找到解决方案。

2025-05-13 16:07:29 251

原创 万物互联时代:ONVIF协议如何重构安防监控系统架构

ONVIF(Open Network Video Interface Forum,开放式网络视频接口论坛)是一种全球性的开放行业标准,由安讯士(AXIS)、博世(BOSCH)和索尼(SONY)于2008年共同发起,旨在解决不同品牌网络视频设备(如摄像头、录像设备等)的互通性问题。通过定义统一的接口和通信规范,ONVIF协议实现了设备发现、实时视频流传输、设备控制等功能,成为安防监控领域的主流标准。核心作用与优势互通性:打破厂商壁垒,支持跨品牌设备集成。灵活性:用户可自由选择设备,构建定制化监控方案。

2025-05-09 00:04:18 2346

原创 手把手教你玩转MPU6050:STM32F103C8T6直接驱动姿态传感器!

在嵌入式开发中,姿态传感器是一个非常有用的组件,而MPU6050作为一款集成了3轴陀螺仪和3轴加速度计的6DOF传感器,因其性价比高、使用简单而广受欢迎。今天,我将带大家从零开始,使用STM32F103C8T6直接驱动MPU6050,全程使用HAL库。3轴陀螺仪(量程可调:±250°/s、±500°/s、±1000°/s、±2000°/s)3轴加速度计(量程可调:±2g、±4g、±8g、±16g)内置数字运动处理器(DMP)I2C数字接口。

2025-04-26 18:06:33 2232

原创 深入解析CAN协议3:STM32驱动CAN总线通信详解

STM32系列微控制器内置的CAN控制器(

2025-04-13 14:07:39 1669

原创 深入解析CAN协议2:CAN协议层深度剖析,数据帧、仲裁与时序的精密设计

数据帧由7段组成。数据帧又分为标准帧(CAN2.0A)和扩展帧(CAN2.0B),主要体现在仲裁段和控制段。帧起始(Frame Start):功能:表示数据帧的开始。特点:由一个显性位(Dominant Bit)构成,此时CAN_H为高电平(如3.5V),CAN_L为低电平(如1.5V),二者之间的电位差形成信号。仲裁段(Arbitration Field):功能:确定发送优先级,并包含标识符(Identifier)用于唯一标识发送者和接收者之间的通信关系。

2025-04-12 10:36:03 1214

原创 深入解析CAN协议1:从核心原理到物理层设计(CAN物理层介绍)

CAN是一种多主(Multi-Master)串行通信协议,由德国博世公司于1983年开发,最初用于解决汽车中复杂线束问题。其核心设计思想是通过非破坏性仲裁机制实现高效通信,确保多个节点可同时竞争总线而不会丢失数据。低速CAN(ISO11519)通信速率 10~125Kbps,总线长度可达 1000 米。高速CAN(ISO11898)通信速率 125Kbps~1Mbps,总线长度 ≤40 米。下图为CAN 的连接示意图。

2025-04-11 14:05:47 1159

原创 掌握STM32低功耗开发!HAL库实战指南,让你的项目续航翻倍

STM32系列提供了三种主要低功耗模式,满足不同场景的能耗需求:上电后默认是在运行模式,当内核不需要继续运行时,可以选择后面三种低功耗模式。

2025-04-09 15:55:58 1816

原创 从0到1:STM32 RTC定时器配置全流程

独立于主系统时钟(即使MCU进入低功耗模式仍可运行)提供日历功能(年/月/日/时/分/秒/亚秒)支持闹钟中断和周期性唤醒由备用电池供电(VBAT引脚),主电源断开后仍可保持计时20位的可编程预分频器,可适配不同频率的输入时钟。可选择三种RTC时钟源:HSE时钟除以128(通常为8MHz/128)LSE振荡器时钟(通常为32.768KHz)LSI振荡器时钟(40KHz)

2025-04-08 15:43:03 1467 1

原创 解锁STM32F103C8T6新技能:BKP备份寄存器背后的惊人用途!

BKP(Backup Register)是STM32系列中一组特殊的寄存器,用于在系统掉电或重启时保存关键数据。掉电保持:通过VBAT引脚供电(需外接电池),数据在系统断电后仍能保留。独立时钟域:与RTC共用低速时钟(LSE/LSI),支持低功耗模式。侵入检测:可配置硬件触发事件清除BKP数据(防篡改)。10个16位备份寄存器(BKP_DR1 ~ BKP_DR10)1个侵入检测引脚(PC13)BKP框图。

2025-04-07 11:33:35 571

原创 基于STM32的智能门禁系统设计与实现

在物联网技术快速发展的今天,传统门锁正在向智能化方向演进。密码输入与验证(4x3矩阵键盘)用户信息存储管理(W25Q128 Flash)实时状态显示(0.96寸OLED)电磁锁控制(继电器+5V电磁锁)声光提示反馈(无源蜂鸣器)系统异常报警功能本文详细介绍了基于STM32F103C8T6的智能门禁系统设计方案。系统整合了多种常用外设模块,实现了完整的门禁控制功能。开发者可根据实际需求调整密码策略、存储容量等参数,具体实现代码可根据硬件连接关系进行适配开发。

2025-04-05 15:39:29 1679

原创 嵌入式入门必学:STM32矩阵键盘驱动从0到1实战指南

本方案可扩展至各类STM32系列芯片,通过修改GPIO定义即可适配不同封装型号。结合LCD显示模块可构建完整的人机交互系统,适用于工业控制器、智能仪表等场景。4x3矩阵键盘由12个按键组成,采用行(ROW)列(COL)交叉布局。通过行线输出扫描信号,列线检测输入状态,相比独立按键可节省7个IO口资源。完整工程代码可在Gitee获取:https://gitee.com/bad-lemon/mcu-development-record.git。

2025-04-04 12:13:31 599

原创 深入浅出SPI通信协议与STM32实战应用(W25Q128驱动)(实战部分)

W25Q128是Winbond推出的128M-bit(16MB)SPI接口Flash存储器,支持标准SPI、Dual-SPI和Quad-SPI模式。工作电压:2.7V~3.6V分页结构:256页/块,每块16KB,共1024块支持页编程(256字节/页)擦除操作支持:扇区擦除(4KB)、块擦除(32/64KB)、全片擦除最高104MHz时钟频率超过10万次擦写周期。

2025-04-02 11:46:43 2591 1

原创 深入浅出SPI通信协议与STM32实战应用(W25Q128驱动)(理论部分)

SPI(Serial Peripheral Interface)是电子设备间常用的同步串行通信协议,凭借其高速、全双工的特点,广泛应用于存储器、传感器等外设的通信。

2025-03-28 15:16:08 1176

STM32F103C8T6的HAL库模板

STM32F103C8T6的HAL库模板

2025-03-18

OLED-显示屏字模工具

液晶显示模块字模工具

2024-12-13

WiringPi-源码

WiringPi源码

2024-12-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除