查看: 543|回复: 1

[求助] 1052读写flash操作

[复制链接]

该用户从未签到

3

主题

4

帖子

0

注册会员

Rank: 2

积分
61
最后登录
2023-5-22
发表于 2023-3-31 18:48:34 | 显示全部楼层 |阅读模式
本帖最后由 经天纬地_659832 于 2023-3-31 18:50 编辑

由于项目需要,我在RT1052上需要进行Flash的读写,如下是工程的link.lds文件,我把flexspi_norflash.、 fsl_flexspi.c和fsl_clock.c的相关函数操作放在了m_data 段,然后 调用FlexSPI_Init  进行初始化,但是板子还是一上电就重启,无法进入系统  

/* Specify the memory areas */
MEMORY
{
  m_boot_data           (RX)  : ORIGIN = 0x60000000, LENGTH = 0x00001000
  m_image_vertor_table  (RX)  : ORIGIN = 0x60001000, LENGTH = 0x00001000  

  m_interrupts          (RX)  : ORIGIN = 0x60002000, LENGTH = 0x00000400
  m_text                (RX)  : ORIGIN = 0x60002400, LENGTH = 0x03FFDC00
  m_data                (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00020000
  m_data2               (RW)  : ORIGIN = 0x20200000, LENGTH = 0x00060000

  m_sdram               (RW)  : ORIGIN = 0x80000000, LENGTH = 0x01E00000
  m_nocache             (RW)  : ORIGIN = 0x81E00000, LENGTH = 0x00200000
}

/* Define output sections */
SECTIONS
{
  .boot_data :
  {
    KEEP(*(.boot_hdr.conf))
  } > m_boot_data

  .image_vertor_table :
  {
    KEEP(*(.boot_hdr.ivt))
    KEEP(*(.boot_hdr.boot_data))
    KEEP(*(.boot_hdr.dcd_data))
  } > m_image_vertor_table

  /* The startup code goes first into internal RAM */
  .interrupts :
  {
    __VECTOR_TABLE = .;
    . = ALIGN(4);
    KEEP(*(.isr_vector))     /* Startup code */
    . = ALIGN(4);
  } > m_interrupts

  __VECTOR_RAM = __VECTOR_TABLE;
  __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0;

  /* The program code and other data goes into internal RAM */
  .text :
  {
    . = ALIGN(4);
    *(EXCLUDE_FILE(
        /* Exclude flash and frequently executed functions from XIP */
        *flexspi_norflash.o
        *fsl_flexspi.o
        *fsl_clock.o
    ) .text)                 /* .text sections (code) */
    *(EXCLUDE_FILE(
        /* Exclude flash and frequently executed functions from XIP */
        *flexspi_norflash.o
        *fsl_flexspi.o
        *fsl_clock.o
    ) .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);


    /* section information for  shell */
        . = ALIGN(4);
        _shell_command_start = .;
        KEEP (*(shellCommand))
        _shell_command_end = .;
        . = ALIGN(4);

        __isrtbl_idx_start = .;
        KEEP(*(.isrtbl.idx))
        __isrtbl_start = .;
        KEEP(*(.isrtbl))
        __isrtbl_end = .;
        . = ALIGN(4);

        PROVIDE(g_service_table_start = ABSOLUTE(.));
        KEEP(*(.g_service_table))
        PROVIDE(g_service_table_end = ABSOLUTE(.));
  } > 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))
    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 *crtend.o) .ctors))
    KEEP (*(SORT(.ctors.*)))
    KEEP (*(.ctors))
    __CTOR_END__ = .;
  } > m_text

  .dtors :
  {
    __DTOR_LIST__ = .;
    KEEP (*crtbegin.o(.dtors))
    KEEP (*crtbegin?.o(.dtors))
    KEEP (*(EXCLUDE_FILE(*crtend?.o *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 = .);
  } > m_text

  __etext = .;    /* define a global symbol at end of code */



  __DATA_ROM = .; /* Symbol is used by startup for data initialization */

  .data : AT(__DATA_ROM)
  {
    . = ALIGN(4);
    __DATA_RAM = .;
    __data_start__ = .;      /* create a global symbol at data start */
    /* Explicit placement of flash and frequently executed functions in RAM */
    */flexspi_norflash.o
    */fsl_flexspi.o
    */fsl_clock.o

    *(.data)                 /* .data sections */
    *(.data*)                /* .data* sections */
    KEEP(*(.jcr*))
    . = ALIGN(4);

    __data_end__ = .;        /* define a global symbol at data end */

  } > m_data

  __NDATA_ROM = __DATA_ROM + (__data_end__ - __data_start__);
  .ncache.init : AT(__NDATA_ROM)
  {
    __noncachedata_start__ = .;   /* create a global symbol at ncache data start */
    *(NonCacheable.init)
    . = ALIGN(4);
    __noncachedata_init_end__ = .;   /* create a global symbol at initialized ncache data end */
  } > m_nocache
  . = __noncachedata_init_end__;
  .ncache :
  {
    *(NonCacheable)
    . = ALIGN(4);
    __noncachedata_end__ = .;     /* define a global symbol at ncache data end */
  } > m_nocache

  __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__);
  text_end = ORIGIN(m_text) + LENGTH(m_text);
  ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")

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

  .stack :
  {
    . = ALIGN(8);
    stack_start = .;
    . += STACK_SIZE;
    stack_end = .;
    __StackTop = .;
    heap_start = .;
  } > m_data2

  PROVIDE(heap_end = ORIGIN(m_data2) + LENGTH(m_data2));

  .ARM.attributes 0 : { *(.ARM.attributes) }
}




如下是初始化代码
    int i = 0;
    int ret = 0;

    BOARD_ConfigMPU();
    BOARD_InitPins();
    BOARD_BootClockRUN();

    NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
    SysTick_Config(SystemCoreClock / TICK_PER_SECOND);

    InitBoardMemory((void *)HEAP_BEGIN, (void *)HEAP_END);

#ifdef BSP_USING_LPUART
    Imxrt1052HwUartInit();
#endif

    InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME);
    KPrintf("\nconsole init completed.\n");
    KPrintf("board initialization......\n");

    KPrintf("board init done.\n");
    KPrintf("start kernel...\n");

    FlexSPI_Init();




下面是上电后串口打印的内容
board initialization......
board init done.
onsole init completed.
board initialization......
board init done.
onsole init completed.
board initialization......
board init done.
onsole init completed.
board initialization......
board init done.
onsole init completed.
board initialization......
board init done.
onsole init completed.
board initialization......
board init done.
onsole init completed.
board initialization......
board init done.
onsole init completed.
board initialization......
board init done.
onsole init completed.
board initialization......
board init done.
onsole init completed.
board initialization......
board init done.
onsole init completed.
board initialization...
有遇到过这种问题的朋友吗


回复

使用道具 举报

该用户从未签到

35

主题

356

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2586
最后登录
2023-6-23
发表于 2023-4-10 14:00:57 | 显示全部楼层
SDK里有这样的例程,你看看那个例程是怎么做的。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-29 22:28 , Processed in 0.107939 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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