打印
[STM32F4]

Flash 操作的基本步骤

[复制链接]
49|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
米多0036|  楼主 | 2024-9-30 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.1 擦除 Flash
在 Flash 写入之前,通常需要对目标页进行擦除操作。擦除操作会将页的所有数据位设置为 1,然后才能将某些位编程为 0。

1.2 写入 Flash
写入 Flash 时,每次只能将 1 位编程为 0,不能直接从 0 改回 1,所以在写入之前需要先进行擦除操作。

1.3 读取 Flash
Flash 读取操作相对简单,可以直接通过读取内存地址来完成。

使用特权

评论回复
沙发
米多0036|  楼主 | 2024-9-30 17:53 | 只看该作者
2. Flash 操作的注意事项
Flash 的写操作需要保证目标地址已经擦除过。
Flash 存储在写入和擦除时会有一个限制的写入次数。
Flash 的擦除是按页(Page)进行的,每次擦除的页数要根据具体的芯片型号来确定。

使用特权

评论回复
板凳
米多0036|  楼主 | 2024-9-30 17:54 | 只看该作者
3. STM32 Flash 操作的 HAL 库函数
STM32 HAL 提供了以下与 Flash 相关的函数:

HAL_FLASH_Unlock():解锁 Flash 的写保护。
HAL_FLASH_Lock():锁定 Flash,防止写操作。
HAL_FLASH_Program():写入指定的 Flash 地址。
HAL_FLASHEx_Erase():擦除指定的 Flash 页。
直接通过指针访问进行 Flash 的读取操作。

使用特权

评论回复
地板
米多0036|  楼主 | 2024-9-30 17:54 | 只看该作者
4. Flash 操作示例代码
下面是一段简单的代码示例,演示如何通过 HAL 库来擦除、写入和读取 STM32 的 Flash 存储。

使用特权

评论回复
5
米多0036|  楼主 | 2024-9-30 17:55 | 只看该作者
4.1 头文件和宏定义
c

#include "stm32f4xx_hal.h"  // 根据具体芯片选择头文件

// 定义 Flash 操作的起始地址,选择用户区的某个位置
#define FLASH_USER_START_ADDR   0x08020000  // 用户 Flash 区域的起始地址(根据具体芯片的 Flash 分布选择)

// 定义写入的数据
uint32_t data_to_write = 0x12345678;  // 示例数据

使用特权

评论回复
6
米多0036|  楼主 | 2024-9-30 17:55 | 只看该作者
4.2 擦除 Flash
首先,我们需要对目标 Flash 页进行擦除操作。

c
void Flash_Erase(uint32_t PageAddress)
{
    // 定义擦除类型结构体
    FLASH_EraseInitTypeDef EraseInitStruct;
    uint32_t PageError = 0;
   
    // 解锁 Flash 操作
    HAL_FLASH_Unlock();
   
    // 配置擦除参数
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;  // 擦除类型:扇区擦除
    EraseInitStruct.Sector = FLASH_SECTOR_5;              // 擦除的扇区(根据地址选择扇区)
    EraseInitStruct.NbSectors = 1;                        // 擦除的扇区数量
    EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 电压范围:2.7V - 3.6V
   
    // 执行擦除操作
    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
    {
        // 如果擦除失败,可以处理错误
        // PageError 会存储错误的扇区
    }
   
    // 锁定 Flash 防止进一步的写入
    HAL_FLASH_Lock();
}

使用特权

评论回复
7
米多0036|  楼主 | 2024-9-30 17:55 | 只看该作者
4.3 写入 Flash
擦除完成后,可以将数据写入 Flash。

c
void Flash_Write(uint32_t Address, uint32_t Data)
{
    // 解锁 Flash 操作
    HAL_FLASH_Unlock();
   
    // 写入 32 位数据到指定地址
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, Data) != HAL_OK)
    {
        // 处理写入错误
    }
   
    // 锁定 Flash
    HAL_FLASH_Lock();
}

使用特权

评论回复
8
米多0036|  楼主 | 2024-9-30 17:55 | 只看该作者
4.4 读取 Flash
读取操作可以直接通过访问 Flash 的地址来实现。由于 Flash 存储在内存映射区域,可以直接通过指针访问。

c
uint32_t Flash_Read(uint32_t Address)
{
    // 直接读取地址处的数据
    return *(__IO uint32_t*)Address;
}

使用特权

评论回复
9
米多0036|  楼主 | 2024-9-30 17:56 | 只看该作者
4.5 完整示例
综合擦除、写入和读取操作的完整示例:

c

使用特权

评论回复
10
米多0036|  楼主 | 2024-9-30 17:56 | 只看该作者
4.5 完整示例
综合擦除、写入和读取操作的完整示例:

cint main(void)
{
    HAL_Init();
   
    // 初始化系统时钟等(省略)

    // 擦除 Flash
    Flash_Erase(FLASH_USER_START_ADDR);
   
    // 写入数据到 Flash
    Flash_Write(FLASH_USER_START_ADDR, data_to_write);
   
    // 从 Flash 读取数据
    uint32_t read_data = Flash_Read(FLASH_USER_START_ADDR);
   
    // 验证读取的数据是否正确
    if (read_data == data_to_write)
    {
        // 数据验证成功
    }
    else
    {
        // 数据验证失败,处理错误
    }

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

使用特权

评论回复
11
米多0036|  楼主 | 2024-9-30 17:56 | 只看该作者
地址对齐要求:Flash 写入时地址需要 4 字节对齐(32 位对齐),如果你要写入其他大小的数据(如 16 位、8 位),需要调整写入操作。

使用特权

评论回复
12
米多0036|  楼主 | 2024-9-30 17:56 | 只看该作者
Flash 寿命:Flash 的擦写次数是有限的,不同型号的 Flash 擦写次数限制在 1 万到 10 万次之间。频繁擦写可能会导致 Flash 损坏。

使用特权

评论回复
13
米多0036|  楼主 | 2024-9-30 17:56 | 只看该作者
电压和时序要求:确保在擦除和写入操作期间,供电电压保持稳定,否则可能会导致数据损坏。

使用特权

评论回复
14
米多0036|  楼主 | 2024-9-30 17:56 | 只看该作者
通过这些步骤,你可以在 STM32 上通过 HAL 库完成 Flash 的擦除、写入和读取操作。

使用特权

评论回复
15
在水一方00| | 2024-9-30 23:50 | 只看该作者
然后才能将某些位编程为 0

使用特权

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

本版积分规则

96

主题

1333

帖子

0

粉丝