打印
[STM32H7]

使用STM32H7的银行模式(Dual-bank Flash)

[复制链接]
733|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
突然下起雨|  楼主 | 2024-7-30 18:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32H7系列有些型号支持Dual-bank模式,可以在一个银行擦除的同时从另一个银行运行程序。不过具体到STM32H750XBHx是否支持Dual-bank需要确认其具体特性。如果支持,可以将程序和数据分开存储在不同的银行,实现无中断的数据更新。

示例代码
以下是一个简单的示例代码,展示如何在程序运行时保存数据到Flash中,并确保不擦除程序部分的Flash:

#include "stm32h7xx_hal.h"

// Flash存储地址(注意选择程序存储区之外的地址)
#define FLASH_USER_START_ADDR   0x08020000   // 根据具体情况选择合适地址
#define DATA_SIZE               128          // 数据大小(字节)

// 数据缓冲区
uint8_t data_to_save[DATA_SIZE];
uint8_t data_read[DATA_SIZE];

void Flash_Write(uint32_t address, uint8_t *data, uint32_t size) {
    // 解锁Flash
    HAL_FLASH_Unlock();

    // 擦除Flash页
    FLASH_EraseInitTypeDef EraseInitStruct;
    uint32_t PageError;

    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.Banks = FLASH_BANK_1;
    EraseInitStruct.Page = (address - FLASH_BASE) / FLASH_PAGE_SIZE;
    EraseInitStruct.NbPages = 1;

    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
        // 处理擦除错误
    }

    // 写数据到Flash
    for (uint32_t i = 0; i < size; i++) {
        if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address + i, data[i]) != HAL_OK) {
            // 处理写入错误
        }
    }

    // 锁定Flash
    HAL_FLASH_Lock();
}

void Flash_Read(uint32_t address, uint8_t *data, uint32_t size) {
    for (uint32_t i = 0; i < size; i++) {
        data[i] = *(uint8_t*)(address + i);
    }
}

int main(void) {
    // 初始化HAL库
    HAL_Init();

    // 初始化数据
    for (int i = 0; i < DATA_SIZE; i++) {
        data_to_save[i] = i;
    }

    // 写数据到Flash
    Flash_Write(FLASH_USER_START_ADDR, data_to_save, DATA_SIZE);

    // 从Flash读取数据
    Flash_Read(FLASH_USER_START_ADDR, data_read, DATA_SIZE);

    // 比较数据
    for (int i = 0; i < DATA_SIZE; i++) {
        if (data_to_save[i] != data_read[i]) {
            // 数据不匹配,处理错误
        }
    }

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


使用特权

评论回复
沙发
突然下起雨|  楼主 | 2024-7-30 18:21 | 只看该作者
在STM32H750XBH上使用Flash存储数据时,要避免擦除程序部分的Flash。可以考虑使用外部存储、双分区方案、日志式存储、磨损均衡等方法来实现数据的可靠存储。使用Dual-bank模式也是一种有效的解决方案,如果芯片支持。

使用特权

评论回复
板凳
突然下起雨|  楼主 | 2024-7-30 18:21 | 只看该作者
本帖最后由 突然下起雨 于 2024-7-30 18:23 编辑

双分区技术
将128KB的Flash分为两个分区,一个用于存储程序,另一个用于存储数据。通过这种方式,可以避免擦除程序部分的Flash块。

双分区方案
分区1:存储程序代码。
分区2:存储数据。
这种方法的缺点是只能在程序占用空间较小时使用,并且会浪费一些Flash空间。

使用特权

评论回复
地板
突然下起雨|  楼主 | 2024-7-30 18:22 | 只看该作者
使用耐久性数据存储方法
为了避免频繁擦除和写入,使用一些耐久性数据存储方法,例如:

日志式存储
采用日志式存储(Log-structured storage),每次写入新数据时,将数据写入Flash的不同位置,避免频繁擦除同一区域。通过维护一个索引来查找最新的数据。

可磨损均衡(Wear leveling)
使用软件算法实现磨损均衡,均匀分布Flash擦写次数,延长Flash寿命。这通常需要自定义的Flash管理算法。

使用特权

评论回复
5
突然下起雨|  楼主 | 2024-7-30 18:22 | 只看该作者
避免擦除程序部分

如果程序代码和数据都放在同一个128KB的Flash块中,擦除操作会影响程序代码的完整性。这种情况下,推荐的做法是:

使用外部存储
考虑使用外部存储器(如EEPROM、外部Flash等)来存储数据。这可以避免频繁擦写内部Flash,从而减少对程序运行的影响和Flash的磨损。

使用内部RAM存储
如果数据量较小且需要频繁更新,可以在运行时将数据存储在内部RAM中,但这仅适用于掉电不丢失数据的需求。

使用特权

评论回复
6
抹茶妹妹| | 2024-7-30 18:53 | 只看该作者
在STM32H7系列中,Dual-bank模式允许在一个Flash银行擦除的同时从另一个银行运行程序。

使用特权

评论回复
7
裤脚口感好| | 2024-7-31 23:55 | 只看该作者
具体到STM32H750XBHx型号,您可以确认它是否支持Dual-bank模式,通过查看STMicroelectronics的官方数据手册和参考手册。

使用特权

评论回复
8
裤脚口感好| | 2024-7-31 23:55 | 只看该作者
如果支持Dual-bank模式,您可以利用这一特性实现程序的无中断更新。

使用特权

评论回复
9
lmq0v9| | 2024-8-31 12:49 | 只看该作者
STM32H7系列的某些型号确实支持Dual-bank Flash模式,这种模式允许在一个Flash银行擦除和编程时,另一个银行可以继续运行程序。

使用特权

评论回复
10
无法去污粉| | 2024-8-31 21:30 | 只看该作者
对于STM32H750XBHx型号,其是否支持Dual-bank模式和如何配置需要查阅具体的参考手册和数据手册。

使用特权

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

本版积分规则

38

主题

284

帖子

1

粉丝