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();
|
||
}
|
||
|
||
|
||
|