This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F2013 FLASH的信息段在下载程序时初始化问题

如何下载程序时将信息段D的64个字节初始化为特定值,我做了如下尝试:

1.希望达到的效果:

#pragma location="INFOD"
const unsigned short tablea[32] = { 0x0001, 0x0002, 0x0003, 0x0004,
                                   0x0000, 0x0000, 0x0000, 0x0000,
                                   0x0000, 0x0000, 0x0000, 0x0000,
                                   0x0000, 0x0000, 0x0000, 0x0000,
                                   0x0000, 0x0000, 0x0000, 0x0000,
                                   0x0000, 0x0000, 0x0000, 0x0000,
                                   0x0000, 0x0000, 0x0000, 0x0000,
                                   0x0000, 0x0000, 0x0000, 0x0000};

进入调试查看memory,全部为0xFFFF.

2.如果将相同值放入信息段C却可以实现,如下:

#pragma location="INFOC"
const unsigned short tableb[32] = { 0x0001, 0x0002, 0x0003, 0x0004,
                                        0x0000, 0x0000, 0x0000, 0x0000,
                                        0x0000, 0x0000, 0x0000, 0x0000,
                                        0x0000, 0x0000, 0x0000, 0x0000,
                                        0x0000, 0x0000, 0x0000, 0x0000,
                                        0x0000, 0x0000, 0x0000, 0x0000,
                                        0x0000, 0x0000, 0x0000, 0x0000,
                                        0x0000, 0x0000, 0x0000, 0x0000};

进入调试查看memory,与tableb完全一致.,但信息段C已经被其它程序使用

3.问题。是不是我还需要添加什么设置,麻烦各位大侠指点。

  • 除了INFOA,INFOB~INFOD没啥区别的
    你用的iar还是ccs?
  • #pragma 的location 这种用法你的编译器支持吗?去查一下AN 呢? 我记得还要指定名称的吧。

    我一般这样写

    #pragma LOCATION( tablea , 0x1800)

  • 使用的IAR5.5.和开发软件配置有关吗?

  • 1.应该是支持location的,已经实现在信息段B和C同样的方式操作。
    2.我尝试了一下 你的方法:

    #pragma LOCATION(tablea , 0x1000)
    const unsigned short tablea[32] =     { 0x0001, 0x0002, 0x0003, 0x0004,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000};

    编译警告:Warning[Pe161]: unrecognized #pragma

    3.您说到的“指定名称”,具体是什么呢?

  • 不要沉哦,高手在哪里!!

  • 你用的什么版本的编译器,去查一下编译器的指令表,这个指定存放区域的命令每个编译器不一样的。

  • zhifang yang1 说:

    你用的什么版本的编译器,去查一下编译器的指令表,这个指定存放区域的命令每个编译器不一样的。

    我使用的地址定位指令是支持的,因为已经实现信息段C相同方式的定位。

  • 方便上传下工程吗? 大家可以帮你测试一下

  • 你好!

    换一片试试呢?你试一下在程序中用操作擦除和写INFOD是否正常

    附件是例程。

  • jinzhao hua ,

    1. 如果你用的是CCS的话,

    CCS中可以给变量分配固定地址,C语言对应语法为:

    #pragma DATA_SECTION ( symbol , " section name " );

    对应的使用例子为:

    #pragma DATA_SECTION(bufferB, "my_sect")
    char bufferA[512];
    char bufferB[512];

    而其中的 my_sect是在对应工程的cmd文件中进行指定的,你可以在cmd文件的


    MEMORY
    {
    RAM1:     o = 200h, l = 10h

    ......
    }

    中专门指定出一块RAM用来存放你的变量,此段RAM的起始地址直接定成你想要给变量分配的固定地址,再给它自己起个名字RAM1,自己可以定。其中o后为起始地址,l为长度。

    而后在

    SECTIONS
    {
    ........
    my_sect > RAM1
    }

    中指定my_sect存在RAM1中即可。

    这样symbol就可以放在固定的地址了。

    2. 如果是IAR

    参考如下:

    /* IAR C Code */
    __no_init char alpha @ 0x0200; /* Place 'alpha' at address 0x200 */
    #pragma location = 0x0202
    const int beta;

    这些内容在文档“MSP430 Optimizing C or C++ Compiler v 4.0 User's Guide”中均有详细讲解。

  • jinzhao hua 说:

    如何下载程序时将信息段D的64个字节初始化为特定值,我做了如下尝试:

    1.希望达到的效果:

    #pragma location="INFOD"
    const unsigned short tablea[32] = { 0x0001, 0x0002, 0x0003, 0x0004,
                                       0x0000, 0x0000, 0x0000, 0x0000,
                                       0x0000, 0x0000, 0x0000, 0x0000,
                                       0x0000, 0x0000, 0x0000, 0x0000,
                                       0x0000, 0x0000, 0x0000, 0x0000,
                                       0x0000, 0x0000, 0x0000, 0x0000,
                                       0x0000, 0x0000, 0x0000, 0x0000,
                                       0x0000, 0x0000, 0x0000, 0x0000};

    进入调试查看memory,全部为0xFFFF.

    2.如果将相同值放入信息段C却可以实现,如下:

    #pragma location="INFOC"
    const unsigned short tableb[32] = { 0x0001, 0x0002, 0x0003, 0x0004,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000,
                                            0x0000, 0x0000, 0x0000, 0x0000};

    进入调试查看memory,与tableb完全一致.,但信息段C已经被其它程序使用

    3.问题。是不是我还需要添加什么设置,麻烦各位大侠指点。

    解决办法:添加代码“#pragma required=tablea”在引用的函数前面,这时候再调试,查看INFOD就和设置一样了。