目 录CONTENT

文章目录

链接文件学习(七):英飞凌如何将Flash放进RAM

moke
2024-07-25 / 0 评论 / 0 点赞 / 73 阅读 / 0 字

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.*这样一段空间而已。

博主关闭了所有页面的评论