单片机 flash 擦写(先擦除 后写恣意字节)

[复制链接]
发表于 2026-2-9 22:58:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
许多环境下,我们写扇区病不肯定512对齐,以致有的环境下跨扇区读写,为了满足这个需求,举行判定先擦除再写,而且不影响之前扇区的数据

擦除再写:
  1. #define FLASH_TOTAL      0x50000 // 共320K
  2. #define BLOCK_START_ADDR 0x2F800 // 前190K为COS预留空间
  3. #define PAGE_SIZE        512     // ! 注意这里并不是页大小,而是可以擦除的最小单位
  4. /**
  5. * @description: 先擦除再写
  6. * @detail:
  7. * @return {*}
  8. * @author: lkc
  9. */
  10. ULONG DRV_FLASHWriteWithErase(UCHAR *pucSrc, ULONG ulDes, ULONG ulBytelen)
  11. {
  12.     USHORT unalignment_bytes1 = 0, unalignment_bytes2 = 0, totle_len = 0;
  13.     UCHAR buf1[PAGE_SIZE], buf2[PAGE_SIZE], i;
  14.     if (ulBytelen <= 0 || ulDes < BLOCK_START_ADDR || (ulDes + ulBytelen) >= FLASH_TOTAL) {
  15.         return FALSE;
  16.     }
  17.     /*判断是否地址PAGESIZEbyte对齐*/
  18.     if ((ulDes % PAGE_SIZE) != 0) {
  19.         unalignment_bytes1 = ulDes % PAGE_SIZE; // X1的数据长度,即需要保护的数据
  20.         DRV_FlashRead(buf1, ulDes - unalignment_bytes1, unalignment_bytes1); // 读取X1的数据到buf1中
  21.     }
  22.     /*判断写入长度PAGESIZE字节对齐,*/
  23.     if (((ulDes + ulBytelen) % PAGE_SIZE) != 0) {
  24.    
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表