自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 AFE:模拟前端,模拟世界通往 MCU 的信号桥梁

集成 AFE内部集成分压、信号调理电路与 ADC,在芯片内部完成模拟信号到数字信号的转换,之后通过 I2C 或者 SPI 总线把采样数据发送给 MCU;分立方案仅搭建外部模拟调理电路,模数转换依靠 MCU 自带 ADC 实现。在 BMS 系统中,AFE 主要负责电芯电压、NTC 温度采集,是电池状态监测与保护的核心器件。

2026-11-06 08:53:10 135

原创 STM32F4(Cortex-M4)NVIC 中断优先级与中断嵌套

NVIC 中断优先级分为抢占优先级 PreemptPriority子优先级 SubPriority(响应优先级)数字越小,优先级越高,理论取值范围 0~15。统一规则:抢占、子优先级数字越小,优先级越高;功能区分:抢占优先级控制中断嵌套、同时触发时的一级排序;子优先级仅用于「抢占相同」场景的二级排序,无打断能力;兜底逻辑:抢占、子优先级全部相同时,按中断通道号 IRQn 从小到大执行;HAL_Init默认 GROUP4 分组,子优先级完全失效,需要排队逻辑必须切换至 GROUP0/1/2/3;

2026-11-06 08:51:17 405

原创 CPU、内存、虚拟内存、硬盘的关系

器件定位关键特点CPU 能否直接访问CPU运算加工厂负责数据计算、指令执行物理内存工作台 / 中转站速度快、断电丢数据、程序运行区可以硬盘长期仓库容量大、断电保存、速度慢不可以虚拟内存仓库临时暂存区占用硬盘空间,是内存后备不可以。

2026-11-05 10:14:35 435

原创 嵌入式核心处理器类型简述

嵌入式系统的核心计算单元,依据设计定位、硬件资源以及适用场景,主要分为三类,各自拥有明确的设计目标与应用方向。。ALU 只是芯片内部负责加减乘除的一小块运算电路;下面三类是,芯片内部包含内核(CPU 核)、总线、存储器、外设等模块。

2026-11-05 10:08:18 237

原创 电容与电感

二者搭配组成 LC 滤波、LC 谐振电路。电容:电压不能突变;电感:电流不能突变。

2026-11-03 08:50:41 186

原创 STM32F4xx 中断管理机制(IRQ、NVIC、MSI)

片内外设:TIM 定时器、USART 串口、SPI、ADC、DMA 等;外部引脚:GPIO 引脚电平变化,对应 EXTI 外部中断。每一个支持中断的硬件单元,都引出一根专属IRQ Line(中断请求信号线),这条线路硬件直连内核 NVIC 的输入通道。中断两道闸门:外设本地中断开关(控制 IRQ 输出)+ NVIC 通道开关(控制 IRQ 上报 CPU);IRQ(Interrupt Request,中断请求):外设向 NVIC 传输中断事件的信号载体;

2026-11-03 08:50:07 337

原创 枚举为什么可以直接使用

结构体是:对象拥有成员,必须通过对象访问。枚举是:定义一堆独立常量,不需要对象,可以直接使用。

2026-11-02 08:55:22 119

原创 Keil 文件管理避坑(基于 STM32F4 HAL 通用模板讲解)

内部自动包含 GPIO、USART、ADC、TIM、中断、内核等全部驱动声明,无需逐个引用分模块头文件。魔术棒(Options for Target)→ C/C++ → Include Paths,填入。打开 USER/project_demo/keil_project/xxx.uvprojx。路径对应模板磁盘层级,编译器可跨层级检索所有.h 头文件,全局只需引入。直接在 Keil 分组新建文件,文件默认保存到。规则:只添加.c 源文件参与编译,.h 头文件不加入工程列表。根目录,磁盘结构直接混乱。

2026-11-02 08:53:45 437

原创 STM32(F429)启动模式与两种烧录方式

