STM32 Flash对齐技巧详解
2025-10-17 来源:bilibili
这行代码 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) & ~0x03 | 5 → 8, 8 → 8 |
| 8 字节对齐 | (x + 7) & ~0x07 | 10 → 16, 16 → 16 |
| 16 字节对齐 | (x + 15) & ~0x0F | 20 → 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微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




