打印
[STM32F4]

【转】STM32F4-FLASH闪存编程原理

[复制链接]
672|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
说书先生|  楼主 | 2016-11-3 19:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一、简介:

    首先是对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、写操作:

[cpp] view plain copy
print?


  • 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、读操作:

[cpp] view plain copy
print?


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



四、总结:

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


发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

191

帖子

0

粉丝