• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: 其他
  • 标签: stm32  flash  

资源简介

基于stm32 开发板的flash读写程序,可以保存用户数据,测试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 < iNumByteToWrite) && (FLASHStatus == FLASH_COMPLETE))
{
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 )) ;//扇区地址 
sectoroffset = iAddress & (FLASH_PAGE_SIZE - 1);     //在扇区内的偏移
sectorremainspace = FLASH_PAGE_SIZE - sectoroffset;           //扇区剩余空间大小 

if(iNumByteToWrite<=sectorremainspace) sectorremainspace = iNumByteToWrite;//不大于4096个字节

while( 1 ) {
Flash_Read(sectoraddress tmp FLASH_PAGE_SIZE);   //读出整个扇区
for(i=0;i {       //校验数据
if(tmp[sectoroffset+i]!=0XFF) break;       //需要擦除 
}
if(i FLASHStatus = FLASH_ErasePage(sectoraddress); //擦除这个扇区
if(FLASHStatus != FLASH_COMPLETE)
return -1;
for(i=0;i {   //复制
tmp[i+sectoroffset]=buf[i];   
}
Flash_Write_Without_check(sectoraddress tmp FLASH_PAGE_SIZE);//写入整个扇区  
} else {
Flash_Write_Without_check(iAddressbufsectorremainspace);//写已经擦除了的直接写入扇区剩余区间.
}

if(iNumByteToWrite==sectorremainspace) //写入结束了
break;
else 
{
sectoraddress += FLASH_PAGE_SIZE;
sectoroffset = 0;//偏移位置为0 
buf += sectorremainspace;  //指针偏移
iAddress += sectorremainspace;//写地址偏移    
iNumByteToWrite -= sectorremainspace;  //字节数递减
if(iNumByteToWrite>FLASH_PAGE_SIZE) 
sectorremainspace=FLASH_PAGE_SIZE;//下一个扇区还是写不完
else 
sectorremainspace = iNumByteToWrite;  //下一个扇区可以写完了
}

}

FLASH_LockBank1();
return iNbrToWrite; 
}

int Flash_Read(uint32_t iAddress uint8_t *buf uint32_t iNbrToRead) 
{
int i = 0;
while(i < iNbrToRead ){
*(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


评论

共有 条评论