72 lines
2.0 KiB
C
Raw Normal View History

2025-05-21 11:31:07 +08:00
/*
* drv_flash.c
*
* Created on: 202548
* Author: 22332
*/
#include "drv_flash.h"
#define FTFx_DPHRASE_SIZE 0x0010U
#define BUFFER_SIZE 24u /* Size of data source */
#define EFM_SECTOR_VENDOR_DATA_NUM (31U) // 诊断数据存储区
#define SECTOR_SIZE (0x400UL)
#define SECTOR_ADDR(x) (uint32_t)(SECTOR_SIZE * (x))
flash_ssd_config_t flashSSDConfig;
status_t ret; /* Store the driver APIs return code */
uint32_t failAddr;
/* Function declarations */
void bsp_drv_flash_init(void)
{
ret = FLASH_DRV_Init(&Flash_InitConfig0, &flashSSDConfig);
DEV_ASSERT(STATUS_SUCCESS == ret);
}
void bsp_drv_flash_write(uint8_t * write_buffer,uint32_t address)
{
ret = FLASH_DRV_EraseSector(&flashSSDConfig, address, FEATURE_FLS_DF_BLOCK_SECTOR_SIZE);
DEV_ASSERT(STATUS_SUCCESS == ret);
/* Disable Callback */
flashSSDConfig.CallBack = NULL_CALLBACK;
/* Verify the erase operation at margin level value of 1, user read */
ret = FLASH_DRV_VerifySection(&flashSSDConfig, address, 256 / FTFx_DPHRASE_SIZE, 1u);
DEV_ASSERT(STATUS_SUCCESS == ret);
/* Write some data to the erased PFlash sector */
ret = FLASH_DRV_Program(&flashSSDConfig, address, BUFFER_SIZE, write_buffer);
DEV_ASSERT(STATUS_SUCCESS == ret);
/* Verify the program operation at margin level value of 1, user margin */
ret = FLASH_DRV_ProgramCheck(&flashSSDConfig, address, BUFFER_SIZE, write_buffer, &failAddr, 1u);
DEV_ASSERT(STATUS_SUCCESS == ret);
}
uint16_t bsp_drv_flash_read_byte(volatile uint8_t * flashPtr,uint8_t *buffer, uint32_t length)
{
while (0UL != length) {
*(buffer++) = *(flashPtr++);
length--;
}
return 0;
}
uint16_t bsp_drv_get_vendor_data(uint8_t *buffer, uint32_t length)
{
uint32_t u32Addr = 0x10000000;
u32Addr += SECTOR_ADDR(EFM_SECTOR_VENDOR_DATA_NUM);
__IO uint8_t *pu8Buf = (uint8_t *)u32Addr;
while (0UL != length) {
*(buffer++) = *(pu8Buf++);
length--;
}
return 0;
}