芯片每次上电、硬件复位瞬间,会采样 BOOT0、BOOT1 硬件引脚电平,决定本次开机从哪个内存区域执行代码。为什么有三种启动模式?分别干什么用?J-Link/ST-Link 仿真器下载和串口 FlyMcu 下载到底有什么本质区别?Keil 搭配 J-Link,下载完成后即使仿真器不拔,部分场景下也需要手动按 Reset 才能运行程序?FlyMcu 烧完能直接跑,但重启又失效?

2026-10-29 10:24:24 632

原创 嵌入式避坑:少用枚举顺序匹配 LED 硬件电平

写 LED 驱动时很多人发现一个省事小技巧:C 语言枚举默认从 0 依次赋值,LED 低电平点亮就把LED_ON放第一个(值 0);高电平点亮就调换顺序,让LED_ON等于 1。看似少写转换代码、调试方便,但这套写法只适合临时测试,量产项目、多人协作绝对不能用。下面用通俗直白的逻辑讲清问题和标准写法。靠枚举先后顺序对应 LED 高低电平属于耦合写法,治标不治本;软硬件分层才是嵌入式通用规范,状态归软件、电平归硬件;硬件改版只需修改适配宏,上层逻辑零改动,易维护、不易出隐性 bug;

2026-10-29 08:41:54 92

原创 C 语言!!双感叹号的作用 —— 寄存器按位读取按键场景

按位运算输出原始整数,不是只有 0/1;!!双逻辑非:将任意表达式转换成纯 0 或 1,用于等值判断场景;只用在需要返回数值给外部做 == 相等判断的场合;if/while 条件判断里不需要。!!

2026-10-29 08:38:27 381

原创 AF 寄存器位区间 bit [4n+3 : 4n] (GPIO 复用功能寄存器)

bit [4n+3 : 4n] 由三条规则推导而来:单引脚占用 4bit、引脚 bit 段顺序排布、寄存器位域书写高位在前,是编写 AF 寄存器位掩码操作代码的核心计算依据。

2026-10-27 09:02:37 183

原创 STM32CubeMX 生成keil工程 编译报错 解决方法

报错核心原因:链接脚本.sct指定了FIRST优先排布的段(一般是中断向量表段),链接器在所有目标文件中找不到对应的段,绝大多数场景是导致。

2026-10-27 09:01:54 643

原创 STM32 GPIO ODR 与 BSRR 寄存器完整对比详解

功能:保存当前引脚输出电平,可读可写读:获取端口所有引脚当前输出状态;写:整体覆盖端口电平,修改单引脚必须采用「读 - 改 - 写」流程。→ 引脚 n 输出高;→ 引脚 n 输出低。单引脚操作示例:// 引脚5置高// 引脚3置低操作拆解:读 ODR → 逻辑运算修改指定位 → 写回 ODR,三步总线操作。ODR 不可替代:唯一能读取 GPIO 当前输出电平的寄存器,状态查询场景必须使用;

2026-10-26 10:35:20 445

原创 I2C 与 SPI 完整对比:为何大量场景放弃 I2C 选择 SPI

只要存在大数据量、高速传输、工业干扰、高实时控制需求,即便 SPI 占用更多 IO,也必须选用 SPI;I2C 的速度、容错、抗干扰能力无法满足工况;仅当传输数据极少、速率要求低、MCU 引脚紧张、环境干净时,才选择 I2C 换取硬件简洁性;I2C 的唯一核心竞争力是少引脚低成本,其余性能、稳定性、速率维度 SPI 全面占优,这也是多数高速外设只提供 SPI 接口的根本原因。

2026-10-26 10:34:35 324

原创 从 RAM 内存视角彻底讲清栈 (Stack)、堆 (Heap)

所有不带 malloc 的局部变量,全部占用栈 RAM,系统自动清理;malloc/new申请的数据本体,全部存堆 RAM,必须手动释放;存放堆地址的指针变量,依然存在栈 RAM 里。

