STM32用hal库读写flash

本文档介绍了STM32F103VET6的HAL库中用于Flash操作的函数,包括写入16位数据、批量写入、读取数据等,重点展示了`Flash_WriteU16bit`、`Flash_WriteUbit16Len`和`Flash_ReadU16bit`等核心函数的实现及测试函数`flash_testFunction`。
摘要由CSDN通过智能技术生成

这篇文档用了记录之前未添加的代码,具体含义请百度,谢谢;

1、“.c” 文件

/******************************************************************************************
*** File Name		: user_flashfunction
*** Description	:	
***	writer											timer										version
***	XXXX											2020/6/18								V0.1
******************************************************************************************/ 



/******************************************************************************************
***										include file																											***
******************************************************************************************/
#include "user_flashfunction.h"
#include "user_alldefine.h"

/******************************************************************************************
***										Macro definition																									***
******************************************************************************************/ 




/******************************************************************************************
***										struct and enum variable																					***
******************************************************************************************/ 




/******************************************************************************************
***										global variable																										***
******************************************************************************************/ 

Flash_TypeDef flash_data;


/******************************************************************************************
***										function source code																							***
******************************************************************************************/ 


/******************************************************************************************
*** Name						: None
*** Parameters(in)	: None
*** Return value 		: None
*** Description:
***	writer											timer										version
***	XXX													XXX/XX/XX								XXX
******************************************************************************************/

/******************************************************************************************
*** 函数名称: 无
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:无
***	编者										时间										版本
***	XXX											XXX/XX/XX								XXX
******************************************************************************************/ 
//************************\    /\    /********** |    ***********************************//
//*************************\  /  \  /*********** |    ***********************************//
//**************************\/    \/************ |_ _ ***********************************//




/******************************************************************************************
*** 函数名称: Flash_WriteU16bit
*** 输入参数: Flash_Address (uint32_t) ,Flash_Data (uint16_t)
*** 返 回 值: 
*** 说    明:
***	编者										时间										版本
***	XXX										2020/7/14								V0.1
******************************************************************************************/
uint8_t Flash_WriteU16bit(uint32_t Flash_Address, uint16_t Flash_Data)
{
	
		/*Variable used for Erase procedure*/
	FLASH_EraseInitTypeDef EraseInitStruct;
	uint32_t	PAGEError = 0;
	uint8_t		retError = 0;
		
	/* Unlock the Flash to enable the flash control register */
	HAL_FLASH_Unlock();
	
	__disable_irq();
	
	/* Erase the user Flash area */
  /* Fill EraseInit structure*/
  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
  EraseInitStruct.PageAddress = Flash_Address;
  EraseInitStruct.NbPages     = 1;	//1 page
	
	if(HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
  {
		retError = 1;			//error
	}
	
	if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Flash_Address, Flash_Data) == HAL_OK)
	{
		;
	}
	else
	{
		retError = 1;			//error
	}
	
	__enable_irq();    
	
  /* Lock the Flash to disable the flash control register  */
  HAL_FLASH_Lock();
	
	return retError;
	
	
	
}

/******************************************************************************************
*** 函数名称: Flash_WriteUbit16Len
*** 输入参数: Flash_Address (uint32_t) ,Flash_Data (uint16_t), Flash_size(uint16_t)
*** 返 回 值: retError: 0:succeed		1:error
*** 说    明:写一个数组数据到flash中,地址间隔宽度 0x04
***	编者										时间										版本
***	XX										2020/7/14								V0.1
******************************************************************************************/
uint8_t Flash_WriteUbit16Len(uint32_t Flash_Address, uint16_t *Flash_Data, uint16_t Flash_size)
{
	/*Variable used for Erase procedure*/
	FLASH_EraseInitTypeDef EraseInitStruct;
	uint32_t	PAGEError = 0;
	uint16_t	flash_count=0;
	uint8_t		retError = 0;	
	
	/* Unlock the Flash to enable the flash control register */
	HAL_FLASH_Unlock();
	
	/* Erase the user Flash area */

  /* Fill EraseInit structure*/
  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
  EraseInitStruct.PageAddress = Flash_Address;
  EraseInitStruct.NbPages     = 1;	//1 page
	
	if(HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
  {
		retError = 1;			//error
	}
	
	//loop write buff
	for(flash_count =0; flash_count < Flash_size; flash_count ++)
	{
		if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Flash_Address, (*Flash_Data)) == HAL_OK)
		{
			Flash_Address = Flash_Address + 0x04;
			Flash_Data ++;
		}
		else
		{
			retError = 1;		//error
		}
	}
	
  /* Lock the Flash to disable the flash control register  */
  HAL_FLASH_Lock();
	
	return retError;
}

