12
返回列表 发新帖
楼主: cjpx84

[已解决] MKL14系列的MCU,想在UBOOT下更新mcu的版本是否可行(已解决)

[复制链接]

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-6 14:33:01 | 显示全部楼层
是的,我又看了下L系列的手册,发现其实L系列只有一个P-FLASH,而没有D-FLASH.因此,要使用这个驱动我只需要配置P-FLASH的相关参数,D-FLASH的按照代码要求配置无效参数即可。
我先试试官方的驱动是否可以正常在L14上正常运行。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-7 10:01:13 | 显示全部楼层
昨天我按照官方例程,在MKL14上做了下实验,发现调用FlashEraseSector,FlashReadResource等接口时会出现非法指令错误。错误提示如下:
No source available for "0xFFFFFFFE (0xFFFFFFFE)() "
点击CW的继续运行之后,MCU又从main函数开始执行,然后在一次报出No source available for "0xFFFFFFFE (0xFFFFFFFE)() " 错误。

我的代码配置如下:

#define FLASH_DERIVATIVE                  FTFx_LX_64K_0K_0K_1K_0K

/* FTFA module base */
#define FTFx_REG_BASE             0x40020000U
#define PFLASH_BLOCK_BASE         0x00000000U
#define DEFLASH_BLOCK_BASE        0xFFFFFFFFU
#define EERAM_BLOCK_BASE          0xFFFFFFFFU

#define PBLOCK_SIZE               0x00010000U      /* 64KB size */
#define EERAM_BLOCK_SIZE          0x00000000U     

#define PBLOCK_NUM                1 /* number of individual Pflash block */

/* destination to program security key back to flash location */
#define SECURITY_LOCATION         0x40CU
#define BACKDOOR_KEY_LOCATION     0x400U

#define PFLASH_IFR                0xC0U /*Program flash IFR map*/

#define CC_RDCOL_ISR_NUM          21

//#define CACHE_DISABLE
#define CACHE_DISABLE             MCM_PLACR |= MCM_PLACR_DFCDA_MASK;

FLASH_SSD_CONFIG flashSSDConfig =
{
    FTFx_REG_BASE,          /* FTFx control register base */
    PFLASH_BLOCK_BASE,      /* base address of PFlash block */
    PBLOCK_SIZE,            /* size of PFlash block */
    DEFLASH_BLOCK_BASE,     /* base address of DFlash block */
    0x0U,                   /* size of DFlash block */
    EERAM_BLOCK_BASE,       /* base address of EERAM block */
    0x0U,                   /* size of EEE block */
    DEBUGENABLE,            /* background debug mode enable bit */
    NULL_CALLBACK           /* pointer to callback function */
};


然后就在main函数调用:
/* Read on P-Flash */
    dest = flashSSDConfig.PFlashBlockBase + PFLASH_IFR; /* Start address of Program Once Field */
    ret = FlashReadResource(&flashSSDConfig, dest, DataArray, 0x0U, FlashCommandSequence);

    if (FTFx_OK != ret)
    {
        ErrorTrap(ret);
    }
   

结果就报了上面这个错误,麻烦帮忙看看是不是我哪里的配置有问题?谢谢!
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-1-7 10:18:17 | 显示全部楼层
cjpx84 发表于 2015-1-7 10:01
昨天我按照官方例程,在MKL14上做了下实验,发现调用FlashEraseSector,FlashReadResource等接口时会出现非 ...

能否介绍一下你的配置过程,在KBOOT v1.1.0中就有针对KL25的bootloader例程,只需稍作改变,应该就可以在KL14运行啊。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-7 10:33:22 | 显示全部楼层
我现在还没有用你给我提供的bootloader,我现在在验证c90那个flash驱动。配置过程的话,我就按照demo程序的流程:
1)修改user_config.h文件,将FLASH_DERIVATIVE 定义成 FTFx_LX_64K_0K_0K_1K_0K,因为MKL14只有P-FLASH,而且是64kb,扇区大小为1kb。
2)定义P-FLASH的块基地址,寄存器地址,扇区地址。
3)初始化FLASH_SSD_CONFIG flashSSDConfig ,结构体,然后调用flashInit接口。

4)调用FlashReadResource接口,报错。


另外,我调用另外两个接口,FlashGetSecurityState和PFlashGetProtection接口,能够正常工作。
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-1-7 11:05:14 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-7 12:39:44 | 显示全部楼层
嗯,我看了你个我发的这两个链接,我的配置过程跟链接上的描述一致,我用的也是demo_normal例程的代码,我看了下我的配置文件,应该是从flash上运行的,但是,我参考的代码是demo_normal例程的NormalDemo_Ram.c文件,我这样用是否有问题?还是应该直接用NormalDemo_Flash.c文件中的实现?

我的链接文件如下所示:
/*
*****************************************************************************
**
**  File        : KL14Z64M4_flash.ld
**
**  Default linker command file for Flash targets
**
*****************************************************************************
*/
/* Entry Point */
ENTRY(__thumb_startup)

