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

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

认识内部的存储划分。

在这里插入图片描述

这是芯片内部的存储划分,需要注意的是,我们自己的程序也是存储在这些位置,所以需要存储在应用程序没有使用的内存区域,关于如何查看内存的划分,可以去查看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));

下载进入单片机
在这里插入图片描述
可以看到,我们数组的内容,已经被写入进了内部flash,、

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页