2026-10-25 13:22:29 235

原创 串口(UART/USART)帧时序

波特率:单位时间传输的比特数,代表串口通信速率,收发双方波特率必须一致。起始位:1bit,低电平,标记一帧数据开始;总线空闲时默认高电平。数据位:有效传输数据,常见 8bit;低位先行(LSB first),先发 D0,最后发 D7。1 = 高电平,0 = 低电平。校验位:可选(奇校验 / 偶校验),根据数据位计算得到,用于简单检错。停止位:1bit,高电平,标记一帧结束,帧之间的间隔。

2026-10-25 13:21:31 332

原创 串行(Serial)完整解释

串行:数据一位一位,按顺序排队,共用 1 根信号线依次传输对比并行:多根线同时一次性传多位数据。所有比特排队,走同一根信号线依次发送,就是串行。

2026-10-21 09:29:49 151

原创 第二篇:位域解包:寄存器标志位拆分方法

打包负责发送前拼装字节;解包是它的逆操作。我们读传感器、ADC、电源芯片的寄存器时,一个字节里面往往挤着就绪标志、故障码、量程参数,这时候就需要位域解包,把混杂在一起的字段拆分出来。本文配套上篇打包的逻辑,讲解这套固定解法,给出掩码计算技巧、多字段拆分示例,读懂 datasheet 的寄存器位图全靠它。

2026-10-21 09:27:22 247

原创 第一篇:位域打包:看懂 I2C 地址左移的底层逻辑

7bit地址 << 1。很多人只记住这是 I2C 的固定写法,却不知道这是一套通用的位域打包思想,I2C 寻址字节只是其中一个特例。位域打包,就是把多个短小的二进制字段,拼装到同一个字节里,用来组成总线命令、寻址帧。本文从 I2C 寻址字节切入,讲清楚的通用范式,顺带对比 SPI 那种读写位在最高位的布局,避开移位方向的坑。

2026-10-20 19:37:24 779

原创 volatile 关键字整理(嵌入式 C 标准)

volatile ≠ 线程安全:只解决编译器缓存可见性,不提供并发保护;不可滥用:普通局部 / 无外部修改全局变量加 volatile 会频繁访问内存,降低运行效率;不能替代 const:只读硬件寄存器必须搭配;无法保证指令执行顺序、原子读写,多线程并发写需配套互斥机制。volatile 只修改编译器优化策略,变量类型、存储、读写权限完全不变;作用是强制每次访问内存,适配中断、多线程、硬件寄存器三类异步修改场景。

2026-10-20 09:38:27 364

原创 volatile 完整深度教程(C 代码 + 带注释 ARM 汇编 + 硬件中断原理 + 分步运行时序)

全局变量初始值 0 由启动文件初始化,函数汇编中不会出现赋值代码;串口中断由硬件自动触发,无需代码调用,属于程序顺序流之外的异步操作,编译器无法识别;中断仅修改 RAM 内存,无法自动刷新 CPU 寄存器;不加 volatile:空循环只读取一次内存存入寄存器,内存更新无法同步,程序永久卡死;加 volatile:访存指令放入循环内部,每轮循环重读内存刷新寄存器,可捕获中断修改后的数值;volatile 是嵌入式中断、硬件寄存器开发必备关键字,作用是关闭编译器寄存器缓存优化。

2026-10-20 09:35:58 459

原创 RAM 细分:SRAM / DRAM

SRAM:STM32 片内高速内存,无需刷新、速度快、容量小,满足日常基础开发;:外接大容量内存,需要刷新、速度稍慢、容量大,用于高端复杂项目扩容;二者均为 RAM(数据存储器),断电数据丢失,仅用于运行临时数据,与存储程序的 Flash(ROM)完全区分。

2026-10-19 08:56:42 353

原创 存储器架构:冯·诺依曼架构与哈佛架构

