这篇文档用了记录之前未添加的代码,具体含义请百度,谢谢;
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