打印
[应用相关]

STM32 RAM区域详解及典型应用例程

[复制链接]
112|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-9-18 12:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
概要
本文详细介绍了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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1753

主题

15164

帖子

10

粉丝