資源簡介
基于stm32 開發(fā)板的flash讀寫程序,可以保存用戶數(shù)據(jù),測試ok!

代碼片段和文件信息
#include?“ev_stm32_falsh.h“
uint16_t?Flash_Write_Without_check(uint32_t?iAddress?uint8_t?*buf?uint16_t?iNumByteToWrite)?
{
uint16_t?i?=?0;
volatile?FLASH_Status?FLASHStatus?=?FLASH_COMPLETE;
while((i? {
FLASHStatus?=?FLASH_ProgramHalfWord(iAddress?*(uint16_t*)buf);
i?=?i+2;
iAddress?=?iAddress?+?2;
buf?=?buf?+?2;
}
return?iNumByteToWrite;
}
int?Flash_Write(uint32_t?iAddress?uint8_t?*buf?uint32_t?iNbrToWrite)?
{
uint32_t?sectoraddress;
uint32_t?iNumByteToWrite?=?iNbrToWrite;
uint16_t?sectoroffset;
uint16_t?sectorremainspace;??
uint16_t?i?=?0;????
uint8_t?tmp[FLASH_PAGE_SIZE];
volatile?FLASH_Status?FLASHStatus?=?FLASH_COMPLETE;
FLASH_UnlockBank1();
sectoraddress?=?iAddress?&?(~(FLASH_PAGE_SIZE?-?1?))?;//扇區(qū)地址?
sectoroffset?=?iAddress?&?(FLASH_PAGE_SIZE?-?1);?????//在扇區(qū)內(nèi)的偏移
sectorremainspace?=?FLASH_PAGE_SIZE?-?sectoroffset;???????????//扇區(qū)剩余空間大小?
if(iNumByteToWrite<=sectorremainspace)?sectorremainspace?=?iNumByteToWrite;//不大于4096個字節(jié)
while(?1?)?{
Flash_Read(sectoraddress?tmp?FLASH_PAGE_SIZE);???//讀出整個扇區(qū)
for(i=0;i {???????//校驗數(shù)據(jù)
if(tmp[sectoroffset+i]!=0XFF)?break;???????//需要擦除?
}
if(i FLASHStatus?=?FLASH_ErasePage(sectoraddress);?//擦除這個扇區(qū)
if(FLASHStatus?!=?FLASH_COMPLETE)
return?-1;
for(i=0;i {???//復(fù)制
tmp[i+sectoroffset]=buf[i];???
}
Flash_Write_Without_check(sectoraddress?tmp?FLASH_PAGE_SIZE);//寫入整個扇區(qū)??
}?else?{
Flash_Write_Without_check(iAddressbufsectorremainspace);//寫已經(jīng)擦除了的直接寫入扇區(qū)剩余區(qū)間.
}
if(iNumByteToWrite==sectorremainspace)?//寫入結(jié)束了
break;
else?
{
sectoraddress?+=?FLASH_PAGE_SIZE;
sectoroffset?=?0;//偏移位置為0?
buf?+=?sectorremainspace;??//指針偏移
iAddress?+=?sectorremainspace;//寫地址偏移????
iNumByteToWrite?-=?sectorremainspace;??//字節(jié)數(shù)遞減
if(iNumByteToWrite>FLASH_PAGE_SIZE)?
sectorremainspace=FLASH_PAGE_SIZE;//下一個扇區(qū)還是寫不完
else?
sectorremainspace?=?iNumByteToWrite;??//下一個扇區(qū)可以寫完了
}
}
FLASH_LockBank1();
return?iNbrToWrite;?
}
int?Flash_Read(uint32_t?iAddress?uint8_t?*buf?uint32_t?iNbrToRead)?
{
int?i?=?0;
while(i? *(buf?+?i)?=?*(__IO?uint8_t*)?iAddress++;
i++;
}
return?i;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2495??2014-09-26?10:50??application\ev_stm32_falsh.c
?????文件????????878??2014-09-26?11:27??application\ev_stm32_falsh.h
?????文件????????537??2014-09-26?11:00??application\startup.c
?????目錄??????????0??2014-09-26?11:30??application
-----------?---------??----------?-----??----
?????????????????3910????????????????????4
評論
共有 條評論