Files
ChipTest/PAN159/PAN159-Template/Library/StdDriver/driver/lib_driver_flash_pan159.c
T
2021-09-26 17:19:12 +08:00

137 lines
3.5 KiB
C

/*******************************************************************************
* @note Copyright (C) 2017 Shanghai Panchip Microelectronics Co., Ltd.
* All rights reserved.
*
* @file drv_flash.c
* @brief FLASH读写
*
* @history - V1.0, 2017-03-10, xiaoguolin, first implementation.
*******************************************************************************/
#include "lib_driver_flash_pan159.h"
/*******************************************************************************
* @brief FLASH擦除扇区(512字节)
* @param[in] addr - 起始地址(512字节对齐)
* sectors - 要擦除的连续扇区数目
* @param[out] 无
* @return 无
* @history - V1.0, 2017-03-13, xiaoguolin, first implementation.
*******************************************************************************/
void flash_pan159_erase(uint32_t addr, uint16_t sectors)
{
SYS_UnlockReg();
FMC_Open();
FMC_ENABLE_SP_UPDATE();
while(sectors != 0)
{
FMC_Erase(addr);
addr += 128;
sectors--;
}
FMC_DISABLE_SP_UPDATE();
FMC_Close();
SYS_LockReg();
}
/*******************************************************************************
* @brief FLASH数据写入
* @param[in] addr - 写入起始地址,要求4字节对齐
* p_addr - 数据指针
* len - 数据长度(字节为单位)
* @param[out] 无
* @return 无
* @history - V1.0, 2017-03-13, xiaoguolin, first implementation.
*******************************************************************************/
void flash_pan159_write(uint32_t addr, void* p_data, uint16_t len)
{
#define PTR32 ((uint32_t*)p_data)
#define PTR8 ((uint8_t*)p_data)
uint16_t i;
union{
uint32_t u32;
struct{
uint8_t x0;
uint8_t x1;
uint8_t x2;
uint8_t x3;
}u8;
}tmp;
tmp.u32 = 0xFFFFFFFF;
SYS_UnlockReg();
FMC_Open();
FMC_ENABLE_SP_UPDATE();
for(i = 0; i < (len>>2); i++)
{
FMC_Write(addr,PTR32[i]);
addr += 4;
}
i <<= 2;
if(i < len)
{
tmp.u8.x0 = PTR8[i++];
if(i < len)
{
tmp.u8.x1 = PTR8[i++];
if(i < len)
{
tmp.u8.x2 = PTR8[i];
}
}
FMC_Write(addr,tmp.u32);
}
FMC_DISABLE_SP_UPDATE();
FMC_Close();
SYS_LockReg();
#undef PTR8
#undef PTR32
}
/*******************************************************************************
* @brief FLASH数据读取
* @param[in] addr - 读取起始地址,要求4字节对齐
* len - 数据长度(字节为单位)
* @param[out] p_data - 数据缓冲区指针,帯回数据
* @return 无
* @history - V1.0, 2017-03-13, xiaoguolin, first implementation.
*******************************************************************************/
void flash_pan159_read(uint32_t addr, void* p_data, uint16_t len)
{
#define PTR32 ((uint32_t*)p_data)
#define PTR8 ((uint8_t*)p_data)
#define TMP (*((uint32_t*)tmp))
uint16_t i;
uint8_t tmp[4];
SYS_UnlockReg();
FMC_Open();
FMC_ENABLE_SP_UPDATE();
for(i = 0; i < (len>>2); i++)
{
PTR32[i] = FMC_Read(addr);
addr += 4;
}
i <<= 2;
if(i < len)
{
TMP = FMC_Read(addr);
PTR8[i++] = tmp[0];
if(i < len)
{
PTR8[i++] = tmp[1];
if(i < len)
{
PTR8[i] = tmp[2];
}
}
}
FMC_DISABLE_SP_UPDATE();
FMC_Close();
SYS_LockReg();
#undef TMP
#undef PTR8
#undef PTR32
}