Commit 8fdcdc6a authored by 李冠华's avatar 李冠华

feat:将数据存储的索引、反索引从4字节存储改为2字节存储。修改flash读、写为2字节数据处理,优化代码

parent d0088c9d
......@@ -8,15 +8,18 @@
/****************************************************************************
* !!! The following code should be generated by configuration tool !!! *
****************************************************************************/
/* EEPROM_BLOCK0_BUFFER_SIZE: 1个数据块的大小,1个数据块包括索引+反索引+存储的数据+校验值。(由于普冉只支持页擦和页写,所以最小的块大小也只能是1page)*/
#define EEPROM_BLOCK0_BUFFER_SIZE 256U
uint32_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 4U];
// uint32_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 4U]; /*1个数据块用到的数据数组的大小,根据数组的数据类型来,uint16的就/2,uint32的就/4*/
uint16_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 2U]; /*1个数据块用到的数据数组的大小,根据数组的数据类型来,uint16的就/2,uint32的就/4*/
static const EEPROM_Block_st_t g_stEEPROMBlockTable[] =
{
/*u32UsageTimes u32StartAddr u32EndAddr u32DataSize pu32DataBuffer */
/*u32UsageTimes u32StartAddr u32EndAddr u32DataSize pu16DataBuffer */
{EEPROM_TARGET_ERASE_NUM, SECTOR_14_START_ADDR, 0x0801E7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,},
{EEPROM_TARGET_ERASE_NUM1, SECTOR_12_START_ADDR, 0x0801A7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,},
// {EEPROM_TARGET_ERASE_NUM1, SECTOR_12_START_ADDR, 0x0801A7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,},
};
/****************************************************************************
......@@ -32,10 +35,10 @@ EEPROM_Init_Status_en_t EEPROM_Init(void)
// TYW_FDL_Init();
stFlashAccessFunc.pfnMemErase = Test_Flash_AppointAddress_Erase;//Int_Data_Flash_Erase;
stFlashAccessFunc.pfnMemBlankChk = Test_APP_FlashBlank;//Int_Data_Flash_Blank_Check;
stFlashAccessFunc.pfnMemRead = Test_Flash_AppointAddress_Read;//Int_Data_Flash_Read;
stFlashAccessFunc.pfnMemWrite = Test_Flash_AppointAddress_Write;//Int_Data_Flash_Write;
stFlashAccessFunc.pfnMemErase = Flash_Data_PageErase;//Int_Data_Flash_Erase;
stFlashAccessFunc.pfnMemBlankChk = Flash_Data_CheckBlank;//Int_Data_Flash_Blank_Check;
stFlashAccessFunc.pfnMemRead = Flash_Data_Read;//Int_Data_Flash_Read;
stFlashAccessFunc.pfnMemWrite = Flash_Data_Write;//Int_Data_Flash_Write;
// Int_Data_Flash_Register_P_E_Complete_Cb(EEPROM_Mem_Access_Complete_Callback);
......@@ -92,7 +95,7 @@ EEPROM_Block_Status_en_t EEPROM_Get_Block_Status(uint16_t u16BlockID)
return enStatus;
}
/*u16Len是数组的长度*/
/*u16Len是32位数组的长度*/
EEPROM_RW_Result_en_t EEPROM_Read_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len)
{
uint8_t u8Error;
......@@ -111,7 +114,7 @@ EEPROM_RW_Result_en_t EEPROM_Read_Data(uint16_t u16BlockID, uint32_t u32Data[],
return enResult;
}
/*u16Len是数组的长度*/
/*u16Len是32位数组的长度*/
EEPROM_RW_Result_en_t EEPROM_Write_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len)
{
uint8_t u8Error;
......
......@@ -13,27 +13,29 @@ typedef struct
uint32_t u32StartAddr;
uint32_t u32EndAddr;
uint32_t u32DataSize;
uint32_t* pu32DataBuffer;
uint16_t* pu16DataBuffer;
// uint32_t* pu32DataBuffer;
}EEPROM_Block_st_t;
typedef struct
{
uint8_t u8Status;
uint8_t u8SectorOffset;
uint8_t u8Index;
uint16_t u16SectorSize;
uint16_t u16Index;
uint16_t u16RecordNum;
uint16_t u16MaxRecordNum;
uint16_t u16BlockSize;
uint16_t* pu16Data;
uint32_t u32BaseAddr;
uint32_t u32EndAddr;
uint32_t* pu32Data;
// uint32_t* pu32Data;
}EEPROM_Block_Access_st_t;
typedef void (*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 void (*EEPROM_Mem_Read_Func_ptr_t) (uint32_t, uint32_t*, uint32_t);
typedef void (*EEPROM_Mem_Write_Func_ptr_t) (uint32_t, uint32_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 struct
{
......@@ -47,7 +49,7 @@ typedef struct
#define EEPROM_BLOCK_ACTIVE (1U)
#define EEPROM_BLOCK_ERROR (2U)
#define EEPROM_BLOCK_CTRL_BYTE_SIZE (8U)
#define EEPROM_BLOCK_CTRL_BYTE_SIZE (4U) /*存储块控制相关数据占用的空间大小,= 1byte索引+1byte反索引+2byte校验数据*/
extern uint8_t EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
EEPROM_Block_Access_st_t * pstBlockAccess,
......@@ -58,7 +60,7 @@ extern uint8_t EEPROM_Access_Busy(void);
extern uint8_t EEPROM_Block_Access_Status(uint16_t u16BlockID);
extern uint8_t EEPROM_Read_Block_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len);
extern uint8_t EEPROM_Write_Block_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len);
extern void EEPROM_Mem_Access_Complete_Callback(void);
// extern void EEPROM_Mem_Access_Complete_Callback(void);
#endif
......@@ -222,6 +222,173 @@ void Data_Create_Service(void)
// }
// }
/*传入的数据长度需为字节数*/
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;
}
}
/*传入的数据长度需为字节数*/
void 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
{
break;
}
}
/* Lock Flash */
HAL_FLASH_Lock();
}
}
void 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 */
{
// APP_ErrorHandler();
printf("shan qu ca chu shi bai le!!!!!!!!!\n\r");
/* Lock Flash */
}
else
{
;
}
/* Lock Flash */
HAL_FLASH_Lock();
// EEPROM_Mem_Access_Complete_Callback();
}
void 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 */
{
// APP_ErrorHandler();
printf("shan qu ca chu shi bai le!!!!!!!!!\n\r");
/* Lock Flash */
}
else
{
;
}
/* Lock Flash */
HAL_FLASH_Lock();
}
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 u32Addr = 0xFFFFFFFFU;
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);
// return u32Addr;
if (addr == 0)
{
/*如果偏移量为0,则整个区域都没有使用过,返回0xFFFFFFFF*/
addr = 0xFFFFFFFFUL;
}
else if ((addr + u32StartAddr) > (u32EndAddr + 1U))
{
addr = 0;
}
/*返回当前内存区域内有多少字节的空间没有使用*/
return addr;
}
/**
* @brief This function is executed in case of error occurrence.
* @param None
......
......@@ -81,4 +81,11 @@ extern void Test_Flash_AppointSector_Erase(uint32_t u32StartAddr, uint32_t u32En
extern void Data_Create_Service(void);
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 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 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
......@@ -87,9 +87,9 @@ int main(void)
BSP_USART_Config();/*串口打印测试用,不调用串口不能打印*/
CAN_Config();
// CAN_Config();
BSP_LED_On(LED_GREEN);
/* Wait for the button to be pressed */
// while (BSP_PB_GetState(BUTTON_USER))
// {
......@@ -108,13 +108,24 @@ int main(void)
// APP_FlashErase();
// uint32_t zheshisha = 0;
// uint32_t addr = 0;
// static uint32_t koko[8] = {0};
uint32_t zheshisha = 0;
uint32_t addr = 0;
static uint16_t koko[8] = {0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888};
static uint32_t laji[8] = {0};
// static uint32_t laji[8] =
// {
// 0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555, 0x66666666, 0x77777777, 0x88888888
// };
// Flash_Data_PageErase(SECTOR_14_START_ADDR, 0x0801E7FFUL);
// Flash_Data_Write(SECTOR_15_START_ADDR, koko, (8 * 2));
// Flash_Data_Read(SECTOR_15_START_ADDR, laji, (8 * 2));
// Flash_Data_CheckBlank(SECTOR_14_START_ADDR, 0x0801E7FFUL);
// for (uint8_t j = 0; j < 4; j++)
// {
......@@ -138,20 +149,21 @@ int main(void)
// EEPROM_Write_Data(SECTOR_15_START_ADDR, koko, 8);
// memset(koko,0,32);
EEPROM_Init();
// for(uint8_t i = 0; i < 40; i ++)
// for(uint8_t i = 0; i < 250; i ++)
// {
// EEPROM_Write_Data(EEPROM_BLOCK_UDS_FLAG, TestData,8);
// TestData[0] ++;
// }
// zheshisha = 0;
// addr = 0;
zheshisha = 0;
addr = 0;
// for (uint8_t j = 0; j < 4; j++)
// for (uint8_t j = 0; j < 2; j++)
// {
// for (uint8_t i = 0; i < 128; i++;
// for (uint8_t i = 0; i < 128; i++)
// {
// zheshisha = HW32_REG(SECTOR_12_START_ADDR + addr);
// zheshisha = HW32_REG(SECTOR_14_START_ADDR + addr);
// printf("%x\n\r" , zheshisha);
// addr += 4;
// }
......@@ -159,8 +171,26 @@ int main(void)
// }
// EEPROM_Write_Data(EEPROM_BLOCK_UDS_FLAG, TestData1,8);
// EEPROM_Write_Data(EEPROM_BLOCK_UDS_FLAG, TestData2,8);
// EEPROM_Write_Data(EEPROM_BLOCK_UDS_FLAG, TestData,32);
// EEPROM_Write_Data(EEPROM_BLOCK_UDS_FLAG, TestData,8);
while(addr <= (0x0801E7FFUL - SECTOR_14_START_ADDR))
{
zheshisha = HW16_REG(SECTOR_14_START_ADDR + addr);
if((zheshisha != 0xFFFF) && (zheshisha != 0x0))
{
printf("%x\n\r" , zheshisha);
}
addr += 2;
if ((addr % 256) == 0U)
{
printf("---------------------------------\n\r");
}
}
// Test_Flash_AppointAddress_Write(0x801C300, laji, 8);
// printf("xie ru cheng gong le\n\r");
......@@ -170,7 +200,7 @@ int main(void)
/* Verify Flash */
// APP_FlashVerify();
BSP_LED_On(LED_GREEN);
// zheshisha = 0;
// addr = 0;
......@@ -193,23 +223,23 @@ int main(void)
// dizhi += 0x100U;
// }
// printf("--------------- fen ge xian --------------------\n\r");
// printf("--------------- fen ge xian --------------------\n\r");
// printf("--------------- fen ge xian --------------------\n\r");
printf("--------------- fen ge xian --------------------\n\r");
printf("--------------- fen ge xian --------------------\n\r");
printf("--------------- fen ge xian --------------------\n\r");
// EEPROM_Read_Data(EEPROM_BLOCK_UDS_FLAG, koko,8);
// for (uint8_t i = 0; i < 8; i++)
// {
// printf("%x\n\r" , koko[i]);
// }
// printf("--------------- zhi xing jie shu --------------------\n\r");
// printf("--------------- zai jian --------------------\n\r");
while (1)
EEPROM_Read_Data(EEPROM_BLOCK_UDS_FLAG, laji,8);
for (uint8_t i = 0; i < 8; i++)
{
CAN_RX_Service();
NVS_Test_Max_Service();
CAN_TX_Service();
printf("%x\n\r" , laji[i]);
}
// printf("--------------- zhi xing jie shu --------------------\n\r");
// printf("--------------- zai jian --------------------\n\r");
// while (1)
// {
// CAN_RX_Service();
// NVS_Test_Max_Service();
// CAN_TX_Service();
// }
}
/**
......
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