自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 看门狗(Watchdog)—— MCU 可靠性机制

Watchdog Timer (WDT) 是 MCU 内部的一个计数器,周期递减。主程序需周期性重装载计数器,否则超时产生复位或中断。

2025-11-27 17:31:15 876

原创 DMA 原理与应用详解

优先级类型决定方式软件优先级DMA_CCRx 寄存器设置硬件优先级软件优先级相同时通道号决定控制器优先级DMA1 高于 DMA2。

2025-11-27 16:34:37 1719

原创 存储器与 Flash

Flash 是一种,断电后数据不会丢失。:掉电保持数据。:擦除以扇区或块为单位。:只能 1→0,不能 0→1;若需写 0→1 必须先擦除。:无机械结构。:写入需经历擦除/编程过程。

2025-11-27 14:30:43 1004

原创 ADC 工作原理与全面解析

在嵌入式系统中,模拟世界的数据(温度、光照、电压、压力等)必须被转换为数字形式,才能由 MCU 处理。这项关键工作由。

2025-11-27 11:20:47 1186

原创 SPI 通讯协议详解

相比于 UART,SPI(Serial Peripheral Interface)是一种同步的数据总线,它使用单独的数据线和时钟信号来保证发送端和接收端的同步。时钟信号告诉接收端在确切时刻采样数据。主机(Master):负责产生时钟信号,一般为 MCU。从机(Slave):接收时钟信号并根据时钟采样数据。SPI 可以支持多个从机,但总是只有一个主机。数据采集时机可以是时钟信号的上升沿或下降沿,具体由 SPI 配置决定。名称说明MISO。

2025-11-26 17:49:13 945

原创 UART 与 USART 通信详解

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种常见的串行通信接口,用于微控制器与外设或其他设备间的数据传输。UART 是异步通信协议,不需要额外的时钟信号,通过起始位和停止位实现同步。USART(Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/异步收发器)是 UART 的扩展版本,既可以做异步通信,也可以做同步通信。

2025-11-26 17:00:52 698

原创 定时器全解析与应用

基本定时器(Basic Timer):如 TIM6、TIM7,用于简单的定时和触发事件。通用定时器(General-Purpose Timer):如 TIM2~TIM5,支持计数、PWM、输入捕获和输出比较功能。高级定时器(Advanced Timer):如 TIM1、TIM8,适用于电机控制,支持死区时间控制和互补输出。即:高级定时器具有捕获/比较通道和互补输出,通用定时器只有捕获/比较通道,基本定时器没有以上两者。定时器是一个独立的计数器单元,通过内部时钟计数,可以产生定时中断或输出信号。

2025-11-26 16:37:15 987

原创 中断系统 —— 中断、NVIC、EXTI 与中断使用

当外部被触发时,首先进入 ICER、ISER 寄存器,用于控制是否开启对应的中断。中断(Interrupt)是 MCU 中最重要的机制之一,它允许 CPU 在执行主程序时,被外设或事件“打断”,去处理紧急任务。你正在写作业(主程序),突然手机来消息(外部事件),你暂停写作业、处理消息,然后再回来继续写作业。当 NVIC 决定该中断可以执行时,会向 CPU 发出中断信号,CPU 自动压栈现场并跳转到对应的中断向量入口执行。只有被 ISER 使能的中断,CPU 才会在中断事件发生时真正执行对应的中断服务函数。

2025-11-26 15:53:57 1022

原创 I2C 协议从基础到读写时序,时钟同步、总线仲裁与恢复机制

I2C 总线上设备分为。

2025-11-26 14:49:39 1202

原创 GPIO(概念 + 原理 + 模式)

GPIO(General Purpose Input/Output)即通用输入输出,是单片机上最常用、最基础、但又最容易被忽略的功能接口。本篇文章将从 GPIO 的内部结构、输入输出模式、推挽与开漏、复用功能等方面全面讲解其工作原理。多设备共享线(线与)——“线与”指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;⚠ 虽然有保护二极管,但不能直接驱动功率器件(如电机、灯带),必须加上驱动器。你可以通过软件让某个引脚输出高电平/低电平,也可以读取外部的高低电平状态。

2025-11-26 14:23:36 1081

原创 Cortex-M MCU 低功耗模式详解:Sleep / Stop / Standby 及唤醒机制

