stm32f103rct6 flash划分
时间: 2025-06-24 16:44:23 浏览: 13
### STM32F103RCT6 Flash 存储器划分方式及配置方法
STM32F103RCT6 是一款基于 ARM Cortex-M3 内核的微控制器,其内部 Flash 的大小为 256 KB。为了满足不同的功能需求(如 BootLoader、应用程序、OTA 升级等),通常会将 Flash 划分为多个区域。
#### 1. Flash 分区概述
一种常见的分区方案如下[^2]:
- **A 区**: 存放 BootLoader,大小为 40 KB。
- **B 区**: 存放 APP 应用程序,大小为 150 KB。
- **C 区**: 存放 OTA 升级所需的最新 APP 应用程序,大小为 64 KB。
- **D 区**: 存放 OTA 升级的相关参数(如标志位、固件大小、版本号等),大小为 2 KB。
这种分区方式能够有效支持 BootLoader 功能以及通过 OTA 进行应用更新的需求。
#### 2. 配置 Flash 地址范围
假设 Flash 基地址为 `0x08000000`,则各区域的具体地址分配可以计算如下:
- A 区: `0x08000000 ~ 0x08009FFF` (40 KB)
- B 区: `0x0800A000 ~ 0x0803FFFF` (150 KB)
- C 区: `0x08040000 ~ 0x0805FFFF` (64 KB)
- D 区: `0x08060000 ~ 0x080607FF` (2 KB)
这些地址可以通过修改链接脚本文件 `.ld` 来实现具体的内存映射。
#### 3. 修改链接脚本 (.ld 文件)
以下是针对上述分区的一个简单链接脚本示例:
```ld
MEMORY
{
FLASH_A (rx) : ORIGIN = 0x08000000, LENGTH = 40K /* BootLoader */
FLASH_B (rx) : ORIGIN = 0x0800A000, LENGTH = 150K /* Application */
FLASH_C (rx) : ORIGIN = 0x08040000, LENGTH = 64K /* OTA Firmware */
SRAM (rwx): ORIGIN = 0x20000000, LENGTH = 20K /* Internal RAM */
}
SECTIONS
{
.text :
{
*(.vectors)
*(.text*)
} > FLASH_B
.data :
{
*(.data*)
} > SRAM AT> FLASH_B
.bss :
{
*(.bss*)
} > SRAM
}
```
此脚本定义了不同区域的功能及其对应的起始地址和长度。
#### 4. 实现从 BootLoader 跳转至 APP
当设备启动时,默认进入 BootLoader 区域运行。如果检测到无需执行 OTA 更新,则需跳转至 APP 区域运行。具体实现代码如下:
```c
#include "stm32f1xx.h"
void JumpToApplication(uint32_t applicationAddress) {
typedef void (*AppFunction)(void);
// 获取堆栈指针
uint32_t stackPointer = *((uint32_t *)applicationAddress);
// 获取入口函数地址
AppFunction appStartAddr = (AppFunction)(*((uint32_t *)(applicationAddress + 4)));
// 设置 MSP 寄存器
__set_MSP(stackPointer);
// 跳转到目标地址
appStartAddr();
}
int main(void) {
uint32_t appBaseAddress = 0x0800A000; // B 区首地址
// 检查是否需要跳转到 APP
if (/* 添加条件判断 */) {
JumpToApplication(appBaseAddress);
}
while(1); // 如果不跳转,停留在 BootLoader 中
}
```
以上代码展示了如何设置 MSP 和调用目标地址的应用程序入口函数[^2]。
#### 5. 注意事项
- 在实际开发过程中,应确保每个区域的数据不会越界访问其他区域的内容。
- 使用 HAL 或 LL 库提供的 API 完成 Flash 编程操作时,务必遵循官方文档中的注意事项[^1]。
- 对于生产环境下的产品设计,建议增加 CRC 校验机制来验证固件完整性。
---
阅读全文
相关推荐


















