1、概述
Fls本身是无法操作自身的,犯冲突。
Fls_WriteCmdCycles (预留300字节)与 Fls_EraseCmdCycles(预留200字节) 函数在执行之前将会Copy进RAM,Fls本身是不能操作Fls本身的,除非把最底层的驱动函数防止在RAM或者其他的Flash里面,假设Flash放置在PF0可以操作PF1。英飞凌的驱动有个规定写指令预留300字节,擦除指令预留200字节。
2、操作方法
2.1、链接文件操作
MEMORY
{
PFLASH0_FLS_WRITE (rx!p) : org = 0x800B0200, len = 0x300
PFLASH0_FLS_ERASE (rx!p) : org = 0x800B0000, len = 0x200
CPU0_PSPR_FLS_WRITE (w!xp) : org = 0x70100240, len = 0x300
CPU0_PSPR_FLS_ERASE (w!xp) : org = 0x70100040, len = 0x200
}
SECTIONS
{
.FLS_AC_ERASE_SOURCE : ALIGN(4)
{
PROVIDE(FLS_AC_ERASE_SOURCE_START = .) ;
KEEP(*(.text.FLS_AC_ERASE_SOURCE));
PROVIDE(FLS_AC_ERASE_SOURCE_END = .) ;
} > PFLASH0_FLS_ERASE
.FLS_AC_WRITE_SOURCE : ALIGN(4)
{
PROVIDE(FLS_AC_WRITE_SOURCE_START = .);
KEEP(*(.text.FLS_AC_WRITE_SOURCE));
PROVIDE(FLS_AC_WRITE_SOURCE_END = .);
} > PFLASH0_FLS_WRITE
.FLS_AC_ERASE : ALIGN(4)
{
IROM_BASE_ERASE = .;
*(.FLS_AC_ERASE);
*(.FLS_AC_ERASE.*)
. = ALIGN(8);
} > CPU0_PSPR_FLS_ERASE AT > PFLASH0_FLS_ERASE = 0
.FLS_AC_WRITE : ALIGN(4)
{
IROM_BASE_WRITE = .;
*(.FLS_AC_WRITE);
*(.FLS_AC_WRITE.*)
. = ALIGN(8);
} > CPU0_PSPR_FLS_WRITE AT > PFLASH0_FLS_WRITE = 0
}
2.2 Memmap.h操作
#elif defined (FLS_17_PMU_START_SEC_SPL_CODE_WRITECMD_BEGIN)
#undef FLS_17_PMU_START_SEC_SPL_CODE_WRITECMD_BEGIN
#pragma section ".text.FLS_AC_WRITE_SOURCE" ax 4
#elif defined (FLS_17_PMU_STOP_SEC_SPL_CODE_WRITECMD_BEGIN)
#undef FLS_17_PMU_STOP_SEC_SPL_CODE_WRITECMD_BEGIN
#pragma section
#elif defined (FLS_17_PMU_START_SEC_SPL_CODE_ERASECMD_BEGIN)
#undef FLS_17_PMU_START_SEC_SPL_CODE_ERASECMD_BEGIN
#pragma section ".text.FLS_AC_ERASE_SOURCE" ax 4
#elif defined (FLS_17_PMU_STOP_SEC_SPL_CODE_ERASECMD_BEGIN)
#undef FLS_17_PMU_STOP_SEC_SPL_CODE_ERASECMD_BEGIN
#pragma section
2.3、代码端
#define FLS_17_PMU_START_SEC_SPL_CODE_WRITECMD_BEGIN
#include "MemMap.h"
void Fls_WriteCmdCycles(volatile uint32 StartAddress,
uint32 PageAddress,
const Fls_AddressType* ProgramDataPtr,
uint8 WriteMode);
#define FLS_17_PMU_STOP_SEC_SPL_CODE_WRITECMD_BEGIN
#include "MemMap.h"
注意一个点,下面链接文件的描述*(.FLS_AC_ERASE.*)其实在memmap.h里面不体现的,存放在RAM里面,我们只是需要FLS_AC_ERASE.*这样一段空间而已。