附上写入代码
enum bsp_err STM_FLASH_Write(uint32_t WriteAddr, uint32_t *pBuffer, uint32_t NumToWrite)
{
uint32_t start_addr;
uint32_t end_addr;
uint16_t begin_sec;
uint16_t end_sec;
FLASH_Status status = FLASH_COMPLETE;
if ( (WriteAddr < STM32_FLASH_BASE)
|| (WriteAddr > STM32_FLASH_END)
|| (WriteAddr % 4 != 0) )
{
return BSP_ERR_FLASH_ADDR; // invalid address
}
FLASH_Unlock();
FLASH_DataCacheCmd(DISABLE);
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
start_addr = WriteAddr;
end_addr = WriteAddr + (NumToWrite * 4);
begin_sec = STM_FLASH_GetFlashSector(start_addr);
end_sec = STM_FLASH_GetFlashSector(end_addr);
while ( begin_sec <= end_sec )
{
status = FLASH_EraseSector(begin_sec, VoltageRange_3); //VCC=2.7~3.6VÖ®¼ä!!
if ( status != FLASH_COMPLETE )
{
FLASH_DataCacheCmd(ENABLE);
FLASH_Lock();
return BSP_ERR_FLASH_ERASE; // error
}
if ( begin_sec == FLASH_Sector_11)
{
begin_sec += 40;
}
else
{
begin_sec += 8;
}
}
while ( start_addr < end_addr ) // write data
{
if ( FLASH_ProgramWord(start_addr, *pBuffer) != FLASH_COMPLETE )
{
FLASH_DataCacheCmd(ENABLE);
FLASH_Lock();
return BSP_ERR_FLASH_WRITE;
}
start_addr += 4u;
pBuffer++;
}
FLASH_DataCacheCmd(ENABLE);
FLASH_Lock();
return BSP_ERR_OK;
}