打印
[STM32F3]

STM32微控制器中FLASH和RAM存储的详细介绍

[复制链接]
255|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梅花香自123|  楼主 | 2024-5-31 01:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32微控制器是STMicroelectronics公司生产的基于ARM Cortex-M内核的微控制器系列。STM32微控制器的存储器架构包括FLASH(闪存)和RAM(随机存取存储器),它们在存储和处理数据方面有不同的用途和特性。以下是对STM32微控制器中FLASH和RAM存储的详细介绍:

1. FLASH存储器
特性与用途
非易失性存储器:断电后数据仍然保持不变。
程序存储:用于存储固件、应用程序代码、启动代码以及常量数据。
容量:容量大小取决于具体的STM32型号,一般从几十KB到几MB不等。
擦写次数:具有有限的擦写次数,一般为1万到10万次左右,具体取决于型号。
访问速度:读取速度较快,但写入速度较慢且需要先擦除再写入。
典型使用场景
存储固件和应用程序代码。
存储不可变的数据,如配置参数和校准数据。
在某些应用中,用于存储少量的需要掉电保存的数据。

使用特权

评论回复
沙发
梅花香自123|  楼主 | 2024-5-31 01:50 | 只看该作者
2. RAM存储器
特性与用途
易失性存储器:断电后数据会丢失。
数据存储:用于存储运行时的数据、堆栈、全局变量和中间计算结果。
容量:容量大小取决于具体的STM32型号,一般从几KB到几百KB不等。
访问速度:读写速度快,适合频繁读写操作。
典型使用场景
存储应用程序运行时的数据和变量。
存储临时数据和中间计算结果。
用作堆栈空间和动态内存分配(堆)。

使用特权

评论回复
板凳
梅花香自123|  楼主 | 2024-5-31 01:50 | 只看该作者
存储映射
STM32微控制器通常具有一个存储器映射表,定义了不同存储区域在内存地址空间中的位置。例如,对于一个典型的STM32微控制器:

FLASH存储器:从地址0x08000000开始。
RAM存储器:从地址0x20000000开始。
具体的存储映射取决于微控制器的型号和系列,可以参考对应的参考手册(Reference Manual)。

使用特权

评论回复
地板
梅花香自123|  楼主 | 2024-5-31 01:50 | 只看该作者
示例代码:存储器的使用
以下是一个简单的示例代码,展示如何在STM32中使用FLASH和RAM存储器。

使用RAM存储数据
#include "stm32f4xx.h"

int main(void) {
    // 定义在RAM中的变量
    uint32_t data = 0x12345678;
   
    // 初始化硬件
    SystemInit();

    // 使用RAM中的数据
    data += 1;

    while (1) {
        // 主循环
    }
}

使用特权

评论回复
5
梅花香自123|  楼主 | 2024-5-31 01:50 | 只看该作者
使用FLASH存储和读取数据
写入FLASH存储需要特殊的操作,因为需要先擦除再写入:

#include "stm32f4xx.h"

#define FLASH_USER_START_ADDR   ADDR_FLASH_SECTOR_6   // 你需要根据具体芯片选择合适的地址
#define FLASH_USER_END_ADDR     ADDR_FLASH_SECTOR_7

void Write_Flash(uint32_t address, uint32_t data) {
    // 解锁FLASH控制寄存器
    HAL_FLASH_Unlock();

    // 擦除FLASH
    FLASH_Erase_Sector(FLASH_SECTOR_6, VOLTAGE_RANGE_3);

    // 写入数据到FLASH
    HAL_FLASH_Program(TYPEPROGRAM_WORD, address, data);

    // 锁定FLASH控制寄存器
    HAL_FLASH_Lock();
}

int main(void) {
    uint32_t address = FLASH_USER_START_ADDR;
    uint32_t data = 0x12345678;

    // 初始化硬件
    SystemInit();

    // 写入数据到FLASH
    Write_Flash(address, data);

    // 读取数据从FLASH
    uint32_t read_data = *(uint32_t *)address;

    while (1) {
        // 主循环
    }
}

使用特权

评论回复
6
梅花香自123|  楼主 | 2024-5-31 01:50 | 只看该作者
在实际应用中,请务必参考STM32的参考手册和数据手册,了解详细的存储器特性和操作方法。此外,使用HAL库简化了对硬件的操作,但仍需谨慎处理FLASH的写操作,确保数据的完整性和系统的稳定性。

使用特权

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

本版积分规则

84

主题

1039

帖子

0

粉丝