将程序存储和数据存储。

2026-10-19 08:54:39 279

原创 汇编与 C 语言 互调用

汇编内部自定义函数统一加__,无需 IMPORT;所有 C 语言函数,汇编调用必须写IMPORT。

2026-10-18 08:20:11 259

原创 ARM 汇编 LDR 指令与 LDR 伪指令完整详解

ARM 汇编中LDR[]

2026-10-18 08:19:48 301

原创 MRS/MSR 指令操作 xPSR 寄存器

MRSMSR是 ARM Cortex‑M 内核中唯一能够直接读写程序状态寄存器 xPSR的专用指令,普通MOVLDRSTR等数据传送指令无法访问 xPSR,必须依靠这两条指令完成状态寄存器读写操作。

2026-10-17 08:49:16 428

原创 ARM 汇编比较指令:只修改标志位的底层逻辑与实战用法

初学 ARM 汇编时,CMP、CMN、TST、TEQ 四条比较指令总会让人产生困惑:指令内部完成了减法、加法、按位与、异或运算,却不保存运算结果,仅仅刷新 CPSR 程序状态寄存器的标志位。课堂上仅记住 “指令会影响标志位” 这一结论,却不清楚这套设计的底层目的;直到上机实操搭配条件跳转后,才理清比较指令、标志位、条件指令三者不可分割的联动关系。本文从底层原理出发,结合代码实例拆解四条比较指令的用法。

2026-10-17 08:48:19 413

原创 ARM 汇编 B / BL 核心区别

只能跳当前 32MB 内标号,超出要用 LDR PC,=addr 长跳转。ARM32 相对偏移 24 位有符号数,左移 2 位,跳转范围。

2026-10-16 09:00:03 380

原创 STM32(Cortex‑M4)内存区域、地址映射与读写权限

在 Cortex‑M 内核 STM32 汇编开发中,很多初学者会遇到同一个困惑:同样是自定义数据标签,加载到寄存器后地址却分属完全不同的区间。有人疑惑为什么会出现0x08xxxxxx0x2000xxxx0x4000xxxx三类地址;也会问到是否存在 “只写内存区域”。本文从硬件内存分区、汇编段属性、读写权限、使用场景四个维度,完整梳理 STM32 全部地址区域,区分存储内存与外设寄存器,解答只读、可读可写、只写地址的核心差异。汇编中由AREA。

2026-10-16 08:59:18 357

原创 STM32 启动文件堆栈配置段汇编解析

功能:给常量起别名,类似 C 语言#define只定义数值,不分配任何内存0x200十六进制 =十进制 512作用:为后面 SPACE 开辟空间提供大小参数STACK:段名,代表这一段内存专门给堆栈使用NOINIT:不初始化,只预留内存(堆栈不需要初始值,运行时自动读写)READWRITE:可读可写,堆栈必须可读写ALIGN=3:按 2^3 =8 字节对齐,适配浮点运算,防止硬件报错本段为启动文件堆栈配置片段,依靠 EQU、AREA、SPACE、地址标签完成堆栈配置;

2026-10-15 08:36:24 570

原创 ARM 汇编循环 实现四则运算(C 代码与汇编一一对应)

本次程序不使用 ARM 硬件乘除指令,仅依靠基础 MOV、ADD、SUB、CMP、分支跳转指令,通过循环迭代实现四类运算子程序:区间求和、乘法、整除、取模。遵循 ARM 汇编子程序规范:R0、R1 作为入口参数,运算结果存入 R0 返回;子程序入口STMFD保护现场,出口LDMFD恢复现场并返回。主程序测试:计算70 % 3,调用取模函数后停机。

2026-10-15 08:35:13 340

原创 Cortex-M 启动文件向量表 SPACE 0x400

常规嵌入式项目直接使用是最优方案,用极小 Flash 开销换取向量表稳定、通用、易维护;仅存储资源极度受限的极简产品,才按需缩小 SPACE 预留长度。

