只有写一个地址功能,有其他需求的需要自己完善
#ifndef __STM32FLASH_H
#define __STM32FLASH_H
#include "main.h"
#define FLASH_USER_START_ADDR (FLASH_BASE + FLASH_PAGE_SIZE * 96) /* Start @ of user Flash area */
#define FLASH_USER_END_ADDR FLASH_USER_START_ADDR + FLASH_PAGE_SIZE * 32 /* End @ of user Flash area */
#define FLASH_PEKEY1 ((uint32_t)0x89ABCDEFU)
#define FLASH_PEKEY2 ((uint32_t)0x02030405U)
void STMFLASH_Unlock(void);
void STMFLASH_Write(uint32_t WriteAddr,uint32_t Data);
uint32_t STMFLASH_Read(uint32_t ReadAddr);
#endif
#include "main.h"
void STMFLASH_Unlock(void)
{
if(FLASH->PECR&FLASH_PECR_PRGLOCK)
{
if(FLASH->PECR&FLASH_PECR_PELOCK)
{
FLASH->PEKEYR=FLASH_PEKEY1;
FLASH->PEKEYR=FLASH_PEKEY2;
}
FLASH->PRGKEYR=FLASH_PRGKEY1;
FLASH->PRGKEYR=FLASH_PRGKEY2;
}
}
void STMFLASH_lock(void)
{
FLASH->PECR|=FLASH_PECR_PRGLOCK;
}
unsigned char STMFLASH_Status(void)
{
unsigned char res = 0;
if((FLASH->SR & FLASH_FLAG_BSY)==FLASH_FLAG_BSY )
{
res = 1;
}
if( ((FLASH->SR&FLASH_FLAG_WRPERR) ==FLASH_FLAG_WRPERR) ||
((FLASH->SR&FLASH_FLAG_PGAERR) ==FLASH_FLAG_PGAERR) ||
((FLASH->SR&FLASH_FLAG_SIZERR) ==FLASH_FLAG_SIZERR) ||
((FLASH->SR&FLASH_FLAG_OPTVERR) ==FLASH_FLAG_OPTVERR)||
((FLASH->SR&FLASH_FLAG_RDERR) ==FLASH_FLAG_RDERR) ||
((FLASH->SR&FLASH_FLAG_FWWERR) ==FLASH_FLAG_FWWERR) ||
((FLASH->SR&FLASH_FLAG_NOTZEROERR) ==FLASH_FLAG_NOTZEROERR) )
{
res = 2;
}
return res;
}
unsigned char STMFlash_WaitDone(unsigned short time)
{
unsigned char res;
do
{
res = STMFLASH_Status();
if(res != 1)
break;
time--;
}while(time);
if(0 == time)
res = 0xff;
return res;
}
unsigned char STMFlash_ErasePage(uint32_t padd)
{
unsigned char res = 0;
FLASH->PECR |= FLASH_PECR_ERASE;
FLASH->PECR |= FLASH_PECR_PROG;
*(__IO uint32_t *)(uint32_t)(FLASH_USER_START_ADDR & ~(FLASH_PAGE_SIZE - 1)) = 0x00000000;
STMFlash_WaitDone(0x3fff);
FLASH->PECR&=~FLASH_PECR_PROG;
FLASH->PECR&=~FLASH_PECR_ERASE;
return res;
}
void STMFLASH_Write(uint32_t WriteAddr,uint32_t Data)
{
STMFLASH_Unlock();
STMFlash_ErasePage(0);
STMFlash_WaitDone(0x3fff);
*(__IO uint32_t *)WriteAddr = Data;
STMFlash_WaitDone(0x3fff);
STMFLASH_lock();
}
uint32_t STMFLASH_Read(uint32_t ReadAddr)
{
uint32_t data32;
data32 = *(__IO uint32_t *)ReadAddr;
return data32;
}