nRF52832地址空间分配详解
前言
nRF52832是nordic公司开发的一款经典蓝牙SOC,其性能和低功耗特性一直是标杆,其工作依赖SoftDevice(蓝牙协议栈),其占用空间地址及应用程序的地址空间分配是开发蓝牙应用的前题。
nRF52832基于ARM Cortex-M4F内核,遵循ARM Cortex-M架构的4GB地址空间划分规则,同时结合自身硬件特性(Flash、RAM、外设等)形成了特定的地址空间布局。以下是其详细的地址空间分配,包括核心内存区域、外设寄存器、特殊配置寄存器及协议栈/引导程序的典型分配:
一、ARM Cortex-M4F整体地址空间框架
Cortex-M4F的4GB地址空间分为5个主要区域,nRF52832的硬件资源映射到其中的关键区域:
地址范围 | 区域类型 | 说明 |
0x0000 0000 ~ 0x1FFF FFFF | Code区(Code Space) | 存储Flash、片内ROM等代码/数据 |
0x2000 0000 ~ 0x3FFF FFFF | SRAM区(SRAM Space) | 片内RAM,用于数据/堆栈/堆 |
0x4000 0000 ~ 0x5FFF FFFF | 外设区(Peripheral) | 片内外设寄存器映射 |
0x6000 0000 ~ 0xDFFF FFFF | 保留(Reserved) | 厂商/ARM保留 |
0xE000 0000 ~ 0xE00F FFFF | 系统区(System) | Cortex-M4F内核外设(NVIC、SCB等) |
0xE010 0000 ~ 0xFFFF FFFF | 保留(Reserved) | 厂商/ARM保留 |
二、nRF52832核心硬件地址分配
nRF52832的硬件规格主要有512KB Flash + 64KB RAM(主流版本)和256KB Flash + 32KB RAM(精简版),以下以512KB Flash + 64KB RAM为例说明:
1. 片内Flash(Code区)
Flash是非易失性存储器,用于存储程序代码、常量、配置数据等,地址范围及细分如下:
地址范围 | 大小 | 用途说明 |
0x0000 0000 ~ 0x0007 FFFF | 512KB | 主Flash存储区:裸机程序默认从0x0000 0000开始执行;若使用SoftDevice,此区域会被协议栈和应用程序分割。 |
0x1000 0000 ~ 0x1000 0FFF | 4KB | FICR(Factory Information Configuration Register):工厂烧录的只读信息,如设备ID、射频校准数据、Flash/RAM容量信息等,用户不可修改。 |
0x1000 1000 ~ 0x1000 1FFF | 4KB | UICR(User Information Configuration Register):用户可配置的非易失性寄存器,用于设置GPIO引脚配置、启动地址、SoftDevice启用标志等,需通过NVMC(非易失性存储器控制器)编程修改。 |
0x0008 0000 ~ 0x000F FFFF | 保留 | 厂商保留(部分版本扩展Flash用) |
256KB Flash版本的主Flash地址范围为0x0000 0000 ~ 0x0003 FFFF,其余FICR/UICR地址不变。
2. 片内RAM(SRAM区)
RAM是易失性存储器,用于运行时数据存储、堆栈(Stack)、堆(Heap)等,地址范围及细分如下:
地址范围 | 大小 | 用途说明 |
0x2000 0000 ~ 0x2000 FFFF | 64KB | 主RAM存储区:裸机程序默认使用此区域;若使用SoftDevice,协议栈会占用低地址部分RAM,应用程序使用剩余部分。 |
0x2001 0000 ~ 0x200F FFFF | 保留 | 厂商保留(部分高性能nRF52系列扩展RAM用) |
32KB RAM版本的主RAM地址范围为0x2000 0000 ~ 0x2000 7FFF,其余保留。
3. 外设寄存器(Peripheral区)
nRF52832的片内外设(GPIO、TIMER、RADIO、UART等)寄存器映射到0x4000 0000开始的外设区,关键外设的基地址如下(完整列表见nRF52832 Product Specification):
外设模块 | 基地址 | 外设模块 | 基地址 |
POWER(电源管理) | 0x4000 0000 | CLOCK(时钟管理) | 0x4000 1000 |
RADIO(射频模块) | 0x4000 2000 | UART0 | 0x4000 4000 |
SPI0/TWI0 | 0x4000 5000 | SPI1/TWI1 | 0x4000 6000 |
TIMER0~2 | 0x4000 8000~0xA000 | RTC0 | 0x4000 B000 |
WDT(看门狗) | 0x4000 C000 | RNG(随机数发生器) | 0x4000 D000 |
ECB/CCM(加密) | 0x4000 E000~0xF000 | GPIOTE(GPIO事件) | 0x4001 3000 |
SAADC(模数转换) | 0x4001 4000 | NVMC(Flash控制器) | 0x4001 E000 |
GPIO/P0 | 0x5000 0000 | SPI2/TWI2 | 0x4002 9000 |
TIMER3~4 | 0x4003 0000~0x1000 | RTC1~2 | 0x4003 2000~0x3000 |
4. 内核外设(System区)
Cortex-M4F的内核外设(NVIC、SCB、SysTick、MPU等)映射到0xE000 0000开始的系统区,关键模块的基地址如下:
内核外设 | 基地址 | 说明 |
SysTick(系统定时器) | 0xE000 E010 | 系统滴答定时器 |
SCB(系统控制块) | 0xE000 ED00 | 含CPUID、中断控制、系统控制等寄存器 |
NVIC(嵌套中断控制器) | 0xE000 E100 | 中断优先级配置、中断使能/失能等 |
MPU(内存保护单元) | 0xE000 ED90 | 内存访问权限控制(Cortex-M4F可选) |
CoreSight调试组件 | 0xE004 2000 | 调试接口(SWD/JTAG)相关寄存器 |
三、SoftDevice(蓝牙协议栈)的地址分配
nRF52832常用的蓝牙协议栈为S132(蓝牙5.0),不同版本的S132占用的Flash和RAM不同,以S132 v7.3.0(主流版本)为例:
区域 | 协议栈占用地址范围 | 大小 | 应用程序可用地址范围 |
Flash | 0x0000 0000 ~ 0x0002 5FFF | 152KB | 0x0002 6000 ~ 0x0007 FFFF(360KB) |
RAM | 0x2000 0000 ~ 0x2000 3FFF | 16KB | 0x2000 4000 ~ 0x2000 FFFF(48KB) |
S132 v6.1.0的占用更小:Flash占用0x0000 0000 ~ 0x0001 FFFF(128KB),RAM占用0x2000 0000 ~ 0x2000 2FFF(12KB),应用程序可用Flash为0x0002 0000 ~ 0x0007 FFFF(384KB),RAM为0x2000 3000 ~ 0x2000 FFFF(52KB)。
四、Bootloader(引导程序)的典型地址分配
Bootloader用于实现固件升级(DFU),通常放置在Flash的高地址区,以512KB Flash为例,典型分配为:
- Bootloader占用:0x0007 0000 ~ 0x0007 FFFF(64KB)
- 应用程序(含SoftDevice)占用:0x0000 0000 ~ 0x0006 FFFF(448KB)
若Bootloader需更大空间(如支持蓝牙DFU+USB DFU),可调整为0x0006 0000 ~ 0x0007 FFFF(128KB),应用程序占用0x0000 0000 ~ 0x0005 FFFF(384KB)。
五、向量表的地址分配
nRF52832的中断向量表默认位于Flash起始地址(0x0000 0000),若使用SoftDevice或Bootloader,向量表需重定位:
- 裸机程序:向量表地址=0x0000 0000(默认),可通过SCB->VTOR寄存器修改至RAM或Flash其他地址。
- 含SoftDevice的应用程序:向量表需重定位到应用程序的Flash起始地址(如S132 v7.3.0的0x0002 6000)或RAM(0x2000 4000),由sd_softdevice_vector_table_set()函数配置。
- 含Bootloader的程序:应用程序的向量表重定位到应用程序Flash起始地址,Bootloader的向量表位于自身Flash起始地址。
六、关键注意事项
- 内存越界:程序代码/数据若超出Flash/RAM的实际地址范围,会导致芯片跑飞、调试异常(如之前提到的无法进入main()、无法单步执行)。
- MPU配置:Cortex-M4F的MPU可对地址空间进行访问权限控制,若配置错误,会导致外设访问失败、内存读写错误(触发HardFault)。
- NVMC操作:Flash/UICR的写/擦除需通过NVMC寄存器配置,直接对Flash地址写数据会导致操作无效或硬件故障。
- SoftDevice兼容性:不同版本的SoftDevice对地址分配的要求不同,需严格遵循对应的SoftDevice规格书(S132 Specification)。
nRF52832的地址空间分配可参考Nordic官方文档:《nRF52832 Product Specification (v1.5)》Chapter 2 “Memory map”和《S132 SoftDevice Specification (v7.3.0)》Chapter 4 “Memory layout”。