Cortex-M 系列 MCU 提供了多种低功耗模式,以满足不同场景对功耗与响应时间的要求。Cortex-M MCU 内核在不活跃或等待事件时,可以通过进入不同低功耗模式来降低能耗。Stop 和 Standby 模式可能丢失部分寄存器,需要在唤醒时重新初始化关键寄存器。,开发者可以在保证系统实时性和响应速度的前提下,实现 MCU 的能耗最优化。:CPU 执行 WFI 指令后进入 Sleep,任何已配置的中断可唤醒。:CPU 等待事件(Event)唤醒,可配合外设事件触发。设计原则:功耗越低,唤醒延迟越大。

2025-11-25 16:10:43 682

原创 MCU 启动机制:复位向量、BootLoader 启动流程、地址映射与重定位(以 Cortex-M MCU 为例)

在嵌入式系统中,“启动机制”往往是最容易被忽略却极其关键的部分。无论你是在编写 BootLoader、做在线固件升级(OTA)、还是调试无法启动的程序,理解 MCU 的启动流程都至关重要。这篇文章将从启动的根源———开始,逐步讲解 MCU 如何完成初始化、如何进入 BootLoader,再如何跳转到应用程序,并说明与在其中扮演的角色。

2025-11-25 15:30:15 937

原创 MCU 时钟系统全解析:主时钟、PLL、分频与外设时钟门控

主时钟是 MCU 的核心时钟信号,它直接驱动 CPU 内核的运行以及一些关键系统模块。外接晶振或晶体谐振器,精度高(一般 ±20ppm),适合对定时精度要求高的应用,如 UART、SPI、定时器等。,生成 MCU 运行所需的高频时钟信号。通过合理配置主时钟、PLL、分频和外设门控,可以实现稳定高效的 MCU 系统,同时满足低功耗和实时控制的需求。MCU 内部自带的 RC 振荡器,启动快、功耗低,但精度有限,一般 ±1~3%。在低功耗模式下,未使用的外设时钟关闭,可显著降低系统功耗,延长电池寿命。

2025-11-25 14:28:59 1703 1

原创 MCU 内存概览:FLASH、ROM、RAM 与扩展存储类型

FLASH 是 MCU 中最常见的非易失性存储器,断电后数据不丢失,主要用于存储用户固件和代码。RAM(Random Access Memory)是 MCU 中的易失性存储器,用于程序运行时存储临时数据和变量。DRAM 也是 RAM 的一种,但与 SRAM 不同,DRAM 存储单元需要周期性刷新来保持数据,因此访问速度略慢,但容量大、成本低。在嵌入式系统中,MCU 的存储器是系统稳定运行和性能优化的基础。了解不同类型存储器的特性和应用场景,有助于合理设计 MCU 内存布局,提升系统性能与可靠性。

2025-11-25 13:58:11 1004

原创 ARM Cortex-M 系列 MCU:内核、指令、异常与中断解析

(Hard Real-Time):必须在严格的时间限制内完成响应,否则可能导致系统失效(如电机控制、飞行控制)。(Soft Real-Time):允许偶尔延迟,但总体延迟应控制在可接受范围内(如数据采集、音频处理)。低功耗模式(Sleep/Stop/Standby)可与实时任务唤醒机制结合,兼顾功耗和实时性。M0 系列仅支持 Thumb 16-bit 指令,指令简单,适合低功耗、小型控制任务。M3/M4/M7 支持 Thumb-2(16/32 位混合),提升表达能力和执行效率。

2025-11-25 11:38:39 1292

原创 C++ 容器详解:std::list 与 std::forward_list 深入解析

std::list和都是 C++ STL 中的链表容器,用于存储动态大小的元素集合。特性std::list链表类型双向链表单向链表插入/删除效率任意位置 O(1)任意位置 O(1)随机访问不支持不支持内存占用较高(每个节点包含前后指针)较低(仅有后继指针)适用场景需要频繁中间插入/删除内存敏感且仅需单向遍历容器优点缺点适用场景std::list插入/删除高效,支持双向遍历内存占用高,不支持随机访问频繁中间插入/删除占用低,插入/删除高效仅单向遍历。

2025-10-15 11:02:57 907 1

原创 C++ STL 容器 :详解 std::set 与 std::unordered_set

/ 降序排列// 输出 3 2 1operator==(判断两个键是否相等)哈希函数(生成哈希值)int a, b;必须同时定义operator==与哈希函数,否则无法正确区分相同键。int a, b;容器优点缺点典型用途std::set自动排序,稳定迭代器插入删除较慢排序集合、范围查询查找插入快,空间效率高无序,迭代器易失效快速查找、去重操作。

2025-10-15 10:20:27 530

原创 C++ 异常处理机制详解

可以通过继承private:public:throw MyException("值不能为负数");try {std::cerr << "捕获到自定义异常: " << e.what() << std::endl;return 0;通过合理使用trycatch和throw,可以显著提高 C++ 程序的健壮性和可维护性。异常类型匹配:确保异常被正确捕获和处理。RAII 原则:结合智能指针和资源管理类,防止异常导致的资源泄漏。异常安全设计:防止异常引发数据损坏或未定义行为。调试工具。

2025-10-15 10:09:10 515

原创 C++ STL:深入理解 std::map 与 std::unordered_map

我们先定义一个城市信息结构体,用来保存城市的名称、人口和经纬度。同时我们希望可以根据城市对象进行比较和哈希。这里的<stdint.h>提供了uint64_t,表示“64 位无符号整数”,可表示人口等大数值。// 城市名// 人口数量// 纬度// 经度// 用于 std::map 的比较规则// 按人口排序std::map内部需要一个比较规则(默认用我们在这里重载了运算符,使它按照人口大小排序。使用哈希表存储数据,因此必须能把“键”转成一个唯一的数字(哈希值)。

2025-10-14 16:32:03 987

原创 C++ 迭代器(含实战示例)

在 C++ 中,迭代器是一种用于访问容器中元素的“智能指针”。它能以统一的方式遍历不同类型的 STL 容器。可以把迭代器理解为一个“光标”:它指向某个元素;可以向前或向后移动;可以读取或修改当前元素。迭代器是 STL 容器访问的统一接口;它本质上是一个类对象,行为类似智能指针;不同容器的迭代器类型不同;C++11 起可以用auto和范围 for 简化写法;C++17 支持结构化绑定,使代码更简洁。

2025-10-14 10:47:09 658

原创 【C++进阶】从零实现一个支持动态扩容的 Vector 容器(含移动语义与内存管理详解)

相较于Array(静态数组),Vector的最大特点就是动态扩容。我们无需在创建时指定固定容量,可以在运行时以O(1)的摊销复杂度不断地向尾部插入元素,同时仍然保持随机访问的 O(1) 时间复杂度。阶段功能关键技术基础版动态扩容普通new[]Move版高效移动移动语义std::moveEmplace版原地构造最终版完整内存控制+ 手动析构至此,我们完成了一个功能齐全的简易版。

2025-10-13 17:13:35 965

原创 C++手写一个轻量级 Array 数组模板类

特性内存分配栈上堆上大小编译期固定运行期可变初始化自动构造元素自动构造元素性能无动态分配,快动态分配,稍慢适用场景固定容量、高性能动态变化、通用应用当你需要固定大小、高性能、无需扩容的数组时,使用Array是更好的选择;当你需要动态扩容时,使用;Array的实现非常简单,只需掌握模板、constexpr、引用返回即可完成。Array看似简单,但却体现了 C++ 模板、内存管理和类型系统的核心思想。

2025-10-11 18:10:24 638

原创 深入理解C++移动语义、std::move 与移动赋值运算符

操作类型构造方式内存分配效率是否安全释放拷贝构造分配两次慢深拷贝安全移动构造分配一次快接管指针需置空旧对象C++的移动语义让我们在性能与安全之间找到平衡:保留拷贝构造,保证对象可复制;增加移动构造,让对象在“转移所有权”时更高效;通过右值引用和std::move,我们可以精准地控制资源的“复制”与“转移”。你可以精确地掌控内存与资源的生命周期。

2025-10-10 15:59:49 962

原创 C++ 左值与右值详解、 参数求值顺序详解

在 C++ 中,**左值(Lvalue)**指的是在内存中有明确存储位置的对象,可以取地址;**右值(Rvalue)**通常是一个临时值、表达式结果或字面量,没有明确的内存地址。int i = 10;i是左值 —— 它在内存中有位置。10是右值 —— 它只是一个临时的字面量,没有存储空间。你可以把“左值”理解成“可以放在等号左边的东西”,而“右值”只能出现在等号右边。因此10 = i;是错误的,因为右值10没有位置,不能被赋值。类型可绑定示例特点T&左值int& a = x;可修改。

2025-10-10 11:34:53 771

原创 C++内存分配跟踪与 operator new / operator delete 重载详解

函数签名作用是否建议分配内存必须释放内存必须C++17 带大小 delete推荐不抛异常分配可选对齐分配可选(C++17)通过重载我们可以深入了解 C++ 内存分配机制追踪对象分配与释放的来源,甚至扩展成自定义的内存池或分配追踪系统。

2025-10-10 11:20:07 998

原创 C++ 单例模式(Singleton)详解

单例模式的本质是类 + 静态实例 + 静态访问方法,并通过:私有构造函数避免外部实例化。删除拷贝构造与赋值运算符,防止复制。使用局部静态实例,实现延迟初始化和线程安全。虽然完全可以用命名空间实现类似功能,但使用单例类能够更好地组织全局状态,并支持类的特性和面向对象扩展。

2025-10-09 18:25:35 1111

原创 C++17 新特性: std::string_view —— 减少内存分配,让std::string运行得更快

问题根源拥有自己的内存,每次构造或substr()都会分配内存。验证方法:重载可以统计堆内存分配次数。解决方案提供对已有字符串的只读窗口,避免不必要的分配。最佳实践函数参数尽量使用,减少隐式构造。静态字符串使用可做到零分配。避免频繁使用substr(),用截取子串更高效。通过这种方式,我们不仅写出可读性强的代码,也显著减少了内存分配开销,提升程序性能。

2025-10-09 17:03:03 512

原创 C++17 新特性:std::any —— 存放任意类型的容器

std::any的设计目标是让 C++ 拥有类似动态语言的灵活性但它并不是为通用场景准备的万能解法。结论:当你确实无法预知类型时(如反射、通用容器、脚本接口),使用std::any。当类型可预测或有限时,优先选择,性能更高、类型更安全。

2025-10-09 15:56:41 495

原创 C++17 新特性:std::variant —— 类型安全的多类型容器

是 C++17 引入的一个极其强大的类型工具,它本质上是受控的多态,让你能安全、清晰地表达“一个对象可能是几种类型之一”的概念。操作功能定义多类型容器获取指定类型的值(类型不匹配则抛异常)获取指定类型的指针(类型不匹配返回空)v.index()当前存储类型索引对当前存储类型执行函数定义“空状态”类型错误访问异常。

2025-10-09 15:24:01 1202

原创 C++17 新特性:std::optional —— 优雅处理函数返回

使用 std::optional 具有以下优点:语义清晰,能明确表达“值是否存在”函数接口简洁,无需额外的输出参数使用安全,可以用 value_or 提供默认值与现代 C++ 风格一致,易于维护std::optional<T> 是一个模板类,用来表达“值可能存在,也可能不存在”。它可以替代传统的“返回空对象”或“额外的 bool 参数”。optional 并不是指针,但你可以通过 *data 或 data.value() 访问内部对象。

2025-10-09 14:53:54 787

原创 C++ 类型转换全面解析:从 C 风格到 C++ 风格

隐式转换:编译器自动完成显式转换:C 风格 vs. C++ 四种转换推荐做法:尽量用 C++ 的转换运算符,表达意图、提高可读性记忆口诀→ 安全已知的数值/类/指针转换→ 类型双关(底层危险操作)→ 安全向下转换(RTTI)const_cast→ 移除/添加 const。

2025-09-30 15:57:24 795

原创 C++ 中的类型双关、union 与类型双关:让一块内存有多个“名字”

类型转换→ 创建新对象,值发生转换,安全。类型双关→ 同一内存不同解释,高效但可能 UB。未定义行为原因:对齐、大小不匹配、严格别名规则。调试场景可用实际工程推荐或char*来访问底层内存。union 的本质:所有成员共享同一块内存。常见用途给同一个变量多个“名字”(float ↔ int)。给一组数据多种访问方式(Vector4 ↔ 两个 Vector2)。注意事项匿名 union / 匿名 struct 可以让成员直接暴露,更简洁。

2025-09-30 11:47:53 1009

原创 C++ 标准库排序算法 std::sort 使用详解

有时候我们需要更复杂的排序逻辑,这时可以传入一个自定义比较函数(函数指针、函数对象或 Lambda 表达式)。例如,让数字1// a==1 时排在 b 之后// b==1 时排在 a 之前// 其他情况正常升序});// 输出:2 3 4 5 1注意:比较函数必须返回bool,且要满足严格弱序关系(Strict Weak Ordering),否则结果可能是未定义的。std::sort是 C++ 排序的首选,效率高,接口灵活。默认是升序排序,可以用或自定义比较器实现降序或更复杂的规则。

2025-09-29 18:07:50 657

原创 C++ 多线程入门:std::thread 使用详解。C++11 新特性:std::async 、计时器chrono测量代码时间

线程(Thread)是程序中最小的执行单元。一个程序(进程)中可以有多个线程,它们共享同一个内存空间,但可以同时执行不同的任务。典型应用场景:在后台执行某个耗时操作(下载文件、日志记录等),避免阻塞主线程。提升程序性能,让多个任务并发执行。构建实时响应的应用(游戏、GUI、服务器)。通过,我们可以轻松地让程序同时执行多个任务。启动线程线程循环:通过共享变量s_Finished控制退出。避免高 CPU 占用:用给线程降速。线程同步:用join()等待线程结束,避免野线程。chrono。

2025-09-29 17:25:21 828

原创 C++ 命名空间(namespace)详解

避免命名冲突:特别是在大型项目和第三方库混用时组织代码结构:把功能相关的类和函数分组支持模块化和嵌套:便于管理复杂项目类本身就是命名空间:封装成员变量和函数,提供访问控制。

2025-09-29 15:48:07 606

原创 C++ 函数指针、回调与 Lambda 全解析

在学习 C++ 的过程中,函数指针常常让人觉得“古老又晦涩”。这样,我们就可以在运行时决定到底调用哪个函数,从而让代码更灵活。本文会结合实例代码,从函数指针讲到 Lambda 和,最后总结适用场景。

2025-09-29 15:03:54 607

原创 C++ 模板(Template)基础与应用、auto的使用方式

模板是 C++ 泛型编程的核心工具,它可以在编译期生成类型安全且高效的代码,减少重复、提高代码复用性,同时保持高性能。

2025-09-28 18:09:26 270

原创 C++ 多返回值的几种实现方式与结构化绑定

C++实现多返回值的方法对比:1)引用参数高效但调用不直观;2)数组/指针不安全;3)std::array/vector适合同类型数据;4)tuple支持不同类型但访问不便;5)pair适用于两个值;6)自定义struct最清晰可扩展。推荐:小型函数用pair/tuple,工程开发首选struct,兼顾可读性和维护性。每种方案各有优劣,应根据具体场景选择。

