芯片信号:STM32F072
流程:页擦除->写flash->读flash
1.页擦除
void Flash_ErasePage(uint32_t ulStartPage,uint8_t ucNmbPage)
{
FLASH_EraseInitTypeDef ErasePageSt;
uint32_t PageError = 0;
/* Fill EraseInit structure*/
ErasePageSt.TypeErase = FLASH_TYPEERASE_PAGES;
ErasePageSt.PageAddress = ulStartPage;
ErasePageSt.NbPages = ucNmbPage;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);
while (HAL_FLASHEx_Erase(&ErasePageSt, &PageError) != HAL_OK)
{
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);
}
HAL_FLASH_Lock();
}
2.按字节(8位)写
bool Flash_ByteWrite(uint32_t WriteAddr,uint8_t *pBuffer,uint8_t ByteNumToWrite)
{
uint16_t i = 0;
uint16_t Data = 0;
uint32_t Addr = 0;
uint16_t HalfWordNum = 0;
if(ByteNumToWrite % 2 == 0)
{
HalfWordNum = ByteNumToWrite / 2;
}
else
{
HalfWordNum = ByteNumToWrite / 2 + 1;
}
HAL_FLASH_Unlock();
for(i = 0;i < HalfWordNum;i++)
{
Data = (*(pBuffer + i * 2 + 1) << 8) | *(pBuffer + i * 2);
Addr = WriteAddr + 2 * i;
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Addr,Data);
}
HAL_FLASH_Lock();
return true;
}
3.按半字(16位)写
bool Flash_HalfWordWrite(uint32_t WriteAddr, uint16_t *pBuffer, uint32_t HalfWordNum)
{
uint16_t i = 0;
HAL_FLASH_Unlock();
for(i = 0;i < HalfWordNum;i++)
{
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,WriteAddr + i * 2,*(pBuffer + i));
}
HAL_FLASH_Lock();
return true;
}
4.按字节(8位)读
void Flash_ByteRead(uint32_t ReadAddr, uint8_t *pBuffer, uint32_t ByteNumToRead)
{
uint32_t i = 0;
for(i = ReadAddr; i<(ReadAddr+ByteNumToRead); i++)
{
pBuffer[i-ReadAddr] = *(__IO uint8_t *)i;
}
}
5.读写实验
uint8_t i = 0;
void flashReadWriteTest(void)
{
if(i == 0)
{
Flash_ErasePage(0x08008000,1);
Flash_HalfWordWrite(0x08008000,(uint16_t*)&gg,4);
//Flash_ByteWrite(0x08008000,(uint8_t*)&gg,8);
Flash_ByteRead(0x08008000,(uint8_t*)&gg1,8);
i =1;
}
}
实验结果