我想用内部FLASH 保存几十个自己的数据,但是我尝试写入的时候发现写入时间需要4-5S才能完成。
uint32_t secpos; /* 扇区地址 */ uint16_t secoff; /* 扇区内偏移地址(16位字计算) */ uint16_t secremain; /* 扇区内剩余地址(16位字计算) */ uint16_t i; uint32_t offaddr; /* 去掉0X08000000后的地址 */ if (waddr < STM32_FLASH_BASE || (waddr >= (STM32_FLASH_BASE + 1024 * STM32_FLASH_SIZE))) { return; /* 非法地址 */ } FLASH_Unlock(); /* FLASH解锁 */ FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP |FLASH_FLAG_WRPRTERR); offaddr = waddr - STM32_FLASH_BASE; /* 实际偏移地址. */ secpos = offaddr / STM32_SECTOR_SIZE; /* 扇区地址 0~255 for STM32F103ZET6 */ secoff = (offaddr % STM32_SECTOR_SIZE) / 2; /* 在扇区内的偏移(2个字节为基本单位.) */ secremain = STM32_SECTOR_SIZE / 2 - secoff; /* 扇区剩余空间大小 */ if (length <= secremain) { secremain = length; /* 不大于该扇区范围 */ } while (1) { flash_read(secpos * STM32_SECTOR_SIZE + STM32_FLASH_BASE, g_flashbuf, STM32_SECTOR_SIZE / 2); /* 读出整个扇区的内容 */ for (i = 0; i < secremain; i++) /* 校验数据 */ { if (g_flashbuf[secoff + i] != 0XFFFF) { break; /* 需要擦除 */ } } if (i < secremain) /* 需要擦除 */ { FLASH_ErasePage(secpos * STM32_SECTOR_SIZE + STM32_FLASH_BASE); //Erase 4KB for (i = 0; i < secremain; i++) /* 复制 */ { g_flashbuf[i + secoff] = pbuf[i]; } flash_write_nocheck(secpos * STM32_SECTOR_SIZE + STM32_FLASH_BASE, g_flashbuf, STM32_SECTOR_SIZE / 2); /* 写入整个扇区 */ } else { flash_write_nocheck(waddr, pbuf, secremain); /* 写已经擦除了的,直接写入扇区剩余区间. */ } if (length == secremain) { break; /* 写入结束了 */ } else /* 写入未结束 */ { secpos++; /* 扇区地址增1 */ secoff = 0; /* 偏移位置为0 */ pbuf += secremain; /* 指针偏移 */ waddr += secremain * 2; /* 写地址偏移(16位数据地址,需要*2) */ length -= secremain; /* 字节(16位)数递减 */ if (length > (STM32_SECTOR_SIZE / 2)) { secremain = STM32_SECTOR_SIZE / 2; /* 下一个扇区还是写不完 */ } else { secremain = length; /* 下一个扇区可以写完了 */ } } } FLASH_Lock();; /* 上锁 */
热门产品 :
CH592: RISC-V内核BLE5.4无线MCU