STM32 RAM区域详解:应用例程与内存管理策略

文章目录

  • 概要
  • STM32 RAM区域划分及详细说明
  • 1.SRAM1 和 SRAM2
  • 1.1 SRAM1
  • 1.2 SRAM2
  • 2. Backup SRAM
  • 3. CCM (Core Coupled Memory)
  • 4. Tightly Coupled Memory (TCM)
  • 4.1 ITCM(Instruction TCM)
  • 4.2 DTCM(Data TCM)
  • 5. External RAM (外部 RAM)
  • 6. RAM 区域分配与使用技巧
  • 6.1 不同任务合理分配内存
  • 6.2 DMA 缓冲区分配
  • 6.3 低功耗模式下的内存使用
  • 6.4 ITCM/DTCM 的优化使用
  • 7. 典型内存映射例子(STM32F4 系列)
  • ram各区域典型应用例程
  • 1. SRAM1 典型应用 – 常规数据存储
  • 2. SRAM2 典型应用 – DMA 缓冲区
  • 3. Backup SRAM 典型应用 – 掉电保存数据
  • 4. CCM RAM 典型应用 – 实时任务数据处理
  • 5. 外部 SRAM/SDRAM 典型应用 – 大容量数据缓存
  • 总结
  • 概要

    本文详细介绍了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 为例):

    内存区域 起始地址 大小 说明
    ITCM 0x00000000 16KB 指令
    SRAM1 0x20000000 112KB 主系统
    SRAM2 0x2001C000 16KB 第二块
    Backup SRAM 0x40024000 4KB 备份
    CCM RAM 0x10000000 64KB 紧耦合内存
    外部 SRAM 0x60000000 根据芯片 通过 FSMC 或 FMC 连接

    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] = 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[i] = 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 微控制器的性能,提高数据处理效率。

    作者:stone_hefei

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 RAM区域详解:应用例程与内存管理策略

    发表回复