
一句话: Flash 读写函数的参数名叫 NumToRead实际传的是 32 位字数。256 字节传了 256 → 越界 4 倍 → 栈被踩、数据飞。向上取整公式(字节数3U)/4U。适合谁读用内部 Flash 存配置、模拟 EEPROM 的嵌入式开发者。函数名骗了你void Dvr_Flash_Read(uint32_t addr, uint32_t *pBuf, uint32_t NumToRead);NumToRead——读名字是要读的数量。字节数字数看内部实现for (uint32_t i 0; i NumToRead; i) { *pBuf *(uint32_t *)addr; addr 4; // 每次跳 4 字节 }每次读 4 字节。NumToRead 是字数不是字节数。踩坑上位机要读 256 字节配置数据。代码写uint16_t u16Len 256; Dvr_Flash_Read(addr, pBuf, (uint32_t)u16Len); // 传了 256Flash 读 256 个字 1024 字节。越界读了 768 字节额外数据回给上位机——栈被踩。修复uint32_t u32Words ((uint32_t)u16Len 3U) / 4U; Dvr_Flash_Read(addr, pBuf, u32Words);3U / 4U 向上取整到 4 字节对齐。256 字节 → 64 字。不足 4 的倍数自动补整。凡是 Flash 函数都看一眼Flash 驱动通常以字为单位硬件最小写入单元。函数名里带 Size/Num/Len 但没写清单位的——翻进去看循环步长。addr 4 字操作addr 1 字节操作。不靠函数名判断。有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。