stm32h743iit6 擦除内部flash和写入flash野火纠错
·
首先,数据是地址!!!!!!!野火的直接传数据,这点错了。
其次,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;
}
更多推荐
所有评论(0)