2026-10-14 08:52:10 222

原创 汇编语言|常用伪指令(ARM 汇编入门)

格式AREA 段名,属性1,属性2……功能:把程序划分成多个独立模块,称为 “段”。有的段存放执行代码,有的段存放变量数据;同时可以设置段的读写权限、内存对齐、是否初始化。表格属性说明CODE存放 CPU 执行指令,默认属性为READONLY只读DATA存放变量与数据,默认属性为READWRITE可读可写READONLY内存只允许读取,不可修改READWRITE内存可读,允许修改写入NOINIT程序启动时,该段内存不做初始化ALIGN=n内存对齐字节 = \(2^n\);例如ALIGN=3。

2026-10-14 08:51:31 525

原创 堆栈寻址:先进后出

增减栈只看入栈时地址变大变小;满空栈只看SP 指向有没有数据。“满栈先移指针再存数、空栈先存数再移指针”仅限入栈场景,出栈操作步骤完全颠倒,不可套用此口诀。ARM 硬件栈固定为满减栈;软件数组模拟栈大多采用空增栈。

2026-10-13 08:50:55 257

原创 ARM|寄存器间接寻址 与 多个寄存器寻址(Multiple)

统一规则:Rm 的值作为内存地址,指令执行完毕 Rm 数值不变。:回写标记,传输完成后自动更新 Rm 的值。仅操作数左右顺序相反。

2026-10-13 08:50:07 262

原创 Cortex-M4 三级流水线 BL 带返回跳转指令(PC、LB)

Cortex‑M4 采用三级流水线架构,任意指令进入执行阶段时,物理 PC 恒等于当前指令地址 + 8,属于硬件固有正常设计;BL 指令依靠架构原生运算,匹配流水线地址分布,计算得到合法函数返回地址,不存在硬件纠错、修正行为;BL 指令硬件时序永久固定:先将返回地址存入 LR,再改写 PC 完成跳转;两套官方描述观测视角不同、互为补充,逻辑统一,不存在冲突;软件简化 PC 模型仅用于理解程序宏观流程,分析 BL 跳转、底层地址运算时,必须使用真实流水线硬件模型。

2026-10-12 08:52:33 391

原创 ARM汇编 [Rx] 语义解析:解决 LDR/STR 语义矛盾

为什么 LDR 用 [Rx] 是取数据,STR 用 [Rx] 又是操作地址空间?这会让人误以为[Rx] 的含义会随指令变化,时而代表数据、时而代表内存空间。实际上硬件层面定义完全统一、从未改变。本文给出唯一、自洽、无歧义的标准定义,彻底根治该问题。1. Rx寄存器中保存的数值,仅代表内存地址。作用:定位内存位置,只是一个位置编号,不是空间,也不是数据。2. [Rx]以 Rx 存放的地址为索引,寻址得到的内存存储单元(内存空间)。[Rx]永远代表内存空间本身,它既不是地址,也不是数据。

2026-10-12 08:51:28 169

原创 8086、x86、ARM 结构化详解

本文采用清晰模块化结构,完整梳理三者定义、属性、迭代谱系与核心区别,通俗易懂、重点清晰。

2026-10-11 09:19:34 231

原创 从寄存器间接寻址---解析C语言整型隐式转换底层原理

1.寄存器存储本质:LDR/STR指令仅完成内存与32位寄存器的比特搬运,硬件层面无类型、无正负、无数值修改;2.寄存器补位铁律:窄位宽数据载入32位寄存器,补0/补1只看内存原变量类型(无符号补0、有符号补1);3.寄存器数值差异:同一内存比特,载入寄存器后补位不同、解析规则不同,最终数值不同;4.寄存器解析优先级:printf格式符直接覆盖变量类型,仅改变寄存器比特的解读结果,不修改寄存器硬件数据。

2026-10-11 09:18:42 355

空空如也

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

TA关注的人

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