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

feat:增加flash模拟E方存储功能

parent 393af239
......@@ -40,7 +40,7 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "py32f0xx_hal.h"
#include "py32f072xx_Start_Kit.h"
#include "Flash_test.h"
/* Private includes ----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/
/* Exported variables prototypes ---------------------------------------------*/
......
// #include "r_typedefs.h"
// #include "Internal_Flash.h"
#include "Emulated_EEPROM.h"
#include "Emulated_EEPROM_Access.h"
/****************************************************************************
* !!! The following code should be generated by configuration tool !!! *
****************************************************************************/
#define EEPROM_BLOCK0_BUFFER_SIZE 256U
uint32_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK0_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_FLAG_SIZE)
// uint32_t g_u32EEPROMBlock0Buffer[EEPROM_BLOCK0_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK1_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_S27_SIZE)
// uint32_t g_u32EEPROMBlock1Buffer[EEPROM_BLOCK1_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK2_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_S2E_SIZE)
// uint32_t g_u32EEPROMBlock2Buffer[EEPROM_BLOCK2_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK3_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_CONFIG_SIZE)
// uint32_t g_u32EEPROMBlock3Buffer[EEPROM_BLOCK3_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK4_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_UDS_DTC_SIZE)
// uint32_t g_u32EEPROMBlock4Buffer[EEPROM_BLOCK4_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK5_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_ODO_SIZE)
// uint32_t g_u32EEPROMBlock5Buffer[EEPROM_BLOCK5_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK6_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_ODO_STAMP_SIZE)
// uint32_t g_u32EEPROMBlock6Buffer[EEPROM_BLOCK6_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK7_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_TRIP_STAMP_SIZE)
// uint32_t g_u32EEPROMBlock7Buffer[EEPROM_BLOCK7_BUFFER_SIZE / 4U];
// #define EEPROM_BLOCK8_BUFFER_SIZE (EEPROM_BLOCK_CTRL_BYTE_SIZE + EEPROM_BLOCK_SERVICE_INFO_SIZE)
// uint32_t g_u32EEPROMBlock8Buffer[EEPROM_BLOCK8_BUFFER_SIZE / 4U];
static const EEPROM_Block_st_t g_stEEPROMBlockTable[] =
{
/* u32StartAddr u32EndAddr u32DataSize pu32DataBuffer */
{SECTOR_14_START_ADDR, 0x0801E7FFUL, EEPROM_BLOCK0_BUFFER_SIZE, g_u32EEPROMBlock0Buffer,},
// {0x08019080UL, 0x080190FFUL, EEPROM_BLOCK1_BUFFER_SIZE, g_u32EEPROMBlock1Buffer,},
// {0x08019100UL, 0x0801917FUL, EEPROM_BLOCK2_BUFFER_SIZE, g_u32EEPROMBlock2Buffer,},
// {0x08019180UL, 0x080191FFUL, EEPROM_BLOCK3_BUFFER_SIZE, g_u32EEPROMBlock3Buffer,},
// {0x08019200UL, 0x0801927FUL, EEPROM_BLOCK4_BUFFER_SIZE, g_u32EEPROMBlock4Buffer,},
// {0x08019280UL, 0x0801967FUL, EEPROM_BLOCK5_BUFFER_SIZE, g_u32EEPROMBlock5Buffer,},
// {0x08019680UL, 0x08019B7FUL, EEPROM_BLOCK6_BUFFER_SIZE, g_u32EEPROMBlock6Buffer,},
// {0x08019B80UL, 0x0802157FUL, EEPROM_BLOCK7_BUFFER_SIZE, g_u32EEPROMBlock7Buffer,},
// {0x08021580UL, 0x080215FFUL, EEPROM_BLOCK8_BUFFER_SIZE, g_u32EEPROMBlock8Buffer,},
};
/****************************************************************************
* !!! End of code generation !!! *
****************************************************************************/
EEPROM_Block_Access_st_t g_stEEPROMBlockAccess[EEPROM_TOTAL_BLOCK_NUM];
void EEPROM_Init(void)
{
EEPROM_Media_Access_st_t stFlashAccessFunc;
// 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;
// Int_Data_Flash_Register_P_E_Complete_Cb(EEPROM_Mem_Access_Complete_Callback);
EEPROM_Access_Init( g_stEEPROMBlockTable,
g_stEEPROMBlockAccess,
&stFlashAccessFunc,
EEPROM_TOTAL_BLOCK_NUM);
}
EEPROM_Status_en_t EEPROM_Get_Status(void)
{
EEPROM_Status_en_t enStatus;
if(EEPROM_Access_Busy())
{
enStatus = EEPROM_STAT_BUSY;
}
else
{
enStatus = EEPROM_STAT_IDLE;
}
return enStatus;
}
EEPROM_Block_Status_en_t EEPROM_Get_Block_Status(uint16_t u16BlockID)
{
uint8_t u8BlockStatus;
EEPROM_Block_Status_en_t enStatus;
u8BlockStatus = EEPROM_Block_Access_Status(u16BlockID);
if (u8BlockStatus == EEPROM_BLOCK_BLANK)
{
enStatus = EEPROM_STAT_BLANK;
}
else if (u8BlockStatus == EEPROM_BLOCK_ACTIVE)
{
enStatus = EEPROM_STAT_ACTIVE;
}
else
{
enStatus = EEPROM_STAT_ERROR;
}
return enStatus;
}
/*u16Len是数组的长度*/
EEPROM_RW_Result_en_t EEPROM_Read_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len)
{
uint8_t u8Error;
EEPROM_RW_Result_en_t enResult;
u8Error = EEPROM_Read_Block_Data(u16BlockID, u32Data, u16Len);
if (u8Error)
{
enResult = EEPROM_RW_FAIL;
}
else
{
enResult = EEPROM_RW_PASS;
}
return enResult;
}
/*u16Len是数组的长度*/
EEPROM_RW_Result_en_t EEPROM_Write_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len)
{
uint8_t u8Error;
EEPROM_RW_Result_en_t enResult;
u8Error = EEPROM_Write_Block_Data(u16BlockID, u32Data, u16Len);
if (u8Error)
{
enResult = EEPROM_RW_FAIL;
}
else
{
enResult = EEPROM_RW_PASS;
}
return enResult;
}
#ifndef EMULATED_EEPROM_H__
#define EMULATED_EEPROM_H__
#include "Flash_test.h"
typedef enum
{
EEPROM_STAT_BLANK = 0U,
EEPROM_STAT_ACTIVE,
EEPROM_STAT_ERROR,
}EEPROM_Block_Status_en_t;
typedef enum
{
EEPROM_RW_PASS = 0,
EEPROM_RW_FAIL,
}EEPROM_RW_Result_en_t;
typedef enum
{
EEPROM_STAT_IDLE = 0,
EEPROM_STAT_BUSY,
}EEPROM_Status_en_t;
/****************************************************************************
* !!! The following code should be generated by configuration tool !!! *
****************************************************************************/
enum g_enEEPROMBlockName
{
EEPROM_BLOCK_UDS_FLAG = 0U,
// EEPROM_BLOCK_UDS_S27 = 1U,
// EEPROM_BLOCK_UDS_S2E = 2U,
// EEPROM_BLOCK_UDS_CONFIG = 3U,
// EEPROM_BLOCK_UDS_DTC = 4U,
// EEPROM_BLOCK_ODO = 5U,
// EEPROM_BLOCK_ODO_STAMP = 6U,
// EEPROM_BLOCK_TRIP_STAMP = 7U,
// EEPROM_BLOCK_SERVICE_INFO = 8U,
};
#define EEPROM_BLOCK_UDS_FLAG_SIZE (16U)/*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_CONFIG_SIZE (40U)/*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_STAMP_SIZE (8U)/*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_TOTAL_BLOCK_NUM (1U)/*创建的独立的负载均衡空间的个数*/
/****************************************************************************
* !!! End of code generation !!! *
****************************************************************************/
extern void EEPROM_Init(void);
extern EEPROM_Status_en_t EEPROM_Get_Status(void);
extern EEPROM_Block_Status_en_t EEPROM_Get_Block_Status(uint16_t u16BlockID);
extern EEPROM_RW_Result_en_t EEPROM_Read_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len);
extern EEPROM_RW_Result_en_t EEPROM_Write_Data(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len);
#endif
#ifndef EMULATED_EEPROM_ACCESS_H__
#define EMULATED_EEPROM_ACCESS_H__
#include <stdint.h>
#define ONE_PAGE_LEN 0x100U
typedef struct
{
uint32_t u32StartAddr;
uint32_t u32EndAddr;
uint32_t u32DataSize;
uint32_t* pu32DataBuffer;
}EEPROM_Block_st_t;
typedef struct
{
uint8_t u8Status;
uint8_t u8SectorOffset;
uint16_t u16SectorSize;
uint16_t u16Index;
uint16_t u16RecordNum;
uint16_t u16MaxRecordNum;
uint16_t u16BlockSize;
uint32_t u32BaseAddr;
uint32_t u32EndAddr;
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 struct
{
EEPROM_Mem_Erase_Func_ptr_t pfnMemErase;
EEPROM_Mem_Blank_Chk_Func_ptr_t pfnMemBlankChk;
EEPROM_Mem_Read_Func_ptr_t pfnMemRead;
EEPROM_Mem_Write_Func_ptr_t pfnMemWrite;
}EEPROM_Media_Access_st_t;
#define EEPROM_BLOCK_BLANK (0U)
#define EEPROM_BLOCK_ACTIVE (1U)
#define EEPROM_BLOCK_ERROR (2U)
#define EEPROM_BLOCK_CTRL_BYTE_SIZE (8U)
extern void EEPROM_Access_Init(const EEPROM_Block_st_t * pstBlockTable,
EEPROM_Block_Access_st_t * pstBlockAccess,
EEPROM_Media_Access_st_t * pstMediaAccess,
uint16_t u16BlockNum);
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);
#endif
#include "Flash_test.h"
// #include "main.h"
// MileageData_un_t FlashData;
/*len是数组的长度*/
void Test_Flash_AppointAddress_Read(uint32_t u32Addr, uint32_t u32Data[], uint32_t u32Len)
{
uint32_t addr = 0U;
for (uint32_t i = 0U; i < u32Len; i++ )
{
u32Data[i] = HW32_REG(u32Addr + addr);
addr += 4;
}
return ;
}
// uint32_t TestData[8] =
// {
// 0xABACADAE, 0x18176527, 0x90901990, 0xDDDDCCCC, 0x98765432, 0xAFA1A5A8, 0xC8C7C5C3, 0x20250227
// };
uint32_t TestData[8] =
{
0x00000001, 0xABCDEF88, 0x10101010, 0x2B2B2B2B, 0x3C3C3C3C, 0xFEFEFEFE, 0x95959595, 0x20250304
};
uint32_t TestData1[8] =
{
0xAAAAAAAA, 0xBBBBBBBB, 0xCCCCCCCC, 0xDDDDDDDD, 0xEEEEEEEE, 0xFFFFFFFF, 0x99999999, 0x20250304
};
uint32_t TestData2[8] =
{
0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555, 0x66666666, 0x77777777, 0x88888888
};
void Test_Flash_AppointAddress_Write(uint32_t u32Addr, uint32_t u32Data[], uint32_t u32Len)
{
// LoadBalancing_NVM_Data_st_t TestData;
static uint32_t copyData[256];
memset(copyData,0,sizeof(copyData));
uint32_t flash_program_start = u32Addr; /* flash program start address */
uint32_t flash_program_end = 0U; // (SECTOR_15_START_ADDR + sizeof(TestData)); /* flash program end address */
/* Unlock Flash */
HAL_FLASH_Unlock();
if (u32Len < 256u)
{
for(uint32_t i = 0; i < (256 / 4); i++)
{
copyData[i] = u32Data[i];
}
}
flash_program_end = u32Addr + 256U;
printf("flash_program_start:%x\n\r",flash_program_start);
printf("flash_program_end:%x\n\r",flash_program_end);
// uint32_t *src = (uint32_t *) &TestData; /* Program data */
uint32_t *src = (uint32_t *)copyData;
while (flash_program_start < flash_program_end)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_PAGE, flash_program_start, src) == HAL_OK)/* Program */
{
printf("xie ru cheng gong le ,hahahahaha\n\r");
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();
// EEPROM_Mem_Access_Complete_Callback();
}
void Test_Flash_AppointAddress_Erase(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 Test_Flash_AppointSector_Erase(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();
}
void Data_Create_Service(void)
{
// LoadBalancing_NVM_Data_st_t TestData;
// TestData.mileage1 = 0xABACADAE;
// TestData.mileage2 = 0x18176527;
// TestData.mileage3 = 0x90901990;
// TestData.mileage4 = 0xDDDDCCCC;
// TestData.maintenance1 = 0x98765432;
// TestData.maintenance2 = 0xAFA1A5A8;
// TestData.maintenance3 = 0xC8C7C5C3;
// TestData.maintenance4 = 0x20250227;
}
/**
* @brief Flash Check
* @param None
* @retval None
*/
uint32_t Test_APP_FlashBlank(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 (0xFFFFFFFF == HW32_REG(u32StartAddr + addr))
{
addroffset = addr;
for (uint32_t j = 0; j < 3; j++)
{
addroffset += 4;
if (0xFFFFFFFF != 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 = 0xFFFFFFFF;
}
else if ((addr + u32StartAddr) > (u32EndAddr + 1U))
{
addr = 0;
}
/*返回当前内存区域内有多少字节的空间没有使用*/
return addr;
}
/**
* @brief Flash Verify
* @param None
* @retval None
*/
// void Test_APP_FlashVerify(void)
// {
// uint32_t addr = 0;
// while (addr < sizeof(DATA))
// {
// if (DATA[addr / 4] != HW32_REG(FLASH_USER_START_ADDR + addr))
// {
// APP_ErrorHandler();
// }
// addr += 4;
// }
// }
/**
* @brief This function is executed in case of error occurrence.
* @param None
* @retval None
*/
void Test_APP_ErrorHandler(void)
{
while (1)
{
}
}
#ifndef FLASH_TEST_H__
#define FLASH_TEST_H__
#include <stdint.h>
#include "py32f0xx_hal.h"
#define FLASH_DATA_LEN 32
#define SECTOR_0_START_ADDR 0x08000000
#define SECTOR_1_START_ADDR 0x08002000
#define SECTOR_2_START_ADDR 0x08004000
#define SECTOR_3_START_ADDR 0x08006000
#define SECTOR_4_START_ADDR 0x08008000
#define SECTOR_5_START_ADDR 0x0800A000
#define SECTOR_6_START_ADDR 0x0800C000
#define SECTOR_7_START_ADDR 0x0800E000
#define SECTOR_8_START_ADDR 0x08010000
#define SECTOR_9_START_ADDR 0x08012000
#define SECTOR_10_START_ADDR 0x08014000
#define SECTOR_11_START_ADDR 0x08016000
#define SECTOR_12_START_ADDR 0x08018000
#define SECTOR_13_START_ADDR 0x0801A000
#define SECTOR_14_START_ADDR 0x0801C000
#define SECTOR_15_START_ADDR 0x0801E000
typedef struct
{
uint32_t mileage1;
uint32_t mileage2;
uint32_t mileage3;
uint32_t mileage4;
uint32_t maintenance1;
uint32_t maintenance2;
uint32_t maintenance3;
uint32_t maintenance4;
}LoadBalancing_NVM_Data_st_t;
// typedef union
// {
// uint32_t MileageData [ 8 ];
// struct
// {
// uint32_t mileage1;
// uint32_t mileage2;
// uint32_t mileage3;
// uint32_t mileage4;
// uint32_t maintenance1;
// uint32_t maintenance2;
// uint32_t maintenance3;
// uint32_t maintenance4;
// } LoadBalancing_NVM_Data_st_t;
// } MileageData_un_t;
typedef enum
{
MILEAGE1 = 0,
MILEAGE2,
MILEAGE3,
MILEAGE4,
MAINTENANCE1,
MAINTENANCE2,
MAINTENANCE3,
MAINTENANCE4,
}FLASH_Store_Data_en_t;
// extern LoadBalancing_NVM_Data_st_t FlashData;
extern uint32_t TestData[8];
extern uint32_t TestData1[8];
extern uint32_t TestData2[8];
extern void Test_Flash_AppointAddress_Read(uint32_t u32Addr, uint32_t u32Data[], uint32_t u32Len);
extern void Test_Flash_AppointAddress_Write(uint32_t u32Addr, uint32_t u32Data[], uint32_t u32Len);
extern void Test_Flash_AppointAddress_Erase(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern void Test_Flash_AppointSector_Erase(uint32_t u32StartAddr, uint32_t u32EndAddr);
extern void Data_Create_Service(void);
extern uint32_t Test_APP_FlashBlank(uint32_t u32StartAddr, uint32_t u32EndAddr);
#endif
\ No newline at end of file
......@@ -29,6 +29,8 @@
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "Flash_test.h"
#include "Emulated_EEPROM.h"
/* Private define ------------------------------------------------------------*/
#define FLASH_USER_START_ADDR 0x08004000
......@@ -76,55 +78,129 @@ int main(void)
APP_SystemClockConfig();
/* Initialize Button */
BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO);
BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO);/*按键功能初始化*/
/* Initialize LED */
BSP_LED_Init(LED_GREEN);
BSP_LED_Init(LED_GREEN); /*LED功能初始化*/
BSP_USART_Config();/*串口打印测试用,不调用串口不能打印*/
/* Wait for the button to be pressed */
while (BSP_PB_GetState(BUTTON_USER))
{
}
// while (BSP_PB_GetState(BUTTON_USER))
// {
// }
// if (BSP_PB_GetState(BUTTON_USER))
// {
// Test_Flash_AppointSector_Erase(SECTOR_8_START_ADDR, 0X801FFFF);
// }
// Data_Create_Service();
/* Unlock Flash */
HAL_FLASH_Unlock();
// HAL_FLASH_Unlock();
/* Erase Flash */
APP_FlashErase();
// APP_FlashErase();
/* Check Flash */
APP_FlashBlank();
uint32_t hahaha = 0;
uint32_t zheshisha = 0;
uint32_t addr = 0;
for (uint8_t i = 0; i < 128; i++)
static uint32_t koko[8] = {0};
static uint32_t laji[8] =
{
hahaha = HW32_REG(FLASH_USER_START_ADDR + addr);
printf("%x\n\r" , hahaha);
addr += 4;
}
0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555, 0x66666666, 0x77777777, 0x88888888
};
// for (uint8_t j = 0; j < 4; j++)
// {
// for (uint8_t i = 0; i < 128; i++)
// {
// zheshisha = HW32_REG(SECTOR_8_START_ADDR + addr);
// printf("%x\n\r" , zheshisha);
// addr += 4;
// }
// printf("shan qu %d du qu wan cheng\n\r",(11+j));
// }
// printf("--------------------------------------\n\r" );
// printf("--------------------------------------\n\r" );
/* Check Flash */
// APP_FlashBlank();
/* Program Flash */
APP_FlashProgram();
/* Program Flash */
// APP_FlashProgram();
// EEPROM_Write_Data(SECTOR_15_START_ADDR, koko, 8);
// memset(koko,0,32);
EEPROM_Init();
// for(uint8_t i = 0; i < 40; i ++)
// {
// EEPROM_Write_Data(EEPROM_BLOCK_UDS_FLAG, TestData,8);
// TestData[0] ++;
// }
// zheshisha = 0;
// addr = 0;
// for (uint8_t j = 0; j < 4; j++)
// {
// for (uint8_t i = 0; i < 128; i++;
// {
// zheshisha = HW32_REG(SECTOR_12_START_ADDR + addr);
// printf("%x\n\r" , zheshisha);
// addr += 4;
// }
// printf("shan qu %d du qu wan cheng\n\r",(12+j));
// }
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);
// Test_Flash_AppointAddress_Write(0x801C300, laji, 8);
// printf("xie ru cheng gong le\n\r");
/* Lock Flash */
HAL_FLASH_Lock();
// HAL_FLASH_Lock();
/* Verify Flash */
APP_FlashVerify();
// APP_FlashVerify();
BSP_LED_On(LED_GREEN);
hahaha = HW32_REG(FLASH_USER_START_ADDR);
printf("%x\n" , hahaha);
zheshisha = 0;
addr = 0;
uint32_t dizhi = SECTOR_14_START_ADDR;
for (uint8_t j = 0; j < 40; j++)
{
for (uint8_t i = 0; i < 64; i++)
{
zheshisha = HW32_REG(SECTOR_14_START_ADDR + addr);
if (zheshisha != 0U)
{
printf("%x\n\r" , zheshisha);
}
addr += 4;
}
printf("page %d du qu wan cheng\n\r",(368+j));
printf("zhe yi ge page de qi shi di zhi shi %x\n\r", dizhi);
dizhi += 0x100U;
}
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)
{
}
......@@ -180,11 +256,16 @@ static void APP_SystemClockConfig(void)
static void APP_FlashErase(void)
{
uint32_t PAGEError = 0;
uint32_t jojojo = 0U;
FLASH_EraseInitTypeDef EraseInitStruct = {0};
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGEERASE; /* Erase type FLASH_TYPEERASE_PAGEERASE=Page erase, FLASH_TYPEERASE_SECTORERASE=Sector Erase */
EraseInitStruct.PageAddress = FLASH_USER_START_ADDR; /* Erase Start Address */
EraseInitStruct.NbPages = sizeof(DATA) / FLASH_PAGE_SIZE; /* Number of pages that need to be erased */
jojojo = sizeof(DATA) / FLASH_PAGE_SIZE;
printf("sizeof(DATA) / FLASH_PAGE_SIZE为:%x\n\r",jojojo);
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();
......
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