STM32 Flash对齐技巧详解

发布者:InspiredDreamer最新更新时间:2025-10-17 来源: bilibili关键字:STM32  Flash 手机看文章 扫描二维码
随时随地手机看文章

这行代码 uint32_t aligned_address = (address + 3) & ~0x03; 是一个经典的位运算技巧,用于将任意地址值向上取整为 4 的倍数。下面从原理到示例详细解释:


一、核心目标:向上对齐到 4 的倍数

对齐需求:STM32 的 32 位 Flash 写入要求地址必须是 4 的倍数(如 0x08010000、0x08010004)

向上取整:无论输入地址是否已经对齐,都返回大于等于该地址的最小 4 的倍数

例如:

输入 0x08010001 → 输出 0x08010004

输入 0x08010004 → 输出 0x08010004(已对齐,保持不变)


二、位运算拆解:(address + 3) & ~0x03

1. ~0x03 的含义

0x03 的二进制是 0000 0011

按位取反后 ~0x03 变为 1111 1100(即 0xFFFC

作用:这是一个掩码,用于清除二进制数的最后两位(最低 2 位)

2. address + 3 的作用

加 3 的目的:将地址值向上偏移,确保后续取整的正确性

对于未对齐的地址(如 0x08010001),加 3 后会进入下一个 4 的倍数区间

对于已对齐的地址(如 0x08010004),加 3 后仍在下一个 4 的倍数区间的边界内

3. & ~0x03 的作用

通过与 1111 1100 按位与,清除地址的最低 2 位(即模 4 的余数部分)

清除后,地址必然是 4 的倍数


三、示例验证

示例 1:输入 0x08010001(未对齐)

加 3:0x08010001 + 3 = 0x08010004

按位与:0x08010004 & 0xFFFC = 0x08010004

二进制过程:

0x08010004 → 0000 1000 0000 0001 0000 0000 0000 0100

0xFFFC     → 1111 1111 1111 1100

-----------------------------------

结果      → 0000 1000 0000 0001 0000 0000 0000 0100 → 0x08010004

示例 2:输入 0x08010004(已对齐)

加 3:0x08010004 + 3 = 0x08010007

按位与:0x08010007 & 0xFFFC = 0x08010004

二进制过程:

0x08010007 → 0000 1000 0000 0001 0000 0000 0000 0111

0xFFFC     → 1111 1111 1111 1100

-----------------------------------

结果      → 0000 1000 0000 0001 0000 0000 0000 0100 → 0x08010004

示例 3:输入 0x08010003(边界值)

加 3:0x08010003 + 3 = 0x08010006

按位与:0x08010006 & 0xFFFC = 0x08010004

二进制过程:

0x08010006 → 0000 1000 0000 0001 0000 0000 0000 0110

0xFFFC     → 1111 1111 1111 1100

-----------------------------------

结果      → 0000 1000 0000 0001 0000 0000 0000 0100 → 0x08010004


四、数学原理

对于任意整数 x,向上取整到 n 的倍数可以表示为:


ceil(x / n) * n

位运算技巧:当 n 是 2 的幂(如 4、8、16)时,可以简化为:


(x + (n-1)) & ~(n-1)

推导过程:


n-1 的二进制形式是低位全 1(如 0x03 → 0000 0011)

~(n-1) 的二进制形式是低位全 0,高位全 1(如 0xFFFC → 1111 1100)

(x + (n-1)) 将值偏移到下一个区间

& ~(n-1) 清除低位,得到对齐结果


五、通用公式

对齐目标代码实现示例(输入→输出)
4 字节对齐(x + 3) & ~0x035 → 8, 8 → 8
8 字节对齐(x + 7) & ~0x0710 → 16, 16 → 16
16 字节对齐(x + 15) & ~0x0F20 → 32, 32 → 32


六、在 STM32 Flash 编程中的应用

当你需要在任意地址写入 32 位数据时,可先对齐地址:


uint32_t address = 0x08010001;  // 未对齐的地址

uint32_t aligned_addr = (address + 3) & ~0x03;  // 对齐到0x08010004


// 安全写入

FLASH_ProgramWord(aligned_addr, 0x12345678);


七、注意事项

仅适用于 2 的幂对齐:该技巧只对 n=2^k 有效(如 4、8、16)

数据类型匹配:32 位对齐适用于 FLASH_ProgramWord(),16 位对齐适用于 FLASH_ProgramHalfWord()

溢出风险:如果 address 接近 UINT32_MAX,加 3 可能导致溢出(实际应用中 Flash 地址远小于此值,通常安全)

掌握这种位运算对齐技巧,能帮助你高效处理 STM32 Flash 编程中的地址约束问题。


关键字:STM32  Flash 引用地址:STM32 Flash对齐技巧详解

上一篇:使用Makefile在Windows环境下编译STM32F103C8T6标准库工程,脱离Keil的指南
下一篇:基于STM32G431与LCD uC8230液晶控制器结合实现智能停车收费动态二维码显示技术

推荐阅读最新更新时间:2026-03-25 18:00

STM32 Flash对齐技巧详解
这行代码 uint32_t aligned_address = (address + 3) & ~0x03; 是一个经典的位运算技巧,用于将任意地址值向上取整为 4 的倍数。下面从原理到示例详细解释: 一、核心目标:向上对齐到 4 的倍数 对齐需求:STM32 的 32 位 Flash 写入要求地址必须是 4 的倍数(如 0x08010000、0x08010004) 向上取整:无论输入地址是否已经对齐,都返回大于等于该地址的最小 4 的倍数 例如: 输入 0x08010001 → 输出 0x08010004 输入 0x08010004 → 输出 0x08010004(已对齐,保持不变) 二、位运算拆解:(address +
[单片机]
关于STM32FLASH、ROM、RAM是什么,有什么用,注意事项,如何计算
一、stm32 的flash是什么、有什么用、注意事项、如何查看 一、说明 它主要用于存储代码,FLASH 存储器的内容在掉电后不会丢失,STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用程序后还有剩余的空间,我们可以把它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。并且访问内部 FLASH 的速度要比外部的 SPI-FLASH 快得多。 二、结构 STM32 的内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及大小下表: 各个存储区域的说明如下: (1)主存储器 一般我们说 STM32 内
[单片机]
基于stm32,通过更换数据存储扇区提升w25q128flash芯片使用寿命
从芯片手册中可以得到w25q128单个扇区的写入次数约为10万次。项目中有些数据需要经常的进行读写,如果这些数据只是写在一个扇区,那么到达10W次后,可能就会面临使用扇区损坏的风险,我的解决方案就是更换数据的存储位置。 我这次的代码是基于自己项目写的,只有参考价值,不一定符合你的使用要求。 我的需求: 在机器工作过程中,每次动作都会记录一次数据到flash芯片,然后将当前数据的最高地址写入到特定的某个ADDR,供次写入时,读取出来,作为这条数据的起始地址。 这个位置的需要经常的读写,容易损坏,如果损坏了,那么以后历史数据都无法正常写入了。 解决方案:使用若干个相邻的扇区,数据存储到达一定的条数后,更换扇区继续,
[单片机]
stm32内部Flash的读写操作
stm32的产品都有内置Flash,而且不同系列的产品其内置Flash的大小不尽相同,结构上也有差异,本文将对stm32f07x,stm32f10x,stm32f40x的内置Flash结构,以及如何进行读写操作做一个介绍。 一、特性与构成 1.stm32f07x系列 2、stm32f10x系列               3、stm32f40x系列    二、对内部Flash的读写操作  2.1 stm32不同系列的产品,内部Flash的特性与构成确实存在一定的差异,但是对于读写操作,步骤一致,比如要往内部flash写入数据,需要几个步骤:   ①、解锁flash   ②、擦
[单片机]
<font color='red'>stm32</font>内部<font color='red'>Flash</font>的读写操作
stm32变量能存进flash中吗
当涉及到将变量存储在Flash中时,我们通常指的是将变量存储在STM32微控制器的闪存器件中。在STM32芯片中,闪存用于存储程序代码和只读数据,但对于一些应用情况,我们可以使用闪存来存储可读写的变量。 虽然SRAM是通常用于存储变量的内存区域,但在某些场景中,需要将变量存储在闪存中的原因有以下几点: 节省SRAM空间:对于资源受限的应用,SRAM可能是有限的,因此在闪存中存储变量可以释放SRAM空间,使其可以用于其他用途。 数据持久性:将变量存储在闪存中可以确保其数据持久性,即使在断电或重新启动后,变量的值也能保持不变。 更新性:如果需要更新变量的值,而不需要重新烧录MCU的固件或运行其他复杂的操作,可以通过修改闪存中
[单片机]
STM32Flash写了保护怎么办?
关于STM32对内部Flash的保护 为了防止对Flash的非法访问,所有STM32的芯片都提供对Flash的保护,具体分为写保护和读保护。 如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。在开发STM32的时候,如果出现这种情况,通常仿真器都支持对Flash进行解锁,像jlink,stlink等仿真器都支持这个功能。 在使用MDK进行调试的时候,可能会遇到如下图所示的报错信息,这时候就要排查Flash是不是被保护起来了。 读保护即大家通常说的“加密”,是作用于整个Flash存储区域,相关文章:STM32等单片机程序加密的方法。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行
[单片机]
<font color='red'>STM32</font>的<font color='red'>Flash</font>写了保护怎么办?
STM32学习笔记—片内FLASH读写失败问题分析
FLASH,指Flash Memory,是一种非易失性存储器(闪存),掉电能正常保存数据。 STM32的存储器通常包含内部SRAM、内部FLASH,部分系列还包含EEPROM。其中FLASH通常用于存储代码或数据,可被读写访问。 STM32 FLASH 基础内容 STM32的FLASH组织结构,可能因不同系列、型号略有不同。比如大家熟悉的STM32F1中小容量一页大小只有1K,而F1大容量一页有2K。 还比如有些系列以扇区为最小单元,有的扇区最小16K,有的128K不等。 本文主要结合F4系列来描述关于FLASH的相关内容。 1.Flash 结构 通常Flash包含几大块,这里以F40x为例: 主存储器:用来存放用户
[单片机]
<font color='red'>STM32</font>学习笔记—片内<font color='red'>FLASH</font>读写失败问题分析
Stm32Flash模拟EEPROM与BOOT基本了解
闪存模块存储器组织 按照不同容量,存储器组织成32个1K字节/页(小容量),128个1K字节/页(中容量),256个2K字节/页(大容量)的主存储器和一些信息块等 下面这张图是大容量产品的Flash内部图: 主要分为三个部分:主存储器、信息块和闪存存储器接口寄存器; 主存储器:也就是我们常说的储存量的大小,比如:stm32ZET6的flash有512K,说的就是这块的容量;该部分用来存放代码和数据常数(如const类型的数据)。对于大容量产品,其被划分为256页,每页2K字节。注意,小容量和中容量产品则每页只有1K字节。从上图可以看出主存储器的起始地址就是0X08000000;起始地址时说的是stm32通用地址空间的绝对地
[单片机]
<font color='red'>Stm32</font>的<font color='red'>Flash</font>模拟EEPROM与BOOT基本了解
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved