加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

STM32F4——FLASH闪存编程原理

发布时间:2020-12-15 07:19:05 所属栏目:百科 来源:网络整理
导读:?一、简介: ??? 首先是对FLASH闪存的一个基本了解和认识。FLASH闪存分为多个模块。其中有:主存储器、系统存储器、OTP区域、选项字节。现在主要认识的是有关主存储器的相关结构,主存储器分为了多个扇区,每个扇区都有相关字节的存储区域,通过扇区的方式来

?一、简介:

??? 首先是对FLASH闪存的一个基本了解和认识。FLASH闪存分为多个模块。其中有:主存储器、系统存储器、OTP区域、选项字节。现在主要认识的是有关主存储器的相关结构,主存储器分为了多个扇区,每个扇区都有相关字节的存储区域,通过扇区的方式来管理内存可以方便数据的存储。

二、有关FLASH闪存的操作。

??? 1、锁定和解锁操作:

??? 为了对FLASH闪存数据做好一定的防护工作,需要在不必要操作闪存数据时锁定闪存,同时在需要操作闪存数据时执行解锁操作,相关库函数;void FLASH_Unlock(void)和void FLASH_Lock(void);

??? 2、写操作:

??? 根据写入的数据长度的不同可以分为字节、半字、字、双字写入。都分别提供了相应的函数。有关FLASH的写入操作下边还会做相关介绍。

??? 3、擦除操作:

??? 由于在向FLASH内存入数据之前先要保证FLASH中的数据时被擦除过的,所以在写入操作之前需要进行擦除操作。擦除可以整个扇区的擦除也可以做整片的擦除。

??? 4、读操作。

??? 对于读可以直接通过语句return *(vu32*)faddr来返回地址的数据值。

三、对FLASH运用的相关代码分析。

??? 1、写操作:

void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)	
{ 
  FLASH_Status status = FLASH_COMPLETE;
	u32 addrx=0;
	u32 endaddr=0;	
  if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;	//非法地址
	FLASH_Unlock();					//解锁 
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
 		
	addrx=WriteAddr;				//写入的起始地址
	endaddr=WriteAddr+NumToWrite*4;	//写入的结束地址
	if(addrx<0X1FFF0000)			//只有主存储区,才需要执行擦除操作!!
	{
		while(addrx<endaddr)		//扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
		{
			if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
			{   
				status=FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!!
				if(status!=FLASH_COMPLETE)break;	//发生错误了
			}else addrx+=4;
		} 
	}
	if(status==FLASH_COMPLETE)
	{
		while(WriteAddr<endaddr)//写数据
		{
			if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据
			{ 
				break;	//写入异常
			}
			WriteAddr+=4;
			pBuffer++;
		} 
	}
  FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁
} 

??? 对于写操作需要说明的是:由于数据写入过程中数据要写入的扇区必须是整个扇区都是被擦除的,所以有必要在擦除操作之前作出相应的判断,遍历扇区的地址是否是被全部擦除的,如果不是就需要对扇区做擦除操作。而且在写的前后分别做解锁和上锁操作。

??? 2、读操作:

//读取指定地址的半字(16位数据) 
u32 STMFLASH_ReadWord(u32 faddr)
{
	return *(vu32*)faddr; 
} 

//从指定地址开始读出指定长度的数据
void STMFLASH_Read(u32 ReadAddr,u32 NumToRead)   	
{
	u32 i;
	for(i=0;i<NumToRead;i++)
	{
		pBuffer[i]=STMFLASH_ReadWord(ReadAddr);//读取4个字节.
		ReadAddr+=4;//偏移4个字节.	
	}
}

?

四、总结:

??? 对于FLASH的学习只是做了一个初步的认识,可以对其做一些基本的操作和运用,其中还有很大一部分没有做相关认识,需要慢慢积累。这一段时间的学习总体感觉是:感觉学习过程是有很多的困难,但是还是在受着一个方向的吸引和强烈的好奇心,智能设备的运作和物联网相关技术的应用和操作,下边是一个了解到的一个人设计的一些有关家庭设备,虽然有些简易,但是却感觉非常有意思!!还有很多东西需要去学习和慢慢积累,呵呵.....

??? 视频演示:http://v.youku.com/v_show/id_XNzI2OTQyMTk2.html

??

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读