单片机 > 单片机程序设计 > 详情

stm32中flash的写入与读取

发布时间:2020-12-24 发布时间:
|

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中读取和写入数据的关键在于数据的大小以及对地址的处理上,其他部分基本一样。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机基础知识之二