2025-09-28 17:17:20 502

原创 C++中 std::vector (动态数组容器)、std::array(静态数组封装)深入解析

是连续内存数组,size 和 capacity 分开管理push_back会触发扩容和拷贝,性能可能下降reserve()→ 减少扩容次数→ 避免临时对象拷贝遍历尽量使用引用传参用const引用通过这些优化,vector可以在保证简洁代码的同时,接近手写数组的性能。

2025-09-28 15:56:04 403

原创 C++ 中的箭头操作符、智能指针重载、浅拷贝与深拷贝解析

>是指针访问成员的语法糖,等价于(*ptr).成员自定义智能指针可以重载operator->,实现类似原生指针的语法空指针可以用来计算类成员在内存中的偏移量nullptr安全、类型明确,推荐代替传统的0作为空指针浅拷贝:只复制指针值,多对象共享同一内存,容易导致重复释放问题。深拷贝:复制指针指向的内容,为每个对象分配独立的内存。拷贝构造函数:编译器会默认生成,但通常在涉及动态内存时必须自己写。禁止拷贝:可以用= delete明确禁止对象复制。传参/返回值:优先使用const &,避免不必要的复制。

2025-09-28 10:53:02 1325

Linux-迷你在线商城

Linux-迷你在线商城

2025-03-13

空空如也

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

TA关注的人

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