基于hal库实现stm32内部flash的读取

stm32的内部flash在我们实际运行的时候。很多时候并没有用完,还有许许多多的空闲内存,因此可以利用内部flash存储一些数据。我使用的是stm32f407vet6 ,所以就用这个芯片来进行演示。

认识内部的存储划分。

基于hal库实现stm32内部flash的读取

这是芯片内部的存储划分,需要注意的是,我们自己的程序也是存储在这些位置,所以需要存储在应用程序没有使用的内存区域,关于如何查看内存的划分,可以去查看map文件,在此不展开叙述。
由于读写内部flash不需要特别的外设,只需要开启一个串口就好了。
使用的是cube生成的

开始读写

读写内部flash只需要几个结构体,函数就可以了。
HAL_FLASH_Unlock(); 解锁内部flash函数,默认内部flASH是锁上的,使用的时候,需要解锁。

FLASH_EraseInitTypeDef 擦除内部flash的结构体,
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) 擦除函数

需要注意的是 与flash有关的函数,在两个文件中
#include “stm32f4xx_hal_flash.h”
#include "stm32f4xx_hal_flash_ex.h"

因此需要包含着两个头文件。

HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) flash写入数据函数,需要注意的是第一个参数,决定写入数据的类型 八位,16位 32 位。

 

 

uint8_t erase_flash(uint32_t sector_start,uint32_t sector_end)

{
 FLASH_EraseInitTypeDef EraseInitStruct;
 uint32_t SECTORError = 0;
 uint32_t address,i;
 HAL_FLASH_Unlock(); 解锁内部flash
 //FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
 
 EraseInitStruct.TypeErase     = FLASH_TYPEERASE_SECTORS; 以扇区进行擦除
 EraseInitStruct.VoltageRange  = FLASH_VOLTAGE_RANGE_3;/* ÒÔ¡°×Ö¡±µÄ´óС½øÐвÙ×÷ */
 EraseInitStruct.Sector        = sector_start;  擦除扇区的首  如果要擦除第五扇区,此处就填入5
 EraseInitStruct.NbSectors     = sector_end; 擦除扇区的尾,如果擦除第五扇区,就填入6  if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK)
 {   return -1;
 }
 //address=add;  HAL_FLASH_Lock();
 }           uint8_t writedata_to_flash(uint8_t *data,uint32_t len,uint32_t address)
{
 HAL_FLASH_Unlock();
 //FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
 uint32_t i=0,temp;
 
 for(i=0;i<len;i++)
 {
  if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, (uint32_t)address, *data) == HAL_OK)
  注意我是以8位数据写入的,因此第一个参数写入的byte ,如果要想写入32位的数据,改为对应的参数就行了。
    {
      address = address + 1;
      data=data+1;     }
   else
    {
         /*дÈë³ö´í£¬·µ»Ø£¬Êµ¼ÊÓ¦ÓÃÖпɼÓÈë´¦Àí */
         return -1;
    }    }
 HAL_FLASH_Lock();
 }  

此函数是将一个uint8_t类型的数组,写入对应的内部flash。

有了这来个函数,就能对内部flash进行读写的

在主函数进行申明

uint8_t flag=10,a[8]={22,33,44,55,66,77,88}; 即将写入到内存的数据
uint32_t writeFlashData = 0x55555555;
uint32_t addr = ((uint32_t)0x08020000);这是第五扇区的开始地址

erase_flash(5,6); 擦除第五扇区
writedata_to_flash(a, 8,addr);将数组写入
读取数据,查看是否写入成功
printf("at address:0x%x, read value:0x%d\r\n", addr, *(__IO uint8_t*)addr);
printf("at address:0x%x, read value:0x%d\r\n", addr+1, *(__IO uint8_t*)(addr+1));
printf("at address:0x%x, read value:0x%d\r\n", addr+2, *(__IO uint8_t*)(addr+2));
printf("at address:0x%x, read value:0x%d\r\n", addr+3, *(__IO uint8_t*)(addr+3));

基于hal库实现stm32内部flash的读取

 

 

 

 

     

 

上一篇:node 登陆拦截中间件(egg)


下一篇:API与C#的数据类型对应关系表