/******************************************************************************************
*** 函数名称: Flash_ReadU16bit
*** 输入参数: Flash_Address (uint32_t) 
*** 返 回 值: read flash	 (uint16_t)
*** 说    明:读取16位 长度的数据,地址间隔宽度 0x04
***	编者										时间										版本
***	XX										2020/7/14								V0.1
******************************************************************************************/
uint16_t Flash_ReadU16bit(uint32_t Flash_Address)
{
	uint16_t ret_read;
	ret_read = *(__IO uint32_t *)Flash_Address;
	return ret_read;
}

/******************************************************************************************
*** 函数名称: Flash_ReadU16bit
*** 输入参数: Flash_Address (uint32_t) , *Flash_Data(uint16_t), Flash_size(uint16_t)
*** 返 回 值: read flash	 (uint16_t)
*** 说    明:读取flash数据到数组中
***	编者										时间										版本
***	XX										2020/7/14								V0.1
******************************************************************************************/
uint16_t Flash_ReadU16bitLen(uint32_t Flash_Address, uint16_t *Flash_Data, uint16_t Flash_size)
{
	uint16_t	ret_read;
	uint16_t	flash_count=0;
	
	//loop read buff
	for(flash_count =0; flash_count <Flash_size; flash_count ++)
	{
		ret_read = *(__IO uint32_t *)Flash_Address;
		*Flash_Data = ret_read;
		Flash_Address = Flash_Address + 0x04;
		Flash_Data ++;
	}
	return ret_read;
}


/******************************************************************************************
*** 函数名称: flash_testFunction
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:flash 测试函数
***	编者										时间										版本
***	XX										2020/7/14								V0.1
******************************************************************************************/ 
void flash_testFunction(void)
{
	uint16_t flash_Wdata,flash_Rdata;
	uint16_t test_cont;
	
	flash_Wdata = 0xaabb;
	Flash_WriteU16bit(FLASH_WriteAddress, flash_Wdata);
	flash_Rdata = Flash_ReadU16bit(FLASH_ReadAddress);
	
	for(test_cont =0; test_cont <10; test_cont ++)
	{
		flash_data.flash_writebuff[test_cont] = 0x2340 + test_cont;
	}
	
	Flash_WriteUbit16Len(FLASH_WriteAddress, flash_data.flash_writebuff, 10);
	Flash_ReadU16bitLen(FLASH_ReadAddress, flash_data.flash_readbuff, 10);

	
}






2、”.h“文件

/******************************************************************************************
*** File Name		: user_flashfunction
*** Description	:	读写flash文件
***	writer											timer										version
***	XXXX											2020/6/18								V0.1
******************************************************************************************/ 

#ifndef __USER_FLASHFUNCTION_H
#define __USER_FLASHFUNCTION_H



/******************************************************************************************
***										include file																											***
******************************************************************************************/
#include "main.h"





/******************************************************************************************
***										Macro definition																									***
******************************************************************************************/ 

//31页小容量产品:		0x0800 7C00 - 0x0800 7FFF
//127页中容量产品:	0x0801 FC00 - 0x0801 FFFF 
//255页大容量产品:	0x0807 F800 - 0x0807 FFFF 
//此程序STM32F103VET6	 256K flash 
//读写flash时清除整页数据,所以最好按照数据存取数据

#define  FLASH_WriteAddress     0x8007800            	//flash 保存数据地址写在靠后位置,防止破坏主程序
#define  FLASH_ReadAddress      FLASH_WriteAddress		//两个地址间长度为4,所以一页只能写1024/4 = 256个数据

#define FLASH_BUFFSIZE 10			//FLASH buff length, length_max = 256

typedef struct {
	uint16_t flash_readbuff[FLASH_BUFFSIZE];			//flash	读数据buff
	uint16_t flash_writebuff[FLASH_BUFFSIZE];			//flash	写数据buff
}Flash_TypeDef;







/******************************************************************************************
***										struct and enum variable																					***
******************************************************************************************/ 




/******************************************************************************************
***										global variable																										***
******************************************************************************************/ 
extern Flash_TypeDef flash_data;





/******************************************************************************************
***										global function																										***
******************************************************************************************/ 
extern uint8_t Flash_WriteU16bit(uint32_t Flash_Address, uint16_t Flash_Data);
extern uint8_t Flash_WriteUbit16Len(uint32_t Flash_Address, uint16_t *Flash_Data, uint16_t Flash_size);
extern uint16_t Flash_ReadU16bit(uint32_t Flash_Address);
extern uint16_t Flash_ReadU16bitLen(uint32_t Flash_Address, uint16_t *Flash_Data, uint16_t Flash_size);
extern void flash_testFunction(void);









#endif 



 

