分片写入:
OPERATE_RET xxx_flash_write(UINT32_T addr, CONST UCHAR_T *src, UINT32_T size)
{
UCHAR_T ram_buffer[FR30XX_FLASH_WRITE_CHUNK_SIZE];
UINT32_T offset;
UINT32_T chunk_size;
if (src == NULL || !fr30xx_flash_address_normalize(addr, &offset) ||
!fr30xx_flash_range_valid(offset, size)) {
return OPRT_INVALID_PARM;
}
while (size > 0U) {
chunk_size = size > sizeof(ram_buffer) ? sizeof(ram_buffer) : size;
memcpy(ram_buffer, src, chunk_size);
if (flash_write(QSPI0, offset, chunk_size, ram_buffer) != 0U) {
return OPRT_COM_ERROR;
}
src += chunk_size;
offset += chunk_size;
size -= chunk_size;
}
return OPRT_OK;
}
OPERATE_RET xxx_flash_write(UINT32_T addr, CONST UCHAR_T *src, UINT32_T size)
{
UCHAR_T ram_buffer[FR30XX_FLASH_WRITE_CHUNK_SIZE]; // 栈上的中转缓冲区
while (size > 0U) {
// 1. 计算本次要写的块大小:取「剩余数据量」和「硬件限制块大小」的较小值
chunk_size = size > sizeof(ram_buffer) ? sizeof(ram_buffer) : size;
// 2. 把源数据拷贝到栈上的中转缓冲区(避免直接操作业务内存)
memcpy(ram_buffer, src, chunk_size);
// 3. 调用 FR 芯片的硬件 QSPI 写接口
if (flash_write(QSPI0, offset, chunk_size, ram_buffer) != 0U) {
return OPRT_COM_ERROR; // 硬件通信错误(SPI 超时 / Flash 无响应等)
}
// 4. 更新三个状态指针/计数器,移动到下一个块
src += chunk_size; // 源数据指针后移
offset += chunk_size; // Flash 偏移量后移
size -= chunk_size; // 剩余要写的数据量减少
}
return OPRT_OK;
}
1万+



被折叠的 条评论
为什么被折叠?



