首先,数据是地址!!!!!!!野火的直接传数据,这点错了。

其次,h74系列一次写256bit,用uint32定义的话是要为长度为8的数组(最方便)

以下是修改好的代码部分

//
// Created by 26364 on 2025/10/28.
//

#include "My_InFlash.h"

/* STM32H743IIT6 内部FLASH扇区定义(Bank 1,共1MB)
   地址范围:0x08000000 - 0x080FFFFF(2MB总FLASH的前1MB,后1MB为Bank 2,此处暂不涉及) */
#define ADDR_FLASH_SECTOR_0_BANK1       ((uint32_t)0x08000000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_1_BANK1       ((uint32_t)0x08020000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_2_BANK1       ((uint32_t)0x08040000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_3_BANK1       ((uint32_t)0x08060000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_4_BANK1       ((uint32_t)0x08080000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_5_BANK1       ((uint32_t)0x080A0000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_6_BANK1       ((uint32_t)0x080C0000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_7_BANK1       ((uint32_t)0x080E0000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_END_BANK1     ((uint32_t)0x08100000) /* Bank 1结束地址(不含) */
#define ADDR_FLASH_SYS_BANK1            ((uint32_t)0x1FF00000) /* 128 Kbytes */


#define ADDR_FLASH_SECTOR_0_BANK2       ((uint32_t)0x08100000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_1_BANK2       ((uint32_t)0x08120000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_2_BANK2       ((uint32_t)0x08140000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_3_BANK2       ((uint32_t)0x08160000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_4_BANK2       ((uint32_t)0x08180000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_5_BANK2       ((uint32_t)0x081A0000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_6_BANK2       ((uint32_t)0x081C0000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_7_BANK2       ((uint32_t)0x081E0000) /* 128 Kbytes */
#define ADDR_FLASH_SECTOR_END_BANK2     ((uint32_t)0x08200000) /* Bank 2结束地址(不含) */
#define ADDR_FLASH_SYS_BANK2            ((uint32_t)0x1FF40000) /* 128 Kbytes */


/* 准备写入的测试数据(32位) */
uint32_t dat[8] = {0x12345678, 0x87654321, 0x9ABCDEF0, 0xFEDCBA98, 0x76543210, 0xFEDCBA98, 0x76543210};
uint32_t* p = (uint32_t*)dat;
#define FLASH_USER_START_ADDR   ADDR_FLASH_SECTOR_6_BANK1
#define FLASH_USER_END_ADDR     ADDR_FLASH_SECTOR_7_BANK1  /* 注意:实际写入到扇区7的起始地址,若需覆盖扇区7需改为ADDR_FLASH_SECTOR_END */

/**
  * @brief  根据地址获取所在扇区编号(适配H743 Bank 1)
  * @param  Address:FLASH地址(需在Bank 1范围内)
  * @retval 扇区编号(与HAL库FLASH_SECTOR_x宏匹配)
  */
static uint32_t GetSector_BANK1(uint32_t Address) {
    uint32_t sector = 0;
    if ((Address >= ADDR_FLASH_SECTOR_0_BANK1) && (Address < ADDR_FLASH_SECTOR_1_BANK1)) {
        sector = FLASH_SECTOR_0;
    } else if ((Address >= ADDR_FLASH_SECTOR_1_BANK1) && (Address < ADDR_FLASH_SECTOR_2_BANK1)) {
        sector = FLASH_SECTOR_1;
    } else if ((Address >= ADDR_FLASH_SECTOR_2_BANK1) && (Address < ADDR_FLASH_SECTOR_3_BANK1)) {
        sector = FLASH_SECTOR_2;
    } else if ((Address >= ADDR_FLASH_SECTOR_3_BANK1) && (Address < ADDR_FLASH_SECTOR_4_BANK1)) {
        sector = FLASH_SECTOR_3;
    } else if ((Address >= ADDR_FLASH_SECTOR_4_BANK1) && (Address < ADDR_FLASH_SECTOR_5_BANK1)) {
        sector = FLASH_SECTOR_4;
    } else if ((Address >= ADDR_FLASH_SECTOR_5_BANK1) && (Address < ADDR_FLASH_SECTOR_6_BANK1)) {
        sector = FLASH_SECTOR_5;
    } else if ((Address >= ADDR_FLASH_SECTOR_6_BANK1) && (Address < ADDR_FLASH_SECTOR_7_BANK1)) {
        sector = FLASH_SECTOR_6;
    } else if ((Address >= ADDR_FLASH_SECTOR_7_BANK1) && (Address < ADDR_FLASH_SECTOR_END_BANK1)) {
        sector = FLASH_SECTOR_7;
    } else {
        /* 地址超出Bank 1范围,返回无效值(实际应用中可增加错误处理) */
        sector = 0xFF;
    }
    return sector;
}
/**
  * @brief  根据地址获取所在扇区编号(适配H743 Bank 2)
  * @param  Address:FLASH地址(需在Bank 2范围内)
  * @retval 扇区编号(与HAL库FLASH_SECTOR_x宏匹配)
  */
