概要
本文详细介绍了STM32 RAM各区域的功能,并举例说明各区域典型使用方法。包括SRM1、SRAM2、Backup SRAM、CCM、TCM、外部RAM。并以STM32F4系列为例进行详细说明。
STM32 RAM区域划分及详细说明
STM32 系列微控制器的 RAM 通常划分为多个区域,包括不同的 SRAM 区域以及可能存在的 Backup SRAM。这些 RAM 区域可以被用于不同的功能,如常规数据存储、DMA 缓冲区、低功耗模式下的数据保持等。以下是 STM32 系列中常见的 RAM 区域及其详细说明。
1.SRAM1 和 SRAM2
STM32 的主要 RAM 区域通常包括 SRAM1 和 SRAM2,它们都位于核心的内部存储器,并通过主系统总线或特定的总线访问。
1.1 SRAM1
大小: 大小根据不同的 STM32 系列有所不同,如 STM32F4xx 系列中的 SRAM1 大小可以是 112KB,STM32L4xx 系列则为 96KB。
位置: SRAM1 通常位于主系统总线上,数据访问速度较快。
用途:一般用于程序的堆栈(stack)和堆(heap)等动态内存分配。可作为程序运行时的变量和数据存储区域。
1.2 SRAM2
大小: 大小通常小于 SRAM1,典型的如 STM32F4 系列的 SRAM2 为 16KB,STM32L4 系列也为 32KB。
位置: SRAM2 通常连接到独立的总线,可减少与 CPU 对其他 RAM 区域的争用,适合 DMA 或外设使用。
用途:通常用于 DMA 的缓冲区,以提高数据传输效率。由于 SRAM2 在某些低功耗模式下(如 Standby 模式)可以保留数据,因此也适合作为低功耗模式下的数据保存区域。
2. Backup SRAM
大小: Backup SRAM 一般较小,如 STM32F4 系列有 4KB 的 Backup SRAM。
用途:适用于 备份数据存储,在掉电或低功耗模式下通过外部电池或备份电源供电,能够保留数据。常用于保存系统状态、关键参数等掉电后仍需要保留的数据。例如,在电池供电的应用中,Backup SRAM 常用于保存时间、配置等信息。
3. CCM (Core Coupled Memory)
大小: 一些 STM32 微控制器(如 STM32F3、STM32F4)提供 CCM RAM,大小一般为 64KB。
位置: CCM RAM 直接与 CPU 内核相连,不通过主总线。
用途:
适合用作时间要求严格、需要低延迟访问的内存,如实时操作系统的中断服务程序、时间关键型任务等。
需要注意的是,CCM RAM 不能通过 DMA 访问,因为它与 CPU 内核紧耦合,但可以提升关键任务的执行速度。
4. Tightly Coupled Memory (TCM)
在一些高级 STM32 微控制器(如 STM32H7)中,还可能包含 ITCM(Instruction Tightly Coupled Memory)和 DTCM(Data Tightly Coupled Memory)两种特殊类型的 RAM。
4.1 ITCM(Instruction TCM)
用途: 主要用于存储指令,提供极快的指令执行速度,通常用于加速关键代码段的执行。
访问: 该内存区域直接连接到 CPU 的指令总线。
4.2 DTCM(Data TCM)
用途: 主要用于存储数据,类似于 CCM RAM,但访问速度更快,适合用作高性能应用的数据缓存。
访问: 该内存区域直接连接到 CPU 的数据总线。
5. External RAM (外部 RAM)
在某些 STM32 系列(如 STM32F7、STM32H7)中,支持通过外部存储控制器(FSMC 或 FMC)连接 外部 SRAM 或 SDRAM。
大小: 外部 RAM 的大小取决于所连接的外部存储芯片,可以达到几 MB 或更大。
用途:适合大数据缓冲区、大容量动态分配内存等场景,如图像处理、音频处理、图形用户界面(GUI)的帧缓存等。
外部 RAM 的访问速度一般比内部 SRAM 慢,但适合需要大量存储的应用。
6. RAM 区域分配与使用技巧
6.1 不同任务合理分配内存
SRAM1 通常用于一般的代码和数据存储。
SRAM2 适合用于需要高效数据传输的 DMA 缓冲区,避免与主程序争用总线。
Backup SRAM 可用于保存关键配置或掉电后仍需保存的数据。
6.2 DMA 缓冲区分配
将 DMA 缓冲区放置在 SRAM2 或 TCM 中,可以有效避免与主程序内存的竞争,提高数据传输的效率。例如,串口、SPI 等外设的 DMA 缓冲区建议放置在 SRAM2 中,以避免 DMA 与 CPU 争用 SRAM1。
6.3 低功耗模式下的内存使用
在进入低功耗模式(如 Standby 模式)时,SRAM1 和 SRAM2 的内容通常会丢失,而 Backup SRAM 由于独立供电,可以保存关键数据。因此,在设计低功耗应用时,可以将重要数据保存在 Backup SRAM 中。
6.4 ITCM/DTCM 的优化使用
如果需要优化性能,可以将关键代码段放置在 ITCM 中,确保指令的快速访问。
DTCM 可以用于存储对时延要求较高的数据,例如实时处理中的关键数据。
7. 典型内存映射例子(STM32F4 系列)
以下是 STM32F4 系列的一种典型内存映射(以 STM32F407 为例):
ram各区域典型应用例程
在 STM32 微控制器的开发中,合理使用不同的 RAM 区域可以有效提升系统性能。下面是 STM32 的不同 RAM 区域的典型应用示例,包括 SRAM1、SRAM2、Backup SRAM、CCM(Core Coupled Memory),以及如何利用它们实现不同功能的具体代码。
1. SRAM1 典型应用 - 常规数据存储
SRAM1 是 STM32 中的主要 RAM 区域,通常用于一般的全局变量、局部变量和堆栈等存储。下面是一个简单的例子,展示如何在 SRAM1 中存储和操作变量。
示例:存储和读取全局变量
#include "stm32f4xx_hal.h"
uint32_t global_variable = 0x12345678; // 全局变量存储在 SRAM1 中
int main(void) {
HAL_Init();
SystemClock_Config();
global_variable += 0x11111111; // 修改全局变量
while (1) {
// 主循环中可以继续处理其他任务
}
}
说明: 在大多数应用中,SRAM1 是默认的内存区域,所有没有特殊指定的全局变量都会存储在这里。
2. SRAM2 典型应用 - DMA 缓冲区
SRAM2 是用于存储需要频繁访问或高效传输的数据,如 DMA 缓冲区。通过将 DMA 缓冲区放置在 SRAM2,可以减少与主系统总线的竞争,提高传输效率。
示例:使用 DMA 接收 UART 数据并存储在 SRAM2 中
#include "stm32f4xx_hal.h"
#define BUFFER_SIZE 64
// 将缓冲区放在 SRAM2 中
__attribute__((section(".sram2_bss"))) uint8_t rx_buffer[BUFFER_SIZE];
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_uart2_rx;
void SystemClock_Config(void);
void DMA_UART_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
DMA_UART_Init();
// 启动 DMA 接收,将数据存储到 SRAM2 中的 rx_buffer
HAL_UART_Receive_DMA(&huart2, rx_buffer, BUFFER_SIZE);
while (1) {
// 可以在这里处理接收到的数据
HAL_Delay(1000);
}
}
void DMA_UART_Init(void) {
// UART 和 DMA 初始化代码
// 这里配置 UART2 和 DMA 接收,将缓冲区设置为 rx_buffer
}
说明: 在此例子中,rx_buffer 存放在 SRAM2 中,通过 DMA 将 UART 数据接收到此缓冲区,减少与主系统的总线争用。
3. Backup SRAM 典型应用 - 掉电保存数据
Backup SRAM 用于保存重要数据,即使系统掉电也不会丢失。它通常与备份电源相连,特别适合保存系统参数、时间戳等。
示例:在 Backup SRAM 中保存系统参数
#include "stm32f4xx_hal.h"
#define BACKUP_SRAM_BASE 0x40024000
#define BACKUP_SRAM_SIZE 0x1000 // 4KB
uint32_t *backup_param = (uint32_t *)BACKUP_SRAM_BASE;
void SystemClock_Config(void);
void Enable_Backup_SRAM(void);
int main(void) {
HAL_Init();
SystemClock_Config();
Enable_Backup_SRAM(); // 使能 Backup SRAM
// 写入数据到 Backup SRAM 中
*backup_param = 0x12345678;
// 模拟掉电,重新启动后可读取该参数
uint32_t param = *backup_param;
while (1) {
// 在这里可以继续使用 param 进行其他处理
}
}
void Enable_Backup_SRAM(void) {
// 使能 PWR 时钟
__HAL_RCC_PWR_CLK_ENABLE();
// 使能访问 Backup SRAM
HAL_PWR_EnableBkUpAccess();
// 使能 Backup SRAM 时钟
__HAL_RCC_BKPSRAM_CLK_ENABLE();
}
说明: Backup SRAM 是掉电后仍可保持数据的存储区域,适合保存掉电后需要恢复的配置或状态数据。
4. CCM RAM 典型应用 - 实时任务数据处理
CCM (Core Coupled Memory) 是与 CPU 紧密耦合的 RAM 区域,不通过系统总线访问,专为加速实时任务或中断服务例程中的数据处理。
示例:使用 CCM RAM 处理高优先级中断任务
#include "stm32f4xx_hal.h"
// 将数据缓冲区放置在 CCM RAM 中
__attribute__((section(".ccmram"))) uint8_t ccm_buffer[128];
void SystemClock_Config(void);
void Process_Data_In_CCM(void);
int main(void) {
HAL_Init();
SystemClock_Config();
// 模拟在 CCM 中处理高优先级数据
Process_Data_In_CCM();
while (1) {
// 主循环可以执行其他任务
}
}
void Process_Data_In_CCM(void) {
// 在 CCM RAM 中操作数据
for (int i = 0; i < 128; i++) {
ccm_buffer = i;
}
// 继续处理数据
}
说明: CCM RAM 非常适合处理实时任务的数据,因为它不通过系统总线,访问延迟低,非常适合用于高优先级的中断或实时处理。
5. 外部 SRAM/SDRAM 典型应用 - 大容量数据缓存
某些 STM32 微控制器支持连接外部 SRAM 或 SDRAM。这类存储器适用于需要大量数据存储的应用,例如图像缓存或音频处理。
示例:使用外部 SRAM 作为图像帧缓存
#include "stm32f4xx_hal.h"
// 定义外部 SRAM 的起始地址
#define EXTERNAL_SRAM_BASE 0x60000000
#define FRAME_BUFFER_SIZE 0x10000 // 64KB 帧缓存
uint8_t *frame_buffer = (uint8_t *)EXTERNAL_SRAM_BASE;
void SystemClock_Config(void);
void Init_External_SRAM(void);
int main(void) {
HAL_Init();
SystemClock_Config();
Init_External_SRAM(); // 初始化外部 SRAM 控制器
// 将图像数据存储到外部 SRAM 中
for (int i = 0; i < FRAME_BUFFER_SIZE; i++) {
frame_buffer = 0xFF; // 白色像素
}
while (1) {
// 继续处理图像数据
}
}
void Init_External_SRAM(void) {
// 外部 SRAM 初始化代码(使用 FMC 控制器)
// 这里可以通过 CubeMX 生成外设初始化代码
}
说明: 通过外部 SRAM,可以处理大容量的数据,如用于图形用户界面(GUI)或图像处理的帧缓存。外部存储器通过 FMC 或 FSMC 控制器进行访问。
总结
SRAM1: 常规数据存储,适合全局变量、局部变量和动态内存分配。
SRAM2: 适合 DMA 缓冲区等需要高效访问的区域。
Backup SRAM: 用于保存掉电后需保持的数据,如系统配置或关键参数。
CCM RAM: 适合高优先级任务或中断中的关键数据处理,低延迟访问。
外部 SRAM/SDRAM: 适合大容量数据存储,如图像缓存和音频处理等。
通过合理选择和利用不同的 RAM 区域,可以充分发挥 STM32 微控制器的性能,提高数据处理效率。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42306872/article/details/142254236
|