Flash起始地址及核心细节(含Arduino/STM32场景)

核心结论:Flash起始地址并非统一为0X08000000,而是由MCU的架构+芯片型号决定——0X08000000仅为ARM Cortex-M系列(如STM32)的标准起始地址,Arduino原生芯片(AVR/ESP32)采用完全不同的地址规则。

一、不同芯片的Flash起始地址+分区地址分布

1. Arduino Uno(ATmega328P,AVR架构)

    •    Flash总容量:32KB

    •    总地址范围:0x0000 ~ 0x7FFF(16位地址,无0X08000000)

    ◦    引导程序区(Bootloader):地址0x7800 ~ 0x7FFF(512B),负责USB上传代码和启动引导;

    ◦    程序存储区(Code):地址0x0000 ~ 0x77FF(约31.5KB),存储Arduino上传的Sketch代码;

    ◦    数据存储区:无独立地址分区,需通过EEPROM库使用1KB专用EEPROM(物理独立于Flash,功能替代Flash数据区)。

2. Arduino ESP32(Tensilica Xtensa架构)

    •    Flash总容量:通常4MB/8MB(可扩展)

    •    总地址范围:0x00000000 ~ 0x3FFFFFFF(32位地址)

    ◦    引导程序区(Bootloader):0x00000000 ~ 0x00003FFF(16KB);

    ◦    程序存储区(App):0x00010000 ~ 0x003FFFFF(默认3MB),存储用户代码;

    ◦    数据存储区(NVS/Spiffs):0x00400000 ~ 末尾,用于存储配置参数、文件等持久化数据。

3. STM32(ARM Cortex-M架构,如STM32F103)

    •    Flash总容量:16KB~512KB(因型号而异)

    •    总地址范围:0x08000000 ~ 0x0807FFFF(以64KB容量为例)

    ◦    引导程序区(Bootloader):0x08000000 ~ 0x08001FFF(8KB,可配置);

    ◦    程序存储区(Code):0x08002000 ~ 0x0807FFFF(剩余56KB);

    ◦    数据存储区:无独立分区,需通过“Flash模拟EEPROM”(如利用特定地址段存储数据)实现持久化。

二、关键总结

    1.    0X08000000是ARM Cortex-M架构的Flash标准起始地址(如STM32),并非所有MCU通用;

    2.    Arduino原生芯片中,AVR架构(ATmega328P)从0x0000开始,ESP32从0x00000000开始;

    3.    Flash的“程序区/引导区/数据区”地址是芯片手册预定义的,分区仅为功能划分,物理上仍属同一块Flash;

    4.    实际使用中,Arduino用户无需关注地址细节(IDE自动分配),但嵌入式开发(如STM32)需按地址编写启动文件和配置代码。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