有关F2812的cmd文件的疑惑
本帖最后由 zhanggan009 于 2019-6-24 15:51 编辑各位大侠好!
最近正在写一个通过USB口更新DSP的固件的程序。刚开始就碰到了问题。运行官方的例子是没问题的。但我自己稍微修正一下就可能出错,现在只能几句几句的增加。非常困惑,主要体现在以下几个方面。
基本的CMD文件的部分,这样是正常的:
PAGE 0: /* Program Memory */
/* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
ZONE0 : origin = 0x002000, length = 0x002000 /* XINTF zone 0 */
ZONE1 : origin = 0x004000, length = 0x002000 /* XINTF zone 1 */
RAML0 : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */
RAML1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */
ZONE2 : origin = 0x080000, length = 0x080000 /* XINTF zone 2 */
ZONE6 : origin = 0x100000, length = 0x080000 /* XINTF zone 6 */
OTP : origin = 0x3D7800, length = 0x000800 /* on-chip OTP */
FLASHJ : origin = 0x3D8000, length = 0x002000 /* on-chip FLASH */
FLASHI : origin = 0x3DA000, length = 0x002000 /* on-chip FLASH */
FLASHH : origin = 0x3DC000, length = 0x004000 /* on-chip FLASH */
FLASHG : origin = 0x3E0000, length = 0x004000 /* on-chip FLASH */
FLASHF : origin = 0x3E4000, length = 0x004000 /* on-chip FLASH */
FLASHE : origin = 0x3E8000, length = 0x004000 /* on-chip FLASH */
FLASHD : origin = 0x3EC000, length = 0x004000 /* on-chip FLASH */
FLASHC : origin = 0x3F0000, length = 0x004000 /* on-chip FLASH */
FLASHB : origin = 0x3F4000, length = 0x002000 /* on-chip FLASH */
FLASHA : origin = 0x3F6000, length = 0x001F80 /* on-chip FLASH */
CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /* Part of FLASHA.Program with all 0x0000 when CSM is in use. */
BEGIN : origin = 0x3F7FF6, length = 0x000002 /* Part of FLASHA.Used for "boot to Flash" bootloader mode. */
CSM_PWL : origin = 0x3F7FF8, length = 0x000008 /* Part of FLASHA.CSM password locations in FLASHA */
......
Flash28_API:
{
-lFlash2812_API_V210.lib(.econst)
-lFlash2812_API_V210.lib(.text)
} LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_Flash28_API_LoadStart),
LOAD_END(_Flash28_API_LoadEnd),
RUN_START(_Flash28_API_RunStart),
PAGE = 0
ramfuncs : LOAD = FLASHD,
RUN = RAML1,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
.cinit : > FLASHA PAGE = 0
.pinit : > FLASHA, PAGE = 0
.text : > FLASHA PAGE = 0
.econst : > FLASHA PAGE = 0
.switch : > FLASHA PAGE = 0
IQmath : > FLASHC PAGE = 0 /* Math Code */
IQmathTables : > ROM PAGE = 0, TYPE = NOLOAD /* Math Tables In ROM */
.........
对应的map文件的部分内容如下:
PAGE 0:ZONE0 00002000 00002000 0000000000002000RWIXZONE1 00004000 00002000 0000000000002000RWIXRAML0 00008000 00001000 0000057500000a8bRWIXRAML1 00009000 00001000 000001ab00000e55RWIXZONE2 00080000 00080000 0000000000080000RWIXZONE6 00100000 00080000 0000000000080000RWIXOTP 003d7800 00000800 0000000000000800RWIXFLASHJ 003d8000 00002000 0000000000002000RWIXFLASHI 003da000 00002000 0000000000002000RWIXFLASHH 003dc000 00004000 0000000000004000RWIXFLASHG 003e0000 00004000 0000000000004000RWIXFLASHF 003e4000 00004000 0000000000004000RWIXFLASHE 003e8000 00004000 0000000000004000RWIXFLASHD 003ec000 00004000 00000720000038e0RWIXFLASHC 003f0000 00004000 0000000000004000RWIXFLASHB 003f4000 00002000 0000000000002000RWIXFLASHA 003f6000 00001f80 0000136500000c1bRWIXCSM_RSVD 003f7f80 00000076 0000000000000076RWIXBEGIN 003f7ff6 00000002 0000000200000000RWIXCSM_PWL 003f7ff8 00000008 0000000000000008RWIXROM 003ff000 00000fc0 0000000000000fc0RWIXRESET 003fffc0 00000002 0000000000000002RWIXVECTORS 003fffc2 0000003e 000000000000003eRWIX
PAGE 1:RAMM0 00000000 00000400 0000040000000000RWIXRAMM1 00000400 00000400 0000040000000000RWIXDEV_EMU 00000880 00000180 000000d6000000aaRWIX FLASH_REGS 00000a80 0000006000000008 00000058RWIXCSM 00000ae0 00000010 0000001000000000RWIXXINTF 00000b20 00000020 0000002000000000RWIX CPU_TIMER0 00000c00 0000000800000008 00000000RWIX CPU_TIMER1 00000c08 0000000800000008 00000000RWIX CPU_TIMER2 00000c10 0000000800000008 00000000RWIXPIE_CTRL 00000ce0 00000020 0000001a00000006RWIXPIE_VECT 00000d00 00000100 0000010000000000RWIXECAN_A 00006000 00000100 00000034000000ccRWIX ECAN_AMBOX 00006100 00000100 0000010000000000RWIXSYSTEM 00007010 00000020 0000002000000000RWIXSPI_A 00007040 00000010 0000001000000000RWIXSCI_A 00007050 00000010 0000001000000000RWIXXINTRUPT 00007070 00000010 0000001000000000RWIXGPIOMUX 000070c0 00000020 0000002000000000RWIXGPIODAT 000070e0 00000020 0000002000000000RWIXADC 00007100 00000020 0000001a00000006RWIXEV_A 00007400 00000040 000000320000000eRWIXEV_B 00007500 00000040 000000320000000eRWIXSCI_B 00007750 00000010 0000001000000000RWIXMCBSP_A 00007800 00000040 000000250000001bRWIXCSM_PWL 003f7ff8 00000008 0000000800000000RWIXRAMH0 003f8000 00002000 00000e7d00001183RWIX
随着代码的增加,flashA不够用了。我稍微一修改就错了,程序就会停在0x003FFC00这个地址附近,不再动作,可是这个区域从map文件中看是没有使用的。
修改比如:
1.扩大FLASHA
/* FLASHB : origin = 0x3F4000, length = 0x002000 */ /* on-chip FLASH */
FLASHA : origin = 0x3F4000, length = 0x003F80 /* on-chip FLASH */
2.或将上述5个使用FLASHA的段,部分定义到其他段
3.或只将.text指向其他FLASH区,哪怕根本没有占用多少字节,理解就运行不下去了。
以上三种修改立即就要出错,程序就会停在0x003FFC00这个地址附近,不再动作,实在是让人无法理解。
后来又发觉,当擦除SECTORA的时候会出错,我只能躲开FLASHA,擦除SECTORC又能成功了。
还请各位高手,指点一下小弟。
首先对应CMD和手册中memory映射对应看 不同的其实地址 不同的大小等
看看你新加的是否超了或者重复等
页:
[1]