我是靠谱客的博主 开放啤酒,最近开发中收集的这篇文章主要介绍STM32用hal库读写flash,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

 

最后

以上就是开放啤酒为你收集整理的STM32用hal库读写flash的全部内容,希望文章能够帮你解决STM32用hal库读写flash所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(85)

评论列表共有 0 条评论

立即
投稿
返回
顶部