stm32中flash的写入与读取

发布者:leader4最新更新时间:2020-01-31 来源: eefocus关键字:stm32  flash  写入与读取 手机看文章 扫描二维码
随时随地手机看文章

stm32中flash应用的常见函数:

1.擦除函数:

FLASH_Status FLASH_ErasePage(u32 Page_Address)只要()里面的数是flash第xx页中对应的任何一个地址!就是擦除xx页全部内容。


2.flash写入函数:

STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)

入参:

WriteAddr:要写入flash中的首地址,stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同,因此从理论上来说该地址可以从0x08000000进行写入,但实际要考虑代码所占空间大小,所以该地址要错过代码段的地址,以防擦除时将代码也擦除了。

pBuffer:该参数为要写入flash中的数据的地址。

NumToWrite:该参数为要写入的数据的长度。


源码展示:

int STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)

    FLASH_EraseInitTypeDef FlashEraseInit;

    HAL_StatusTypeDef FlashStatus=HAL_OK;

    uint32_t SectorError=0;

    uint32_t addrx=0;

    uint32_t endaddr=0;

    int result = 0;

    if(WriteAddr      return -1; //非法地址

    }

    HAL_FLASH_Unlock();             //解锁

    addrx=WriteAddr; //写入的起始地址

    endaddr=WriteAddr+(NumToWrite)*4; //写入的结束地址

    if(addrx<0X1FFF0000)

    {

        while(addrx        {

             if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区

            {   

              FlashEraseInit.TypeErase=FLASH_TYPEERASE_PAGES;            //擦除类型,整页擦除 

              FlashEraseInit.PageAddress=FLASH_SAVE_ADDR;                //要擦除的页

              FlashEraseInit.NbPages=1;                                  //一次只擦除一个页

              if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK) 

              {

                result = -1;

                break;//发生错误了

              }

            }else addrx+=4;

            FLASH_WaitForLastOperation(FLASH_WAITETIME);                //等待上次操作完成

        }

    }

    FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME);            //等待上次操作完成

    if(FlashStatus==HAL_OK)

    {

       while(WriteAddr       {

          if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,WriteAddr,*pBuffer)!=HAL_OK)//写入数据

          {

            result = -1;

            break; //写入异常

          }

          WriteAddr+=4;

          pBuffer++;

       }  

    }

    HAL_FLASH_Lock();           //上锁

    return result;


3.从flash中读取指定地址的字:


uint32_t STMFLASH_ReadWord(uint32_t faddr)

{

return *(uint32_t*)faddr; 

}


函数入参:

faddr:要读取字的地址。

4.从flash中读取多个字节函数:

STMFLASH_Read(uint32_t ReadAddr,uint8_t *pBuffer,uint32_t NumToRead)

函数入参:

ReadAddr:要读取数据的首地址。

pBuffer:读取数据之后的地址。

NumToRead:要读取字节的大小。

函数源码:


void STMFLASH_Read(uint32_t ReadAddr,uint8_t *pBuffer,uint32_t NumToRead)   

{

    uint32_t i;

    uint32_t tmp;

    for(i=0;i    {

        tmp = STMFLASH_ReadWord(ReadAddr + i*4);//读取4个字节.

        memcpy(&pBuffer[i*4], (void *)&tmp, 4);

    }

    //处理NumToRead不是4的整倍数情况,处理余数.

    int remain = NumToRead % 4;

    tmp = STMFLASH_ReadWord(ReadAddr + i*4);

    memcpy(&pBuffer[i*4], (void *)&tmp, remain);

}


总之从flash中读取和写入数据的关键在于数据的大小以及对地址的处理上,其他部分基本一样。

关键字:stm32  flash  写入与读取 引用地址:stm32中flash的写入与读取

上一篇:STM32——SD卡和FATFS文件系统
下一篇:STM32读写TXT时追加数据的方法

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved