- 博客(30)
- 收藏
- 关注
原创 Easylogger 与 SEGGER_RTT 结合使用
本文介绍了Easylogger轻量级嵌入式日志库的移植与配置方法。主要内容包括:1. 初始化设置:通过elog_init()初始化日志库,配置串口重定向和RTT输出;2. 核心配置项:详细解析了日志级别控制(ELOG_OUTPUT_LVL)、缓冲区大小(ELOG_LINE_BUF_SIZE)、断言功能(ELOG_ASSERT_ENABLE)等关键参数;3. 高级功能:介绍了彩色日志输出、异步模式(ELOG_ASYNC_OUTPUT_ENABLE)和缓冲模式的实现原理及适用场景。该日志库支持灵活配置,可根据嵌
2026-01-12 22:07:08
1009
原创 典型的全控型器件
本文摘要:GTO晶闸管通过门极负脉冲关断,具有快速开关特性但关断增益低(βoff≈5)。GTR采用共发射极接法,需避免二次击穿损坏,工作时应快速通过放大区。电力MOSFET采用垂直导电结构,通态电阻具有正温度系数。IGBT结合GTR与MOSFET优点,具有电压驱动、开关速度适中等特点。文中对比了IGBT、GTR、GTO和MOSFET的主要特性差异。
2025-12-18 21:54:08
947
原创 电力电子器件基础
本文介绍了电力电子器件的分类和工作原理。器件按驱动信号可分为电流驱动型和电压驱动型;按导电载流子可分为双极型、单极型和复合型。重点分析了电力二极管和晶闸管的特性:电力二极管通过电导调制效应实现导通,晶闸管则需门极触发且无法控制关断。文章还介绍了各类派生器件的特点,包括快速晶闸管、双向晶闸管等。这些器件在电力电子应用中具有不同的电压电流特性和开关速度。
2025-12-18 21:04:12
1564
原创 系统初学者必看!手把手教STM32F4系列芯片Freertos实现DMA并发解包ADC
本文详细介绍了基于STM32的ADC与DMA配置及使用流程。主要内容包括:1)CubeMX中ADC和DMA的配置原理,重点解析了SAR型ADC的工作特性;2)DMA传输机制的实现,通过HAL_ADC_Start_DMA()函数启动数据传输;3)FreeRTOS环境下双缓冲区的设计,利用任务通知机制实现ADC数据的循环采集;4)创建独立线程完成数据解包处理。文中提供了完整的代码实现,包括缓冲区管理、中断回调处理、队列通信等关键环节,并强调了配置参数对ADC精度的影响。该方案实现了高效稳定的数据采集处理流程,适
2025-12-16 11:34:58
1129
原创 Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据(五)
本文基于STM32F4芯片,通过FreeRTOS实现了ADC数据的DMA传输功能。主要内容包括: 使用STM32CubeMX配置DMA和ADC模块 创建双缓冲机制(buffer1和buffer2)交替接收ADC数据 通过消息队列实现任务间通信 利用HAL_ADC_ConvCpltCallback中断回调函数触发数据处理 使用标志位DMA_point实现缓冲区的自动切换 系统实现了ADC数据的连续采集与处理,通过FreeRTOS任务和中断机制确保了数据传输的实时性。文中详细介绍了DMA配置原理、API接口使用
2025-12-15 22:35:56
538
原创 Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据(四)
本文基于FreeRTOS实现STM32F4芯片的DMA方式ADC数据采集与传输。主要内容包括:1) 通过STM32CubeMX配置ADC和DMA;2) 创建FreeRTOS队列用于任务间通信;3) 在ADC转换完成中断中使用xQueueSendFromISR()安全发送数据;4) 任务优先级切换机制分析,强调PendSV中断的重要性;5) 详细代码实现,包括缓冲分配、队列创建、ADC启动及数据接收处理。重点解决了中断环境下队列发送的任务切换问题,并展示了完整的DMA+ADC数据采集方案。
2025-12-15 21:33:37
748
原创 Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据(三)
摘要:本文基于FreeRTOS系统,详细讲解了STM32F4芯片通过DMA发送ADC数据的实现过程。主要内容包括:1)使用STM32CubeMX配置DMA和ADC模块;2)在FreeRTOS任务中创建双缓冲区存储ADC数据;3)实现队列通信机制,包含队列创建、发送和接收操作;4)通过HAL_ADC_Start_DMA启动DMA传输。文章提供了完整的代码示例,重点解析了xQueueSend和xQueueReceive等关键API的使用方法,并展示了队列通信测试结果。
2025-12-14 22:26:02
429
原创 Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据(二)
本文详细介绍了使用STM32CubeMx配置DMA传输ADC数据的方法。主要内容包括:1)启动DMA传输并进入中断的配置流程;2)HAL_ADC_Start_DMA()函数的使用详解,包括参数说明和错误处理;3)DMA传输完成回调函数HAL_ADC_ConvCpltCallback的实现;4)错误处理回调函数HAL_ADC_ErrorCallback的配置。通过代码示例展示了如何在FreeRTOS任务中初始化缓冲区、启动DMA传输,并在中断回调函数中处理采集数据。文章提供了完整的配置思路和关键API的使用方
2025-12-14 21:23:49
990
原创 Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据(一)
本文介绍了基于CubeMx配置SAR型ADC(逐次逼近型ADC)的开发流程。重点讲解了ADC的时钟配置(PCLK2四分频)、数据对齐方式(右对齐)、转换模式选择(单通道/多通道扫描)以及采样周期设置等关键参数。同时说明了如何使用DMA传输数据,并提供了DMA原理的学习资源。在代码实现部分,展示了通过FreeRTOS任务动态分配ADC数据缓冲区,并完成初始化设置的过程。文章为后续启动DMA传输和中断处理奠定了基础,适用于嵌入式系统中ADC数据采集的开发场景。
2025-12-14 17:07:12
1523
原创 理解DMA双缓冲的原理和意义(CPU和DMA:并发并行和回调函数)
本文探讨了计算机系统中并行计算与回调函数的实现原理。文章首先分析了计算单元(CPU、FPU、ADC等)的本质都是门电路组成的计算装置,指出MPU、ETM、DMA等也都具备计算能力。然后通过ADC与CPU、DMA协同工作的例子,解释了并行(同时执行多任务)与并发(短时间内顺序执行多任务)的区别。最后重点讨论了回调函数在两种场景下的应用:1)在DMA并行模式下,通过中断机制通知CPU处理ADC数据;2)在并发模式下,通过信号量机制实现任务间的异步通知和解包操作。回调函数在此过程中起到了任务协调和事件触发的重要作
2025-12-14 16:55:00
771
原创 小白也能看懂!从底层原理深入理解DMA控制器的内部架构图及其构成,加深对DMA的掌控
本文介绍了DMA(直接内存访问)控制器的基本原理和架构。DMA作为AHB总线的主设备,包含8个单向传输的Stream流,每个流有8个通道。文章重点阐述了:1)DMA通过Slave接口接收CPU编程配置;2)Stream流的优先级仲裁机制;3)FIFO的三大作用:减少总线占用、防止溢出和提高并发性;4)Burst传输模式可同时修改多个寄存器。强调了在系统设计中需统筹考虑DMA触发关系与硬件架构的配合。
2025-12-11 19:27:27
1355
原创 STM32CubeMx使用STM32F4系列芯片实现串口DMA接收
本文介绍了STM32中DMA与串口配合实现数据接收的原理及实现方法。通过DMA可以直接将串口接收寄存器中的数据搬运到SRAM,无需CPU干预,提高系统效率。文章详细讲解了DMA请求机制、STM32CubeMX配置步骤(包括时钟设置、串口使能和DMA请求配置),并分析了HAL_UART_Receive_DMA函数的工作原理。最后说明了DMA传输完成后的回调机制,以及如何实现循环接收数据。该方案可显著降低CPU负载,适合需要高效数据接收的应用场景。
2025-12-10 15:52:06
1244
原创 通过STM32CubeMx使用STM32F4系列芯片的DMA中断发送数据翻转GPIO
本文详细讲解了STM32F411 DMA中断配置及使用流程。首先介绍了HAL_DMA_Start_IT()函数实现中断方式DMA传输的原理,包括参数配置、中断标志设置等关键步骤。接着说明需要通过HAL_DMA_RegisterCallback()注册回调函数来处理不同DMA事件,如传输完成(HAL_DMA_XFER_CPLT_CB_ID)。最后给出具体应用实例:在传输完成回调中通过计数器取余方式循环切换GPIO电平,展示了DMA中断在波形控制中的基础应用。文章强调这种技术可扩展用于更复杂的时序控制和硬件初始
2025-12-09 21:38:10
1057
原创 (新手向详解)通过STM32CubeMx使用STM32F411的DMA发送数据翻转GPIO
摘要:本文详细介绍了使用STM32CubeMx配置DMA实现GPIO控制的步骤。主要内容包括:1)通过DMA2配置实现内存到外设(ODR寄存器)的数据传输;2)关键配置项如FIFO模式、数据宽度等参数设置;3)使用HAL_DMA_Start启动传输和HAL_DMA_PollForTransfer监控传输状态;4)解决了直接操作外设时的DMA传输同步问题。实验最终成功通过DMA实现了GPIO电平的翻转控制,相比CPU直接操作提高了效率。
2025-12-09 20:48:39
1272
原创 认识芯片架构图和总线矩阵以及FIFO的作用
比如说现在有一个项目在用I方C读取血氧的数据,然后发送给串口打印, 其完全是用DMA加CPU去做的,但是总还是会遇到总线错误,其原因就是这里所说的总裁区已经满了,但是他没有开启FIFO去缓存数据,导致数据丢失。在高优先级的设备正在访问SRAM的时候,FIFO可以保存DMA(低优先级设备)的数据,等高优先级的设备访问完成后,再把存储的数据读写进去,这样一个小小的缓冲就可以解决在程序设计时遇到的很多麻烦。下面的那条线叫做peripheral,是主要访问外设的。假设ARM的数据比较多,一直在访问不让DMA访问。
2025-12-08 22:35:55
555
原创 DMA初学者必看!帮小白从系统CPU层理解DMA原理
摘要:DMA(直接内存访问)技术通过设立专门的数据传输控制器,解决了CPU在数据搬运过程中的资源浪费问题。传统方式中,CPU需要执行LDR和STR指令来搬运数据,消耗6个机器周期却未使用ALU核心资源。DMA作为总线上的Master设备,能够直接在外设(如ADC、UART)和内存间传输数据,避免了CPU介入。这不仅提高了系统并行处理能力(可同时处理多个外设数据),还显著降低了CPU功耗(CPU仅在数据处理时唤醒)。DMA通过配置源地址、目标地址、传输方向等参数实现自动化数据传输,使CPU能专注于计算任务,大
2025-12-08 17:10:19
2416
原创 日志(Log)的意义
本文介绍了日志(Log)的概念及其重要性。日志是计算机系统和应用程序运行过程中生成的记录性信息,包含时间戳、事件描述等关键数据,用于系统监控、故障排查和性能分析。文章阐述了日志在调试排错、性能监控、安全审计和业务分析等方面的重要作用,特别强调了在嵌入式系统中的特殊应用,包括存储介质选择、格式设计和开源日志库使用。最后推荐了几款开源日志组件,如EasyLogger和uLog等,为开发者提供实用的日志管理工具选择。
2025-12-07 20:13:38
1188
原创 FreeRTOS 任务切换流程
FreeRTOS作为抢占式实时操作系统,其核心任务调度机制基于硬件异常和上下文切换实现。系统通过SysTick定时器中断触发调度,利用PendSV异常完成安全的任务切换。关键点包括:1)每个任务拥有独立栈空间存储寄存器上下文;2)硬件自动保存部分寄存器,软件处理剩余寄存器;3)通过任务控制块管理栈指针;4)优先级抢占式调度确保高优先级任务立即执行。切换过程严格保存和恢复任务上下文,包括程序计数器等关键寄存器,实现任务的无缝切换。这种设计充分利用Cortex-M架构特性,在保证实时性的同时实现高效任务调度。
2025-12-07 17:13:00
1876
原创 sizeof 、strlen 、 typedef 、define
摘要:sizeof是C++/C中获取对象内存大小的运算符,在编译时计算;与strlen的区别在于sizeof包含'\0'而strlen不包含。typedef优于#define定义指针类型,因为typedef具有类型检查和作用域限制,而#define仅是文本替换且作用域全局。typedef更利于代码维护和错误检查。
2025-12-04 22:59:51
454
原创 _基于搭建的FreeRTOS环境实现单击、长按按键控制
本文介绍了状态机在嵌入式系统中的应用,重点以按键驱动为例。状态机由有限状态和状态转移构成,其实现三要素包括当前状态、触发事件和响应结果。状态机适用于通信协议处理、电机控制、用户界面交互(如按键和屏幕显示切换)以及错误处理等场景。文章详细分析了按键状态检测机制,通过时间阈值区分短按和长按,并提供了可复用的API接口设计示例代码。该设计将具体时间参数留给应用层决定,体现了良好的抽象逻辑和模块化思想。
2025-12-03 22:31:16
550
原创 理解函数调用栈并通过栈回溯(stack trace)定位故障点(二)
中断处理过程涉及悬起、延迟和异常处理三个阶段。当外设触发中断请求时,NVIC会将中断悬起并转换为内核异常,CPU响应后进入Handler模式处理。中断延迟指从请求到处理的等待时间。持续/多次中断需区分是否发生在悬起过程中(可能导致丢中断)。异常处理时LR寄存器存储EXC_RETURN值(0xFFFFFFF9使用MSP,0xFFFFFFFD使用PSP),若值异常可能指示堆栈损坏。需结合Keil工具分析具体故障原因。该机制是理解RTOS任务调度的基础。
2025-12-03 15:16:31
380
原创 理解函数调用栈并通过栈回溯(stack trace)定位故障点(一)
本文介绍了嵌入式系统中的关键概念,包括: 寄存器功能:LR寄存器存储返回地址,PC指针指向当前指令,SP指向栈顶; 栈操作原理:栈采用递减地址方式,存储寄存器值和返回地址; 中断机制:区分CPU内部同步异常和外部异步中断,以及通过栈回溯定位hardfault错误; 中断向量表特性:要求地址偏移必须能被0x200整除(512字节对齐); 寄存器映射应用:通过STIR寄存器模拟软件中断进行调试测试。这些概念对嵌入式系统开发和调试具有重要意义。
2025-12-02 21:48:49
478
原创 学习Cortex-M4的函数调用以及压栈过程和原理(一)
1.了解Cortex-M4的函数调用时,栈的运行情况2.了解什么是ABI3.了解什么是AAPCS(ARM Architecture Procedure Call Standard)4.了解什么是满减栈5.了解叶子函数和非叶子函数6.函数的"序言/返场”(Prologue/Epilogue)
2025-12-02 16:31:08
777
原创 C++多态学习(初学者入门)
本文深入讲解了C++多态的概念与实现原理。首先介绍了多态的基本概念:不同对象调用同一函数会产生不同行为。构成多态需要满足虚函数重写和通过父类指针/引用调用虚函数两个条件。文章详细解析了虚函数、虚函数重写(包括协变和析构函数重写两种例外情况)以及C++11的override和final关键字。通过实例代码分析了虚函数表的工作原理,解释了多态的动态绑定机制。最后探讨了单继承和多继承中的虚函数表分布情况,指出菱形继承的复杂性。全文从语法到实现原理,系统性地阐述了多态这一重要面向对象特性的工作机制。
2025-11-29 20:50:46
967
原创 C++模板新手详解(下)
文章摘要:本文探讨了C++模板编程中的关键技巧,重点分析了vector类模拟实现中的resize()函数设计。通过const T& val=T()的巧妙使用,实现了类型安全的默认参数机制,适用于任意类型T。同时介绍了非类型模板参数的使用限制和模板特化技术(全特化/偏特化),并解释了模板代码为何不适合分离编译,推荐将声明和定义放在同一文件中。这些技巧对编写高效、通用的模板类具有重要意义,是现代C++编程中的核心知识点。
2025-11-19 21:57:43
696
原创 C++继承使用详解(下)
摘要:本文讨论了C++中继承与组合两种代码复用方式的区别与选用原则。继承是白箱复用,会破坏父类封装;组合是黑箱复用,耦合度低且维护性好。建议优先使用组合,仅在需要多态或明确is-a关系时使用继承。例如"Car和BMW"是is-a关系适合继承,"Car和Tire"是has-a关系适合组合。当两种关系都符合时,应优先选择组合方式实现代码复用。
2025-11-17 11:26:25
306
原创 C++继承使用详解(上)
本文主要介绍了面向对象程序设计中的继承机制。继承允许派生类复用基类特性并进行功能扩展,形成层次结构。文章详细阐述了继承的定义格式、访问限定符变化、基类与派生类对象转换规则,以及继承中的作用域问题(如成员隐藏)。同时讲解了派生类默认成员函数的生成规则,包括构造、拷贝构造、赋值和析构函数的调用顺序。此外,还探讨了继承与友元关系、静态成员的特性和复杂的菱形继承问题。通过虚拟继承可以解决菱形继承带来的二义性和数据冗余问题,但会带来一定效率损失。文章最后指出应避免过度使用复杂的继承关系。
2025-11-14 20:52:03
771
原创 C++模板新手详解(上)
本文介绍了C++泛型编程中的模板技术。模板允许编写与类型无关的通用代码,通过函数模板和类模板实现代码复用。函数模板在编译时根据实参类型实例化特定函数版本,支持隐式和显式实例化。类模板则用于生成通用的数据结构,如动态数组vector的实现示例。文章重点讲解了模板的定义格式、实例化过程、匹配原则,以及使用注意事项,特别是嵌套依赖类型中typename关键字的应用场景。模板技术将重复工作交给编译器处理,极大提高了代码的灵活性和复用性。
2025-11-13 21:20:23
608
原创 C++内存管理解析(初学者入门学习)
本文摘要: C/C++内存管理包含静态区、栈、堆和代码段的内存分布。C语言通过malloc/calloc/realloc进行动态内存分配,需手动检查返回值并管理内存释放。C++引入new/delete操作符,对内置类型与malloc/free功能类似,但对自定义类型能自动调用构造/析构函数,更安全高效。内存泄漏分为堆内存和系统资源泄漏,可通过智能指针或检测工具预防。operator new/delete是new/delete的底层实现,区别在于失败时抛出异常而非返回NULL。new的原理是operator
2025-11-07 20:54:45
816
原创 类的成员函数
本文介绍了C++类的六个默认成员函数中的四个核心函数:构造函数、析构函数、拷贝构造函数和赋值运算符重载。构造函数用于对象初始化,可重载且自动调用;析构函数完成资源清理,对象销毁时自动执行;拷贝构造函数解决对象复制问题,需使用引用避免递归;赋值运算符重载增强代码可读性,要注意深拷贝问题。重点说明了当类包含指针成员时,必须自定义拷贝构造和赋值运算以防止浅拷贝导致的重复释放问题,体现了"低耦合高内聚"的软件工程原则。文中通过日期类和栈类的示例代码展示了这些成员函数的实现方式及注意事项。
2025-11-06 20:35:24
895
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