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; }