Tool/software:
bool flash_copy_region(void)
{
// 定义源地址和目标地址范围
const uint32_t SRC_ADDR_START = 0xA0000;
const uint32_t SRC_ADDR_END = 0xB7FFF;
const uint32_t DST_ADDR_START = 0x88000;
const uint32_t DST_ADDR_END = 0x9FFFF;
// 先擦除目标区域
if (!erase_dest_region(DST_ADDR_START, 0x18000UL))
{
return false;
}
// 检查地址范围大小是否一致
if ((SRC_ADDR_END - SRC_ADDR_START) != (DST_ADDR_END - DST_ADDR_START))
{
// 错误类型:地址范围大小不匹配
return false;
}
// 计算总字节数
const uint32_t TOTAL_BYTES = SRC_ADDR_END - SRC_ADDR_START + 1;
// 使用与原代码相同的缓冲区大小
static uint64_t data_block[256 / sizeof(uint64_t)];
const uint32_t BLOCK_SIZE = sizeof(data_block); // 256字节
// struct
// {
// uint16_t ErrType;
// uint16_t ErrData;
// } err_code = {0, 0};
// 源地址指针(指向Flash区域)
const uint8_t *src_ptr = (const uint8_t *)SRC_ADDR_START;
// 按块复制数据
uint32_t offset;
for (offset = 0; offset < TOTAL_BYTES; offset += BLOCK_SIZE)
{
uint32_t current_block_size = BLOCK_SIZE;
// 处理最后一个可能不完整的块
if (offset + BLOCK_SIZE > TOTAL_BYTES)
{
current_block_size = TOTAL_BYTES - offset;
}
// 计算当前目标地址
uint32_t dst_addr = DST_ADDR_START + offset;
// 通过指针直接从Flash读取数据(不依赖flash_read函数)
memcpy(data_block, &src_ptr[offset], current_block_size);
// 将数据写入目标地址
uint32_t i;
for (i = 0; i < current_block_size / sizeof(uint64_t); i++)
{
uint32_t write_addr = dst_addr + i * sizeof(uint64_t);
uint64_t write_data = data_block[i];
if (!flash_program(write_addr, &write_data))
{
return false;
}
}
}
return true;
}
#ifdef __cplusplus
#pragma CODE_SECTION(".TI.ramfunc");
#else
#pragma CODE_SECTION(flash_program, ".TI.ramfunc");
#endif
bool flash_program(uint32_t addr_align_4, const uint64_t * data)
{
bool ok = false;
EALLOW;
do
{
Fapi_StatusType oReturnCheck;
if(addr_align_4 % 4)
{
break;
}
oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)addr_align_4,
(uint16_t*)data,
4,
0,
0,
Fapi_DataOnly);//Fapi_AutoEccGeneration);
while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy);
if(oReturnCheck != Fapi_Status_Success)
{
break;
}
ok = true;
}while(0);
EDIS;
return ok;
}