/* Highest address of the user mode stack */
_estack = 0x20001800;    /* end of SRAM */
__SP_INIT = _estack;

/* Generate a link error if heap and stack don't fit into RAM */
__heap_size = 0x100;                                /* required amount of heap  */
__stack_size = 0x100;                                 /* required amount of stack */

/* Specify the memory areas */
MEMORY
{
  m_interrupts        (rx) : ORIGIN = 0x00000000, LENGTH = 0xC0
  m_cfmprotrom         (rx) : ORIGIN = 0x00000400, LENGTH = 0x10
  m_text                 (rx) : ORIGIN = 0x00000800, LENGTH = 64K - 0x800
  m_data            (rwx) : ORIGIN = 0x1FFFF800, LENGTH = 8K                        /* SRAM */
}

               
/* Define output sections */
SECTIONS
{
  /* The startup code goes first into Flash */
  .interrupts :
  {
        __vector_table = .;
    . = ALIGN(4);
    KEEP(*(.vectortable)) /* Startup code */
    . = ALIGN(4);
  } > m_interrupts
  
  .cfmprotect :
  {
    . = ALIGN(4);
        KEEP(*(.cfmconfig))        /* Flash Configuration Field (FCF) */
        . = ALIGN(4);
  } > m_cfmprotrom

  /* The program code and other data goes into Flash */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } > m_text

  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > m_text
  .ARM : {
    __exidx_start = .;
      *(.ARM.exidx*)
      __exidx_end = .;
  } > m_text
  
  .ctors :
  {
    __CTOR_LIST__ = .;
    /* gcc uses crtbegin.o to find the start of
       the constructors, so we make sure it is
       first.  Because this is a wildcard, it
       doesn't matter if the user does not
       actually link against crtbegin.o; the
       linker won't look for a file to match a
       wildcard.  The wildcard also means that it
       doesn't matter which directory crtbegin.o
       is in.  */
    KEEP (*crtbegin.o(.ctors))
    /* We don't want to include the .ctor section from
       from the crtend.o file until after the sorted ctors.
       The .ctor section from the crtend file contains the
       end of ctors marker and it must be last */
    KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors))
    KEEP (*(SORT(.ctors.*)))
    KEEP (*(.ctors))
    __CTOR_END__ = .;
  } > m_text  
  .dtors :
  {
    __DTOR_LIST__ = .;
    KEEP (*crtbegin.o(.dtors))
    KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
    KEEP (*(SORT(.dtors.*)))
    KEEP (*(.dtors))
    __DTOR_END__ = .;
  } > m_text  

  .preinit_array :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } > m_text
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } > m_text
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
       
        ___ROM_AT = .;
  } > m_text
  
  /* reserve MTB memory at the beginning of m_data */
  .mtb : /* MTB buffer address as defined by the hardware */
  {
    . = ALIGN(8);
    _mtb_start = .;
    KEEP(*(.mtb_buf)) /* need to KEEP Micro Trace Buffer as not referenced by application */
    . = ALIGN(8);
    _mtb_end = .;
  } > m_data  

  /* Initialized data sections goes into RAM, load LMA copy after code */
  .data : AT(___ROM_AT)
  {
    . = ALIGN(4);
    _sdata = .;        /* create a global symbol at data start */
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */

    . = ALIGN(4);
    _edata = .;        /* define a global symbol at data end */
  } > m_data
  
  ___data_size = _edata - _sdata;

  /* Uninitialized data section */
  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss section */
    __START_BSS = .;
        PROVIDE ( __bss_start__ = __START_BSS );
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    __END_BSS = .;
        PROVIDE ( __bss_end__ = __END_BSS );
  } > m_data

  _romp_at = ___ROM_AT + SIZEOF(.data);
  .romp : AT(_romp_at)
  {
        __S_romp = _romp_at;
    LONG(___ROM_AT);
    LONG(_sdata);
    LONG(___data_size);
    LONG(0);
    LONG(0);
    LONG(0);
  } > m_data

  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack :
  {
    . = ALIGN(4);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
        __heap_addr = .;
    . = . + __heap_size;
    . = . + __stack_size;
    . = ALIGN(4);
  } > m_data
  
  .ARM.attributes 0 : { *(.ARM.attributes) }
}
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-7 13:16:58 | 显示全部楼层
我试了下NormalDemo_Flash.c文件的实现,测试通过了。
但是,存在一个问题,我本来是想利用这个flash驱动来做版本升级的,但是我们的代码直接在flash上运行,这就会出现一个问题,如果我把flash擦除,就会导致我现有的代码不能正常运行了。如果我想用这个flash驱动做版本升级,能不能直接修改flash的第一条跳转指令,也就是说将现有的flash分成两个版本区域,通过标志来识别它来决定跳转到哪个版本运行。(bootloader的形式跟我们现有的版本升级模式不一致,可能不会考虑)
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-1-7 17:10:14 | 显示全部楼层
升级的问题没有解决,但是c90那个官方驱动在MKL14上验证通过了。谢谢FSL_TICS_ZP
的详细解答。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-23 11:01 , Processed in 0.103852 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表