📖 技术文库

STM32 / Arduino / RTOS / 嵌入式 知识文章
展开全部分类 (54)
STM32 HAL库中__weak函数重定义后中断仍进默认死循环的链接脚本排查
嵌入式 · 👁 71 阅读
在STM32 HAL库开发中,用户常通过重定义__weak函数(如HAL_GPIO_EXTI_Callback)来定制中断行为。但有时重定义后中断仍进入默认死循环,根源往往在链接脚本的段放置或符号解析。本文深入剖析__weak机制、链接脚本对弱符号的影响,提供完整排查步骤与代码示例,帮助开发者快速定位并解决此类隐蔽问题。
FreeRTOS下vTaskDelay与硬件定时器混用时任务抖动来源分析与实测对比
嵌入式 · 👁 77 阅读
在STM32+FreeRTOS项目中,常将vTaskDelay与硬件定时器(如TIM)混用实现周期性任务,但实测发现任务周期抖动明显。本文从SysTick优先级、中断延迟、临界区、硬件定时器中断抢占等角度剖析抖动来源,给出配置步骤与完整代码,并通过实测对比纯vTaskDelay、纯硬件定时器触发、混用三种方案的抖动数据,最后总结降低抖动的工程建议。
用DWT周期计数器做us级精确定时,替代定时器资源的实战配置
嵌入式 · 👁 75 阅读
在STM32开发中,定时器资源常被PWM、输入捕获等功能占用,导致无法满足额外的微秒级延时需求。本文介绍利用Cortex-M内核的DWT周期计数器实现高精度us级定时,无需占用硬件定时器,且精度可达CPU周期级。文章涵盖DWT原理、配置步骤、完整代码示例及注意事项,帮助开发者释放定时器资源,提升系统灵活性。
用DWT周期计数器在Cortex-M上做无侵入式函数耗时统计的实操方法
嵌入式 · 👁 66 阅读
函数耗时统计是嵌入式性能优化的第一步,但传统打点法会引入GPIO翻转或定时器读取开销,干扰被测代码。本文介绍如何利用Cortex-M内核自带的DWT周期计数器,实现纳秒级、几乎零开销的函数耗时测量。文章从DWT原理讲起,给出寄存器配置步骤、可复用的宏封装与完整示例代码,并讨论中断干扰、计数器溢出、编译器优化等实战注意事项,适合有一定STM32基础的开发者直接落地。
STM32 HAL库中__weak函数重定义后链接顺序导致行为不一致的排查方法
嵌入式 · 👁 61 阅读
在STM32 HAL库开发中,用户常通过重定义__weak函数(如HAL_InitTick、HAL_UART_RxCpltCallback)来定制行为。但有时重定义后函数并未生效,或在不同工程配置下行为不一致,根源往往是链接顺序与符号解析规则。本文深入剖析__weak机制、链接器符号选择原理,提供系统化的排查步骤、完整代码示例及避坑指南,帮助开发者快速定位并解决此类问题。
STM32 HAL库中HAL_Delay在中断上下文调用的隐性死锁复现与规避方案
嵌入式 · 👁 68 阅读
HAL_Delay依赖SysTick中断更新uwTick,若在中断服务函数中调用,会因抢占优先级导致uwTick停止递增,形成隐性死锁。本文剖析其原理,给出复现步骤与完整代码,并提供基于DWT、定时器或状态机的三种规避方案,帮助开发者规避这一常见陷阱。
STM32 HAL库DMA+空闲中断接收不定长串口数据的环形缓冲区实现与溢出防护
嵌入式 · 👁 63 阅读
串口不定长数据接收是嵌入式开发的高频需求。本文基于STM32 HAL库,利用DMA搬运与USART空闲中断配合环形缓冲区,实现高效、无阻塞的不定长数据接收,并重点讲解缓冲区溢出检测、丢包防护与错误恢复策略。文章包含原理剖析、CubeMX配置步骤、完整可移植代码及实战注意事项,适合有一定HAL库基础的开发者参考。
STM32 DMA+空闲中断接收变长串口帧:彻底解决半包与粘包导致的解析错位
嵌入式 · 👁 82 阅读
串口变长帧接收中,DMA+空闲中断是高效方案,但半包(帧未收完就触发中断)和粘包(多帧连在一起)常导致解析错位。本文深入剖析空闲中断触发机制与DMA传输计数的关系,提出“双缓冲+帧头帧尾校验+超时重同步”的健壮策略,并给出基于STM32 HAL库的完整代码实现,包含环形缓冲区管理、帧提取状态机及错误恢复流程,帮助开发者构建工业级可靠串口通信。
DMA+空闲中断接收ESP32 UART不定长帧时丢首字节的排查与修复
嵌入式 · 👁 78 阅读
本文针对ESP32 UART使用DMA+空闲中断接收不定长帧时首字节丢失的典型问题,从硬件时序、DMA配置和中断处理三个层面剖析原因,给出寄存器级排查步骤与完整修复代码。通过调整DMA触发阈值、优化空闲中断服务程序并增加首字节保护机制,彻底解决丢字节问题,适用于Modbus、自定义协议等场景。
ESP32双核下xTaskCreatePinnedToCore固定任务核后串口打印乱序的定位与解决
嵌入式 · 👁 94 阅读
ESP32双核运行FreeRTOS时,使用xTaskCreatePinnedToCore将任务固定到指定核心可提升实时性,但常导致串口打印乱序。本文分析乱序根源:多核并发访问UART、任务优先级与调度、打印函数非原子性。给出三种解决方案:互斥锁保护、专用打印任务+队列、原子化打印函数。包含完整代码示例与配置步骤,帮助开发者彻底解决乱序问题。
ESP32双核任务看门狗超时:从任务饥饿到TWDT触发路径的逐层定位
嵌入式 · 👁 90 阅读
ESP32双核环境下任务看门狗(TWDT)超时往往并非简单的喂狗遗漏,而是任务饥饿、优先级反转或临界区过长导致的连锁反应。本文从TWDT硬件机制与FreeRTOS调度原理出发,逐层剖析超时触发路径,给出可复现的饥饿场景、配置步骤与完整诊断代码,并总结定位技巧与规避注意事项,帮助开发者快速锁定根因。
STM32 HAL库中__weak函数覆盖机制在中断回调中的实际应用与陷阱
嵌入式 · 👁 119 阅读
本文深入剖析STM32 HAL库中__weak函数覆盖机制在中断回调中的工作原理,通过原理讲解、配置步骤和完整代码示例,展示如何正确重写HAL_UART_RxCpltCallback等回调函数,并揭示常见陷阱:重复定义、未调用HAL_UART_Receive_IT导致中断只触发一次、回调中执行耗时操作等。适合有一定基础的嵌入式开发者阅读,帮助规避实际项目中的坑。