- 博客(13)
- 收藏
- 关注
原创 【学习笔记】Cortex-M 单片机:从编译链接到芯片复位:
STM32程序构建始于PC端的预处理、编译、汇编与链接,链接器依据.sct或.ld脚本确定内存布局,生成ELF/AXF文件并输出初始化信息。经镜像转换后烧录至Flash。复位时,硬件从向量表加载MSP和Reset_Handler,执行早期初始化;随后CRuntime将.data从Flash复制到RAM,清零.bss,建立C运行环境,最终进入main(),完成外设与应用初始化。核心在于:链接器规划地址,硬件建立入口,CRuntime构建运行环境。关键机制包括LMA/VMA分离、数据搬运与零初始化,确保C语言语
2026-11-05 18:38:20
150
原创 【学习笔记】ARM Cortex-M3/M4:存储器映射、向量表重定位与复位流程
本文详解STM32微控制器的存储器映射与内存布局,涵盖代码、数据、堆栈及外设区域划分。重点解析向量表结构、重定位机制(VTOR)及其应用,包括BootLoader、RAM执行与动态中断修改场景。阐述复位类型及启动流程:硬件自动加载MSP与复位向量,进入Reset_Handler完成初始化。强调向量表对齐要求与多向量表应用场景,为嵌入式系统开发提供底层支持。
2026-11-04 22:45:19
235
原创 【学习笔记】ARM Cortex-M3/M4:架构特性、工作模式与寄存器模型
本文系统梳理《ARM Cortex-M3/M4权威指南》核心架构,深化对处理器运行逻辑的理解。基于32位RISC、三级流水线与哈佛总线架构,详解寄存器分工(如R0-R12 AAPCS规范)、双栈机制(MSP/PSP)、异常处理模式切换及权限控制(CONTROL寄存器)。重点剖析堆栈“满递减”特性、四字节对齐要求与异常返回机制,揭示底层执行细节与工程实践关键点,实现从表层认知到深层架构的跃迁。
2026-11-03 15:35:08
316
原创 【学习笔记】 STM32 的 CMake 构建系统
本文以STM32F103裸机工程为例,详解CMake全流程:通过cmake -Bbuild -G Ninja配置阶段生成build.ninja,再用cmake --build build构建,最终产出.elf、.hex、.bin和.map文件。核心在于顶层创建空目标,各子目录通过target_sources和target_include_directories挂载代码与头文件,工具链文件(如cortex_m3.cmake)定义交叉编译参数,结合-ffunction-sections、-fdata-secti
2026-09-19 21:22:36
356
原创 【学习笔记】STM32 移植 SFUD
摘要: SFUD(Serial Flash Universal Driver)是一款基于JEDEC SFDP标准的SPI NOR Flash通用驱动库,支持自动识别芯片参数(容量、页大小、擦除粒度等),适配多厂家芯片(如W25Q、GD25Q等)。移植仅需实现SPI收发接口(spi_write_read)和注册设备表(sfud_cfg.h),核心识别机制包括:1)通过SFDP参数表自动获取芯片信息;2)内置芯片表兜底(无SFDP的老芯片);3)手动指定参数(极端情况)。本文以STM32 HAL驱动W25Q12
2026-07-15 23:45:44
390
原创 【学习笔记】Bootloader 入门实现
本文介绍了STM32F407芯片上实现最简Bootloader的核心原理与代码实现。Bootloader位于0x08000000,APP位于0x08020000,关键操作包含: 中断向量表机制:前4字节为初始栈指针,随后4字节为复位向量地址,硬件自动加载执行 跳转与VTOR区别:跳转通过设置MSP和PC实现程序转移,VTOR用于重定位中断处理函数地址 关键步骤: Bootloader校验APP起始地址有效性 读取APP的MSP和复位向量 设置MSP并跳转到APP入口 APP初始化时需重设VTOR指向自身中断
2026-07-12 18:10:43
194
原创 【学习笔记】STM32内存分布 + 启动流程 + RTOS切换
本文深入解析STM32F407ZGT6的MCU内存架构与启动流程。核心内容包括:1. 内存分布:详细分析SRAM1/SRAM2/CCMRAM区域特性,CCMRAM作为CPU专用内存的零等待优势及DMA访问限制;2. 编译原理:阐述Keil与GCC编译器术语对应关系,解析Code/RO-data/RW-data/ZI-data的存储位置与运行状态;3. 启动流程:完整梳理从BootROM引导到用户main()的执行路径,包括时钟配置、段初始化和C环境搭建;4. FreeRTOS内存布局:对比动态/静态任务分配
2026-07-11 16:21:53
449
原创 【学习笔记】串口DMA接收+环形缓冲区
本文介绍了在STM32串口DMA接收数据时遇到的三大问题:数据覆盖、接收长度不确定和处理不及时。通过引入环形缓冲区作为中间层,实现了DMA(生产者)与应用层(消费者)的解耦。文章详细阐述了环形缓冲区的实现原理,包括数据结构设计、初始化和读写操作,重点讲解了如何通过虚拟头指针跟踪DMA写入位置,并与环形缓冲区配合使用。最终方案有效解决了数据丢失问题,使系统更加稳定可靠。核心思想是利用环形缓冲区的先进先出特性实现零拷贝数据传输,通过取模运算实现环形管理。该方案已在实际项目中验证稳定性,完整代码包含环形缓冲区模块
2026-06-21 19:55:46
335
原创 移植EasyLogger到STM32
EasyLogger嵌入式日志库移植指南 EasyLogger是一款专为嵌入式设计的超轻量级C日志库,核心特点包括代码精简、资源占用低、支持多级日志过滤和多种输出方式。移植到STM32平台的关键步骤如下: 源码结构:只需修改elog_cfg.h(功能配置)和elog_port.c(硬件适配层)两个文件。 配置要点: 必须关闭异步模式、缓冲模式和ANSI颜色功能 推荐ERROR/WARN级别输出完整信息,INFO/DEBUG级别精简输出 移植核心: 在elog_port_output()中实现硬件输出(如HA
2026-06-03 18:35:14
355
原创 【学习笔记】Cortex-M :寄存器、双堆栈与权限架构全解析【附动画演示】
本文介绍了Cortex-M处理器的编程模型与寄存器机制,重点分析了其核心组成部分:16个32位通用寄存器的调用约定与保护规则(R0-R12)、特殊功能寄存器(PC/LR/xPSR)的作用、双堆栈指针设计(MSP/PSP)及其应用场景。文章详细阐述了寄存器在函数调用和任务切换时的栈帧变化规律,特别说明了xPSR状态寄存器的组成与异常处理机制。同时解析了Cortex-M的两种操作模式(线程/处理模式)和访问等级(特权/非特权级)的权限控制机制,以及通过CONTROL寄存器实现的安全隔离设计。这些硬件特性共同构成
2026-05-30 16:15:15
450
原创 解决正点原子 STM32F4 跨板移植野火工程时的时钟异常问题(附源码分析)
本文分析了STM32F407开发板时钟配置错误导致串口通信异常的问题。不同开发板的外部晶振频率差异(野火25MHz vs 正点原子8MHz)会导致系统时钟计算错误,进而影响串口波特率。解决方法是通过修改固件库中的HSE_VALUE宏定义和PLL_M分频系数(25MHz改为8MHz,25改为8),重新配置系统时钟为168MHz。文章深入解析了标准库中时钟频率的计算逻辑,包括PLL参数配置、总线频率推导过程,并指出串口波特率计算依赖于动态获取的实际时钟频率而非预设值。通过调整这些底层时钟参数,可确保外设正常工作
2026-03-27 22:06:26
420
1
原创 SysTick 深度解析 从内核寄存器到 SysTick_Config
本文详细介绍了基于STM32F407的SysTick定时器原理与应用。SysTick是Cortex-M内核24位递减计数器,时钟源可选HCLK或HCLK/8,通过LOAD寄存器设置计数初值,VAL寄存器实时显示当前值。重点解析了SysTick_Config()函数实现,包括参数校验、寄存器配置和优先级设置。SysTick主要用于操作系统心跳和高精度延时,具有内核级优先级可调、不占用外设定时器等优势。文章还详细说明了各寄存器功能位定义及使用注意事项。
2026-03-24 23:31:57
443
原创 系统时钟配置函数SetSysClock()
本文详细介绍了STM32F407系统时钟配置流程。首先说明系统时钟的三种来源(HSI、HSE、PLL),重点阐述了实际配置顺序与理想顺序的差异:先配置预分频器以保护外设,避免APB1总线超频。详细讲解了通过RCC_CR、RCC_PLLCFGR和RCC_CFGR三个关键寄存器配置HSE时钟、PLL倍频、AHB/APB分频器的具体步骤,包括等待就绪判断、FLASH等待周期设置等关键操作。最后总结了完整的时钟配置流程,包括HSE启用、预分频设置、PLL参数配置、时钟切换等关键环节。
2026-03-22 22:45:02
363
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