static uint32_t GetSector_BANK2(uint32_t Address) {
    uint32_t sector = 0;
    if ((Address >= ADDR_FLASH_SECTOR_0_BANK2) && (Address < ADDR_FLASH_SECTOR_1_BANK2)) {
        sector = FLASH_SECTOR_0;
    } else if ((Address >= ADDR_FLASH_SECTOR_1_BANK2) && (Address < ADDR_FLASH_SECTOR_2_BANK2)) {
        sector = FLASH_SECTOR_1;
    } else if ((Address >= ADDR_FLASH_SECTOR_2_BANK2) && (Address < ADDR_FLASH_SECTOR_3_BANK2)) {
        sector = FLASH_SECTOR_2;
    } else if ((Address >= ADDR_FLASH_SECTOR_3_BANK2) && (Address < ADDR_FLASH_SECTOR_4_BANK2)) {
        sector = FLASH_SECTOR_3;
    } else if ((Address >= ADDR_FLASH_SECTOR_4_BANK2) && (Address < ADDR_FLASH_SECTOR_5_BANK2)) {
        sector = FLASH_SECTOR_4;
    } else if ((Address >= ADDR_FLASH_SECTOR_5_BANK2) && (Address < ADDR_FLASH_SECTOR_6_BANK2)) {
        sector = FLASH_SECTOR_5;
    } else if ((Address >= ADDR_FLASH_SECTOR_6_BANK2) && (Address < ADDR_FLASH_SECTOR_7_BANK2)) {
        sector = FLASH_SECTOR_6;
    } else if ((Address >= ADDR_FLASH_SECTOR_7_BANK2) && (Address < ADDR_FLASH_SECTOR_END_BANK2)) {
        sector = FLASH_SECTOR_7;
    } else {
        /* 地址超出Bank 1范围,返回无效值(实际应用中可增加错误处理) */
        sector = 0xFF;
    }
    return sector;
}


/**
  * @brief  内部FLASH读写测试(适配STM32H743IIT6)
  * @retval 0:测试成功;-1:测试失败
  */
int InternalFlash_Test(void) {
    uint32_t FirstSector = 0;
    uint32_t NbOfSectors = 0;
    uint32_t SECTORError = 0;
    uint32_t Address = 0;
    __IO uint32_t Data32 = 0;
    __IO uint32_t MemoryProgramStatus = 0;
    FLASH_EraseInitTypeDef EraseInitStruct = {0};

    /* 2. FLASH解锁 */
    if (HAL_FLASH_Unlock() != HAL_OK) {
        return -1; /* 解锁失败 */
    }

    /* 3. 计算需要擦除的扇区范围 */
    FirstSector = GetSector_BANK1(FLASH_USER_START_ADDR);
    if (FirstSector == 0xFF)
        return -1; /* 起始地址无效 */

    uint32_t LastSector = GetSector_BANK1(FLASH_USER_END_ADDR - 1); /* 取结束地址的前一个字节所在扇区 */
    if (LastSector == 0xFF)
        return -1; /* 结束地址无效 */

    NbOfSectors = LastSector - FirstSector + 1; /* 包含起始和结束扇区 */

    /* 4. 配置擦除参数(适配H7) */
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
    EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_2; /* H7常用范围:2.1V-3.6V */
    EraseInitStruct.Sector = FirstSector;
    EraseInitStruct.NbSectors = NbOfSectors;
    EraseInitStruct.Banks = FLASH_BANK_1; /* 明确指定操作Bank 1 */

    /* 执行扇区擦除 */
    if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK) {
        HAL_FLASH_Lock();
        return -1; /* 擦除失败 */
    }

    /* 5. 写入数据(H7支持32位字编程) */
    Address = FLASH_USER_START_ADDR;
    while (Address < FLASH_USER_END_ADDR) {
        /* 使用H7支持的编程类型:FLASH_TYPEPROGRAM_WORD(32位) */
        if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, Address, (uint32_t)p) == HAL_OK) {
            Address += 4 * 8; /* 每次写入4*8字节 */
        } else {
            HAL_FLASH_Lock();
            return -1; /* 写入失败 */
        }
    }

    /* 6. FLASH上锁 */
    HAL_FLASH_Lock();

    /* 7. 校验写入数据 */
    Address = FLASH_USER_START_ADDR;
    MemoryProgramStatus = 0;
    while (Address < FLASH_USER_END_ADDR) {
        Data32 = *(__IO uint32_t*)Address;
        if (Data32 != dat[0]) {
            MemoryProgramStatus++;
        }
        Address += 4 * 8;
    }

    /* 返回校验结果 */
    return (MemoryProgramStatus == 0) ? 0 : -1;
}

更多推荐