Commit 6e5823cf authored by 李冠华's avatar 李冠华

feat:完善flash库功能,增加擦写失败返回值,flash读写文件独立

parent 8fdcdc6a
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
/**************************************************************************** /****************************************************************************
* !!! The following code should be generated by configuration tool !!! * * !!! The following code should be generated by configuration tool !!! *
* !!!单个数据空间最大写入的数据量为256 - 4 = 251byte !!! *
****************************************************************************/ ****************************************************************************/
/* EEPROM_BLOCK0_BUFFER_SIZE: 1个数据块的大小,1个数据块包括索引+反索引+存储的数据+校验值。(由于普冉只支持页擦和页写,所以最小的块大小也只能是1page)*/ /* EEPROM_BLOCK0_BUFFER_SIZE: 1个数据块的大小,1个数据块包括索引+反索引+存储的数据+校验值。(由于普冉只支持页擦和页写,所以最小的块大小也只能是1page)*/
......
#ifndef EMULATED_EEPROM_H__ #ifndef EMULATED_EEPROM_H__
#define EMULATED_EEPROM_H__ #define EMULATED_EEPROM_H__
#include "Flash_test.h" #include "Flash_User.h"
typedef enum typedef enum
{ {
...@@ -46,19 +46,19 @@ enum g_enEEPROMBlockName ...@@ -46,19 +46,19 @@ enum g_enEEPROMBlockName
}; };
#define EEPROM_BLOCK_UDS_FLAG_SIZE (16U)/*Life:20.0W*/ #define EEPROM_BLOCK_UDS_FLAG_SIZE (16U)/*Life:20.0W*/
#define EEPROM_BLOCK_UDS_S27_SIZE (12U)/*Life:20.0W*/ // #define EEPROM_BLOCK_UDS_S27_SIZE (12U)/*Life:20.0W*/
#define EEPROM_BLOCK_UDS_S2E_SIZE (12U)/*Life:20.0W*/ // #define EEPROM_BLOCK_UDS_S2E_SIZE (12U)/*Life:20.0W*/
#define EEPROM_BLOCK_UDS_CONFIG_SIZE (40U)/*Life:20.0W*/ // #define EEPROM_BLOCK_UDS_CONFIG_SIZE (40U)/*Life:20.0W*/
#define EEPROM_BLOCK_UDS_DTC_SIZE (56U)/*Life:20.0W*/ // #define EEPROM_BLOCK_UDS_DTC_SIZE (56U)/*Life:20.0W*/
#define EEPROM_BLOCK_ODO_SIZE (4U)/*Life:1000.0W*/ // #define EEPROM_BLOCK_ODO_SIZE (4U)/*Life:1000.0W*/
#define EEPROM_BLOCK_ODO_STAMP_SIZE (8U)/*Life:1000.0W*/ // #define EEPROM_BLOCK_ODO_STAMP_SIZE (8U)/*Life:1000.0W*/
#define EEPROM_BLOCK_TRIP_STAMP_SIZE (16U)/*Life:1000.0W*/ // #define EEPROM_BLOCK_TRIP_STAMP_SIZE (16U)/*Life:1000.0W*/
#define EEPROM_BLOCK_SERVICE_INFO_SIZE (56U)/*Life:20.0W*/ // #define EEPROM_BLOCK_SERVICE_INFO_SIZE (56U)/*Life:20.0W*/
#define EEPROM_TOTAL_BLOCK_NUM (1U)/*创建的独立的负载均衡空间的个数*/ #define EEPROM_TOTAL_BLOCK_NUM (1U)/*创建的独立的负载均衡空间的个数*/
#define EEPROM_TARGET_ERASE_NUM 4000000U #define EEPROM_TARGET_ERASE_NUM 4000000U /*目标擦写次数*/
#define EEPROM_TARGET_ERASE_NUM1 4000000U // #define EEPROM_TARGET_ERASE_NUM1 4000000U
/**************************************************************************** /****************************************************************************
* !!! End of code generation !!! * * !!! End of code generation !!! *
......
...@@ -235,13 +235,8 @@ uint8_t EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable, ...@@ -235,13 +235,8 @@ uint8_t EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
u32GivenSpaceSize += (pstBlockTable[i].u32EndAddr - pstBlockTable[i].u32StartAddr + 1U); u32GivenSpaceSize += (pstBlockTable[i].u32EndAddr - pstBlockTable[i].u32StartAddr + 1U);
} }
printf("u32DataSpaceSize wei : %x\n\r",u32DataSpaceSize);
printf("u32GivenSpaceSize wei : %x\n\r",u32GivenSpaceSize);
if (u32DataSpaceSize > u32GivenSpaceSize) if (u32DataSpaceSize > u32GivenSpaceSize)
{ {
printf("kong jian bu zu!\n\r");
return 0xFFU; return 0xFFU;
} }
...@@ -533,6 +528,7 @@ uint8_t EEPROM_Write_Block_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_ ...@@ -533,6 +528,7 @@ uint8_t EEPROM_Write_Block_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_
uint16_t u16WordNum; uint16_t u16WordNum;
uint16_t u16Result; uint16_t u16Result;
uint32_t u32EndAddr; uint32_t u32EndAddr;
Flash_User_Result_en_t flashResult;
EEPROM_Ctrl_Data_un_t unCtrlData; EEPROM_Ctrl_Data_un_t unCtrlData;
...@@ -598,23 +594,25 @@ uint8_t EEPROM_Write_Block_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_ ...@@ -598,23 +594,25 @@ uint8_t EEPROM_Write_Block_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_
g_stEEPROMAccess.pu16ProgData = g_pstEEPROMBlock[u16BlockID].pu16Data; g_stEEPROMAccess.pu16ProgData = g_pstEEPROMBlock[u16BlockID].pu16Data;
/*先执行写入区域的擦除操作*/ /*先执行写入区域的擦除操作*/
// g_stEEPROMAccess.u8State = EEPROM_WR_STATE_ERASE;
u32EndAddr = g_stEEPROMAccess.u32ProgAddr + ONE_PAGE_LEN - 1UL; u32EndAddr = g_stEEPROMAccess.u32ProgAddr + ONE_PAGE_LEN - 1UL;
g_pfnEEPROMMemErase(g_stEEPROMAccess.u32ProgAddr, u32EndAddr); flashResult = g_pfnEEPROMMemErase(g_stEEPROMAccess.u32ProgAddr, u32EndAddr);
if (flashResult == FLASH_CONTROL_PASS)
g_pfnEEPROMMemWrite(g_stEEPROMAccess.u32ProgAddr, g_stEEPROMAccess.pu16ProgData, (uint32_t)g_stEEPROMAccess.u16ProgLen); {
flashResult = g_pfnEEPROMMemWrite(g_stEEPROMAccess.u32ProgAddr, g_stEEPROMAccess.pu16ProgData, (uint32_t)g_stEEPROMAccess.u16ProgLen);
if (flashResult == FLASH_CONTROL_PASS)
{
u8Error = 0U;
}
else
{
u8Error = 1U;
}
}
else
{
u8Error = 1U;
}
g_stEEPROMAccess.u8State = EEPROM_WR_STATE_IDLE; g_stEEPROMAccess.u8State = EEPROM_WR_STATE_IDLE;
// if (g_stEEPROMAccess.u8State == EEPROM_WR_STATE_ERASE)
// {
// u32EndAddr = g_stEEPROMAccess.u32ProgAddr + (uint32_t)g_pstEEPROMBlock[u16BlockID].u16SectorSize - 1UL;
// g_pfnEEPROMMemErase(g_stEEPROMAccess.u32ProgAddr, u32EndAddr);
// }
// else
// {
// }
u8Error = 0U;
} }
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#define EMULATED_EEPROM_ACCESS_H__ #define EMULATED_EEPROM_ACCESS_H__
#include <stdint.h> #include <stdint.h>
#include "Flash_User.h"
#define ONE_PAGE_LEN 0x100U #define ONE_PAGE_LEN 0x100U
#define MAX_ERASE_FREQUENCY 100000U #define MAX_ERASE_FREQUENCY 100000U
...@@ -32,10 +33,10 @@ typedef struct ...@@ -32,10 +33,10 @@ typedef struct
// uint32_t* pu32Data; // uint32_t* pu32Data;
}EEPROM_Block_Access_st_t; }EEPROM_Block_Access_st_t;
typedef void (*EEPROM_Mem_Erase_Func_ptr_t) (uint32_t, uint32_t); typedef Flash_User_Result_en_t (*EEPROM_Mem_Erase_Func_ptr_t) (uint32_t, uint32_t);
typedef uint32_t (*EEPROM_Mem_Blank_Chk_Func_ptr_t) (uint32_t, uint32_t); typedef uint32_t (*EEPROM_Mem_Blank_Chk_Func_ptr_t) (uint32_t, uint32_t);
typedef void (*EEPROM_Mem_Read_Func_ptr_t) (uint32_t, uint16_t*, uint32_t); typedef void (*EEPROM_Mem_Read_Func_ptr_t) (uint32_t, uint16_t*, uint32_t);
typedef void (*EEPROM_Mem_Write_Func_ptr_t) (uint32_t, uint16_t*, uint32_t); typedef Flash_User_Result_en_t (*EEPROM_Mem_Write_Func_ptr_t) (uint32_t, uint16_t*, uint32_t);
typedef struct typedef struct
{ {
......
#include <string.h>
#include "Flash_User.h"
/*传入的数据长度需为字节数*/
void Flash_Data_Read(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len)
{
uint32_t addr = 0U;
for (uint32_t i = 0U; i < (u32Len / 2U); i++ )
{
u16Data[i] = HW16_REG(u32Addr + addr);
addr += 2U;
}
}
/*传入的数据长度需为字节数*/
Flash_User_Result_en_t Flash_Data_Write(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len)
{
// LoadBalancing_NVM_Data_st_t TestData;
static uint32_t copyData[64];
memset (copyData, 0, sizeof(copyData));
uint32_t flash_program_start = u32Addr; /* flash program start address */
uint32_t flash_program_end = 0U; /* flash program end address */
if (u32Len < 512u)
{
for (uint32_t i = 0; i < (u32Len / 4U); i++)
{
copyData[i] = ((u16Data[(2 * i) + 1] << 16U) + u16Data[2 * i]);
}
flash_program_end = u32Addr + 256U;
uint32_t *src = (uint32_t *)copyData;
/* Unlock Flash */
HAL_FLASH_Unlock();
while (flash_program_start < flash_program_end)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_PAGE, flash_program_start, src) == HAL_OK)/* Program */
{
flash_program_start += FLASH_PAGE_SIZE; /* flash Start point first page */
src += FLASH_PAGE_SIZE / 4; /* Update data point */
}
else
{
/* Lock Flash */
HAL_FLASH_Lock();
return FLASH_CONTROL_FAIL;
}
}
/* Lock Flash */
HAL_FLASH_Lock();
}
return FLASH_CONTROL_PASS;
}
Flash_User_Result_en_t Flash_Data_PageErase(uint32_t u32StartAddr, uint32_t u32EndAddr)
{
uint32_t PAGEError = 0;
FLASH_EraseInitTypeDef EraseInitStruct = {0};
/* Unlock Flash */
HAL_FLASH_Unlock();
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGEERASE; /* Erase type FLASH_TYPEERASE_PAGEERASE=Page erase, FLASH_TYPEERASE_SECTORERASE=Sector Erase */
EraseInitStruct.PageAddress = u32StartAddr; /* Erase Start Address */
EraseInitStruct.NbPages = ((u32EndAddr + 1 - u32StartAddr) / 0x100); /* Number of pages that need to be erased */
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK) /* Executing page erasure, PAGEError returns the page with the erasure error and 0xFFFFFFFF, indicating successful erasure */
{
/* Lock Flash */
HAL_FLASH_Lock();
return FLASH_CONTROL_FAIL;
}
else
{
;
}
/* Lock Flash */
HAL_FLASH_Lock();
return FLASH_CONTROL_PASS;
}
Flash_User_Result_en_t Flash_Data_SectorErase(uint32_t u32StartAddr, uint32_t u32EndAddr)
{
uint32_t PAGEError = 0;
FLASH_EraseInitTypeDef EraseInitStruct = {0};
/* Unlock Flash */
HAL_FLASH_Unlock();
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORERASE; /* Erase type FLASH_TYPEERASE_PAGEERASE=Page erase, FLASH_TYPEERASE_SECTORERASE=Sector Erase */
EraseInitStruct.SectorAddress = u32StartAddr;
EraseInitStruct.NbSectors = ((u32EndAddr + 1 - u32StartAddr) / 0x2000);
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK) /* Executing page erasure, PAGEError returns the page with the erasure error and 0xFFFFFFFF, indicating successful erasure */
{
/* Lock Flash */
HAL_FLASH_Lock();
return FLASH_CONTROL_FAIL;
}
else
{
;
}
/* Lock Flash */
HAL_FLASH_Lock();
return FLASH_CONTROL_PASS;
}
uint32_t Flash_Data_CheckBlank(uint32_t u32StartAddr, uint32_t u32EndAddr)
{
/*如果查空的范围内,数据不连续,混杂着空值。那就从检测到空值开始认为整个空间都是空的,后续的值也是垃圾数据,使用时先将选定区域全擦除,再写入值*/
uint32_t addr = 0;
uint32_t addroffset = 0U;
uint8_t blankFlag = 0U;
uint32_t Count = (u32EndAddr - u32StartAddr + 1) / 4;
for (uint32_t i = 0; i < Count; i++)
{
if (0xFFFFFFFFUL == HW32_REG(u32StartAddr + addr))
{
addroffset = addr;
/*遇到4字节数据是空,再往下查3个4字节看看是不是也是空*/
for (uint32_t j = 0; j < 3; j++)
{
addroffset += 4;
if ((u32StartAddr + addroffset) >= u32EndAddr)
{
blankFlag = 1U;
break;
}
else if (0xFFFFFFFFUL != HW32_REG(u32StartAddr + addroffset))
{
break;
}
if (j == 2)
{
blankFlag = 1U;
break;
}
}
if (blankFlag == 1U)
{
break;
}
}
addr += 4;
}
printf("cha kong shi,ci shi de u32Addr zhi wei:%x\n\r",addr);
if (addr == 0)
{
/*如果偏移量为0,则整个区域都没有使用过,返回0xFFFFFFFF*/
addr = 0xFFFFFFFFUL;
}
else if ((addr + u32StartAddr) > (u32EndAddr + 1U))
{
addr = 0;
}
/*返回当前内存区域内有多少字节的空间没有使用*/
return addr;
}
#ifndef FLASH_USER_H__
#define FLASH_USER_H__
#include <stdint.h>
#include "py32f0xx_hal.h"
#define FLASH_DATA_LEN 32
#define SECTOR_0_START_ADDR 0x08000000UL
#define SECTOR_1_START_ADDR 0x08002000UL
#define SECTOR_2_START_ADDR 0x08004000UL
#define SECTOR_3_START_ADDR 0x08006000UL
#define SECTOR_4_START_ADDR 0x08008000UL
#define SECTOR_5_START_ADDR 0x0800A000UL
#define SECTOR_6_START_ADDR 0x0800C000UL
#define SECTOR_7_START_ADDR 0x0800E000UL
#define SECTOR_8_START_ADDR 0x08010000UL
#define SECTOR_9_START_ADDR 0x08012000UL
#define SECTOR_10_START_ADDR 0x08014000UL
#define SECTOR_11_START_ADDR 0x08016000UL
#define SECTOR_12_START_ADDR 0x08018000UL
#define SECTOR_13_START_ADDR 0x0801A000UL
#define SECTOR_14_START_ADDR 0x0801C000UL
#define SECTOR_15_START_ADDR 0x0801E000UL
typedef enum
{
FLASH_CONTROL_PASS = 0,
FLASH_CONTROL_FAIL,
}Flash_User_Result_en_t;
/*传入的数据长度u32Len需为字节数*/
extern void Flash_Data_Read(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len);
extern Flash_User_Result_en_t Flash_Data_Write(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len);
extern Flash_User_Result_en_t Flash_Data_PageErase(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern Flash_User_Result_en_t Flash_Data_SectorErase(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern uint32_t Flash_Data_CheckBlank(uint32_t u32StartAddr, uint32_t u32EndAddr);
#endif
\ No newline at end of file
...@@ -227,7 +227,7 @@ void Data_Create_Service(void) ...@@ -227,7 +227,7 @@ void Data_Create_Service(void)
/*传入的数据长度需为字节数*/ /*传入的数据长度需为字节数*/
void Flash_Data_Read(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len) void Test_Flash_Data_Read(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len)
{ {
uint32_t addr = 0U; uint32_t addr = 0U;
...@@ -239,7 +239,7 @@ void Flash_Data_Read(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len) ...@@ -239,7 +239,7 @@ void Flash_Data_Read(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len)
} }
/*传入的数据长度需为字节数*/ /*传入的数据长度需为字节数*/
void Flash_Data_Write(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len) void Test_Flash_Data_Write(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len)
{ {
// LoadBalancing_NVM_Data_st_t TestData; // LoadBalancing_NVM_Data_st_t TestData;
static uint32_t copyData[64]; static uint32_t copyData[64];
...@@ -278,7 +278,7 @@ void Flash_Data_Write(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len) ...@@ -278,7 +278,7 @@ void Flash_Data_Write(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len)
} }
} }
void Flash_Data_PageErase(uint32_t u32StartAddr, uint32_t u32EndAddr) void Test_Flash_Data_PageErase(uint32_t u32StartAddr, uint32_t u32EndAddr)
{ {
uint32_t PAGEError = 0; uint32_t PAGEError = 0;
FLASH_EraseInitTypeDef EraseInitStruct = {0}; FLASH_EraseInitTypeDef EraseInitStruct = {0};
...@@ -304,7 +304,7 @@ void Flash_Data_PageErase(uint32_t u32StartAddr, uint32_t u32EndAddr) ...@@ -304,7 +304,7 @@ void Flash_Data_PageErase(uint32_t u32StartAddr, uint32_t u32EndAddr)
// EEPROM_Mem_Access_Complete_Callback(); // EEPROM_Mem_Access_Complete_Callback();
} }
void Flash_Data_SectorErase(uint32_t u32StartAddr, uint32_t u32EndAddr) void Test_Flash_Data_SectorErase(uint32_t u32StartAddr, uint32_t u32EndAddr)
{ {
uint32_t PAGEError = 0; uint32_t PAGEError = 0;
FLASH_EraseInitTypeDef EraseInitStruct = {0}; FLASH_EraseInitTypeDef EraseInitStruct = {0};
...@@ -329,7 +329,7 @@ void Flash_Data_SectorErase(uint32_t u32StartAddr, uint32_t u32EndAddr) ...@@ -329,7 +329,7 @@ void Flash_Data_SectorErase(uint32_t u32StartAddr, uint32_t u32EndAddr)
HAL_FLASH_Lock(); HAL_FLASH_Lock();
} }
uint32_t Flash_Data_CheckBlank(uint32_t u32StartAddr, uint32_t u32EndAddr) uint32_t Test_Flash_Data_CheckBlank(uint32_t u32StartAddr, uint32_t u32EndAddr)
{ {
/*如果查空的范围内,数据不连续,混杂着空值。那就从检测到空值开始认为整个空间都是空的,后续的值也是垃圾数据,使用时先将选定区域全擦除,再写入值*/ /*如果查空的范围内,数据不连续,混杂着空值。那就从检测到空值开始认为整个空间都是空的,后续的值也是垃圾数据,使用时先将选定区域全擦除,再写入值*/
uint32_t addr = 0; uint32_t addr = 0;
......
...@@ -82,10 +82,10 @@ extern void Data_Create_Service(void); ...@@ -82,10 +82,10 @@ extern void Data_Create_Service(void);
extern uint32_t Test_APP_FlashBlank(uint32_t u32StartAddr, uint32_t u32EndAddr); extern uint32_t Test_APP_FlashBlank(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern void Flash_Data_Read(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len); extern void Test_Flash_Data_Read(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len);
extern void Flash_Data_Write(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len); extern void Test_Flash_Data_Write(uint32_t u32Addr, uint16_t u16Data[], uint32_t u32Len);
extern void Flash_Data_PageErase(uint32_t u32StartAddr, uint32_t u32EndAddr); extern void Test_Flash_Data_PageErase(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern void Flash_Data_SectorErase(uint32_t u32StartAddr, uint32_t u32EndAddr); extern void Test_Flash_Data_SectorErase(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern uint32_t Flash_Data_CheckBlank(uint32_t u32StartAddr, uint32_t u32EndAddr); extern uint32_t Test_Flash_Data_CheckBlank(uint32_t u32StartAddr, uint32_t u32EndAddr);
#endif #endif
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment