106 lines
2.4 KiB
C
106 lines
2.4 KiB
C
|
|
#include "flash.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
uint8_t Write_Buff[STM32L_PAGES_SIZE];
|
|||
|
|
|
|||
|
|
//读取FLASHYIGE 字节的数据
|
|||
|
|
uint8_t FLASH_ReadByte(uint32_t Addr)
|
|||
|
|
{
|
|||
|
|
return *(__IO uint8_t*)Addr;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//读取FLASH多个字节的数据
|
|||
|
|
void FLASH_ReadNByte(uint32_t Addr,uint8_t *pBuff,uint32_t Len)
|
|||
|
|
{
|
|||
|
|
uint32_t i;
|
|||
|
|
for(i = 0;i < Len;i++)
|
|||
|
|
{
|
|||
|
|
pBuff[i] = FLASH_ReadByte(Addr);
|
|||
|
|
Addr ++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*************************************
|
|||
|
|
函数名称:
|
|||
|
|
函数功能:向FLASH指地址写
|
|||
|
|
入数据
|
|||
|
|
函数参数:页号,写入缓冲区
|
|||
|
|
函数返回值:
|
|||
|
|
**************************************/
|
|||
|
|
void FLASH_WriteWord(uint32_t add,uint8_t *pBuff,uint32_t length)
|
|||
|
|
{
|
|||
|
|
unsigned short int i;
|
|||
|
|
|
|||
|
|
if(add < STM32L_FLASH_BASE)
|
|||
|
|
return;
|
|||
|
|
FLASH_Unlock();
|
|||
|
|
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGAERR\
|
|||
|
|
|FLASH_FLAG_SIZERR|FLASH_FLAG_OPTVERR|FLASH_FLAG_OPTVERRUSR);
|
|||
|
|
//FLASH_ErasePage(Addr);
|
|||
|
|
|
|||
|
|
/*******************************************/
|
|||
|
|
for(i = 0;i < length;i+=4)
|
|||
|
|
{
|
|||
|
|
FLASH_FastProgramWord(add+i,*(uint32_t *)pBuff);
|
|||
|
|
|
|||
|
|
//add += 4;
|
|||
|
|
pBuff += 4;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*******************************************/
|
|||
|
|
FLASH_Lock();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*************************************
|
|||
|
|
函数名称:
|
|||
|
|
函数功能:向FLASH指定页写
|
|||
|
|
入数据
|
|||
|
|
函数参数:页号,写入缓冲区
|
|||
|
|
函数返回值:
|
|||
|
|
**************************************/
|
|||
|
|
void FLASH_WritePage(uint16_t Page_Num,uint8_t *pBuff)
|
|||
|
|
{
|
|||
|
|
uint32_t Addr;
|
|||
|
|
unsigned short int i;
|
|||
|
|
if(Page_Num > STM32L_PAGES_NUM)
|
|||
|
|
return;
|
|||
|
|
Addr = Page_Num * STM32L_PAGES_SIZE + APP_ADDR;
|
|||
|
|
FLASH_Unlock();
|
|||
|
|
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGAERR\
|
|||
|
|
|FLASH_FLAG_SIZERR|FLASH_FLAG_OPTVERR|FLASH_FLAG_OPTVERRUSR);
|
|||
|
|
FLASH_ErasePage(Addr);
|
|||
|
|
|
|||
|
|
/*******************************************/
|
|||
|
|
for(i = 0;i < STM32L_PAGES_SIZE;i+=4)
|
|||
|
|
{
|
|||
|
|
FLASH_FastProgramWord(Addr,*(unsigned long int *)pBuff);
|
|||
|
|
Addr += 4;
|
|||
|
|
pBuff += 4;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*******************************************/
|
|||
|
|
FLASH_Lock();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Flash_Erase_Pages(uint32_t pagestart,uint16_t number)
|
|||
|
|
{
|
|||
|
|
uint32_t Addr;
|
|||
|
|
|
|||
|
|
if(pagestart > STM32L_PAGES_NUM)
|
|||
|
|
return;
|
|||
|
|
//Addr = pagestart * STM32L_PAGES_SIZE + APP_ADDR;
|
|||
|
|
FLASH_Unlock();
|
|||
|
|
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGAERR\
|
|||
|
|
|FLASH_FLAG_SIZERR|FLASH_FLAG_OPTVERR|FLASH_FLAG_OPTVERRUSR);
|
|||
|
|
for( uint16_t i=0;i<number;i++)
|
|||
|
|
{
|
|||
|
|
//Addr = (pagestart+i) * STM32L_PAGES_SIZE + APP_ADDR;
|
|||
|
|
Addr = (pagestart+i) * STM32L_PAGES_SIZE + STM32L_FLASH_BASE;
|
|||
|
|
FLASH_ErasePage(Addr);
|
|||
|
|
}
|
|||
|
|
FLASH_Lock();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|