链接:https://gitee.com/My_Bulb/wl-open-projects/tree/master/STM32例程/STM32的hal库flsh

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32基于HAL库Flash读写操作都是通过HAL库封装的Flash API来实现的。其主要函数包括HAL_FLASH_Unlock、HAL_FLASH_Lock、HAL_FLASH_Program、HAL_FLASH_Erase、HAL_FLASH_GetError等。 1. 解锁Flash操作。在进行Flash操作之前,需要先对Flash进行解锁操作,在操作结束后再进行锁定操作。函数为HAL_FLASH_Unlock()。 2. 写Flash操作。写Flash操作可以使用函数: HAL_FLASH_Program(typeDef FlashType, uint32_t Address, uint64_t Data)。FlashType表示数据类型,可以表示不同长度的数据,Address代表写入的地址,Data代表要写入的数据。 3. 擦除Flash操作。擦除Flash操作可以使用函数: HAL_FLASH_Erase(typeDef CfTypr, uint32_t Address)。CfTypr表示擦除的区域类型,Address表示擦除的起始地址。 4. 锁定Flash操作。在进行Flash操作完毕之后,需要进行一次Flash的锁定操作。函数为HAL_FLASH_Lock()。 5. 错误处理。Flash操作过程中可能因为多种原因出现错误,因此需要使用HAL_FLASH_GetError()函数获取错误代码。 总的来说,STM32基于HAL库Flash读写操作比较简单,可以通过HAL库提供的API来简单实现。在进行操作时,需要注意解锁和锁定Flash操作的顺序以及错误处理。 ### 回答2: STM32基于HAL库flash是一种常见的储存芯片,它可以储存一定量的数据,并且可以重复读写。如果需要在STM32基于HAL库flash读写数据,可以按照以下步骤进行实现: 1. 使能flash 在使用flash前,需要首先使能flash模块。可以使用HAL库提供的函数HAL_FLASH_Unlock()来解锁flash,并使用HAL_FLASH_Lock()来锁定flash。 2. 擦除flash 如果需要对flash进行写入操作,需要先对flash进行擦除。可以使用HAL库提供的函数HAL_FLASHEx_Erase()对flash进行擦除操作。 3. 写入数据 擦除完成后,可以使用HAL库提供的函数HAL_FLASH_Program()来对flash进行写入操作。写入操作的具体实现需要传入写入地址、要写入的数据、以及数据长度等参数。 4. 读取数据 读取flash中的数据可以使用HAL库提供的函数HAL_FLASH_Program()来实现。读取操作的具体实现需要传入读取地址、缓冲区、以及数据长度等参数。 总的来说,在STM32基于HAL库flash中进行数据读写较为直接,可以使用HAL库中提供的函数实现。需要注意的是,在读写flash时需要谨慎操作,以免误删数据或对flash芯片造成不必要的损坏。同时,还需要注意read防止读取未写入或者已被擦除的数据。这就需要读取数据时,要仔细判断储存数据的地址是否正确,避免出现错误导致数据读取不正确。 ### 回答3: STM32基于HAL库FLASH读写数据可以分为如下几个步骤: 1. 初始化FLASH:使用HAL_FLASH_Unlock()函数将FLASH解锁,在使用FLASH之前需要先解锁,否则FLASH无法操作。然后使用HAL_FLASH_GetError()函数来判断FLASH是否解锁成功。 2. 写入数据:使用HAL_FLASH_Program()函数来写入数据,参数有三个,第一个是Flash Type,第二个是写入的地址,第三个是数据。例如: uint32_t Address = 0x08010000; //写入数据的地址,从0x08010000开始 uint32_t Data = 0x12345678; //要写入的数据 HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, Data); 在写入数据之后,需要判断是否写入成功。使用HAL_FLASH_GetError()函数来判断Flash是否写入成功。 3. 读取数据:使用指针来读取FLASH中的数据,例如: uint32_t Address = 0x08010000; //读取数据的起始地址 uint32_t DATA = *(__IO uint32_t*)Address; //使用指针读取数据 在读取数据之后,可以将读取到的数据打印在串口终端上,进行测试。 4. 擦除数据:使用HAL_FLASHEx_Erase()函数来擦除Flash中的数据,擦除Flash时,需要注意只能擦除整个扇区,所以需要计算好擦除的扇区大小和起始地址。 例如:擦除从0x08010000开始的一整个Sector: FLASH_EraseInitTypeDef pEraseInit; HAL_FLASH_Unlock(); pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; pEraseInit.Sector = FLASH_SECTOR_4; pEraseInit.Banks = FLASH_BANK_1; pEraseInit.NbSectors = 1; pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3; uint32_t SectorError = 0; HAL_FLASHEx_Erase(&pEraseInit, &SectorError); 以上就是STM32基于HAL库FLASH读写数据的基本步骤和详细操作方法。在实际开发中,需要注意的是,每次写入和擦除FLASH都需要判断是否操作成功,并且在每次写入的时候,需要确保写入的地址是合法的,即不会覆盖其他程序或数据,否则会造成程序运行异常。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值