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.

[参考译文] MSP432P401M:存储在msp432闪存中的变量

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/582291/msp432p401m-stored-variables-in-msp432-flash-memory

部件号:MSP432P401M
主题中讨论的其他部件: MSP432P401R

大家好,

我有MSP432P401M控制器。

我的编程有一个变量,我想将它存储到闪存中。

我希望我的变量在重置后不丢失或没有通电。

发送与msp432控制器相关的mi示例代码。

如何更改链接器文件设置??

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请看 一下这个论坛主题, 然后告诉我您在这样做后还有什么其他问题吗?  谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,John:

    我查看了有关存储在闪存中的变量的论坛。 我也在对我的命令文件进行更改。 我想在闪存中设置波特率,角度和偏移等变量。您能为我编写代码吗?? 或者发送mi任何在闪存中设置了变量的示例代码。

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不能为你写代码,但我在我上次的答复中加入了一个链接,它完全是这样,将变量存储在闪存中。  请参考该链接,然后告诉我您在该链接之后是否还有其他具体问题。  谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,John:

     我已经从MSP432 simplelink中获取了代码“闪存程序存储器”示例,并且在我的代码中仅使用了其擦除闪存部分,它存储了从0x1F000 (链接器命令文件中的我的数据部分)开始的5个默认值。 但是,擦除功能不起作用。因为它需要擦除我的默认存储值,如内存浏览器中所示。

    我正在附加main.c文件:-

    e2e.ti.com/.../7750.main.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sayali

    感谢您为我提供更多的工作环境。  我今天将看一下这个主菜单。c,并在一天结束前回复您。  

    您是否还可以向我发送.cmd文件以便我也可以验证它?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sayali

    我通读了你的主页c,我想你已经很接近完全正确了。

    我想询问您对我最初提供的链接的反馈。  是很难找到代码还是很难解释代码?

    我想说,读遍线程和代码 相当困难,因为格式不是很好。  

    因此,我直接附加在main.c和msp430p401r.cmd文件下面。  如果这样做不能使事情更加清晰,请告诉我,但至少现在您应该能够复制和粘贴 代码,并对其进行非常小的调整以实现您的目标。  (出于安全目的,文件msp430p401r.cmd是下面的".c"文件。  请将该代码复制并粘贴到项目的现有msp430p401r.cmd文件中。)

    **请注意,您的起始位置设置为0x0001_F000,但您仍在使用从  0x0003_F000开始的bank1,扇区31。**

    e2e.ti.com/.../8204.main.c

    e2e.ti.com/.../msp432p401r.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,John:

     我正在使用具有128KB闪存的MSP432P401M处理器。因此,主内存中的开始位置设置为0x0001_F000。 根据你的资料,我正在使用31区的银行0。 sistill,内存浏览器中的值 不会被擦除。

    我正在连接main.c.  

    e2e.ti.com/.../1055.main.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,John:
    我运行您提供给我的代码文件,并对代码进行如下更改:-
    1)校准从1F000 H开始,因为我正在使用具有128KB内存的MSP432P401M处理器。
    2)以及我正在更改.cmd文件中的内存地址(主内存和MyData)。

    MAIN (RX):原点= 0x0万,长度= 0x0001F000
    MyData (RX):原始= 0x0001F000,长度= 0x0.1万

    根据故障码0xA5应该存储在1F000H位置,但当我调试故障码A5时,不能存储在该存储位置。为什么??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sayali

    我在之前的附件中附加了一个名为msp432p401r.c的文件。  由于您没有附加.cmd文件,我无法为您验证它。  如果您所做的全部更改都是上面提到的2行,则这还不够。

    您需要导航到.cmd文件的节部分,然后按如下所示添加.MyData代码行(我通常将其放在这两个节之间,但我不知道将其放在其他位置会有什么不同。):

    init_array :> main
    .MyData :{}> MyData
    .binit :{}> main 

    您是否也这样做了?


    此外,main.c只擦除扇区,而不会再次调用编程它,例如:map_Flashctl_programMemory如下所示...

    /* Unprotecting Info Bank 0,Sector 0 */
    MAP_Flashctl_unprotectSector (FLASH_MAIN_MEMORY_SPACE_BANK1,FLASH_SECTOR31);
    
    /*正在尝试擦除扇区。 在此函数中,API将
    自动尝试清除最大尝试次数。 如果失败,
    在无限循环中捕获*/
    IF(!MAP_FlashCtl_eraseSector(calibration_start))
    同时(1);
    
    /*正在尝试对内存进行编程。 在此函数中,API将
    自动尝试设定最大尝试次数。 如果失败,
    在无限循环内陷印*/
    IF(!MAP_FlashCTL_programMemory(simulatedCalibrationData,
    (void*) calibration_start,4096)
    同时(1);
    
    /*将扇区设置回受保护的*/
    MAP_FlashCTL_ProtectSector(FLASH_MAIN_MEMORY_SPACE_BANK1,FLASH_SECTOR31);
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

      我已将一些默认值存储在闪存中,从1F000H开始。 我想首先确保可以在运行时清除此默认值?? 为此,我只使用代码中的3个函数,如下所示:-

    /* Unprotecting Info Bank 0,Sector 0 */
    MAP_Flashctl_unprotectSector (FLASH_MAIN_MEMORY_SPACE_BANK0,FLASH_SECTOR31);

    /*正在尝试擦除扇区。 在此函数中,API将
    自动尝试清除最大尝试次数。 如果失败,
    在无限循环中捕获*/
    IF(!MAP_FlashCtl_eraseSector(calibration_start))
    同时(1);


    /*将扇区设置回受保护的*/
    MAP_FlashCTL_ProtectSector(FLASH_MAIN_MEMORY_SPACE_BANK0,FLASH_SECTOR31);

    在调试代码时 ,必须注意到该程序没有擦除闪存,而是在上面提到的while (1)语句下失败并持续运行循环。我使用了以下默认值:-


    #pragma set_data_section(".MyData")
    const unsigned int MyData[]={0x0001,0x0002,0x0003,0x0004,0x0005};

    我已确认此值存储在闪存中,方法是在内存浏览器中从1F000H开始的位置看到它们。 我正在附加.cmd文件以供您参考

    e2e.ti.com/.../flash.docx

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sayali

    这一切对我来说都是正确的。  我唯一能想到的是,您是否定义了错误的calibration_start。  

    我将main.c和.cmd文件放入CCS上的项目 中(删除MSP432P401M.h文件,因为我使用的是带有MSP432P401R芯片的LP),并运行了代码。  我验证了是否正在使用内存浏览器擦除数据(下面的代码以及闪存 擦除和程序函数处的断点),因此我不确定您正在采取何种不同的做法?

    如果您只是复制经过main.c和flash.docx ( 为了方便使用,我将在下面链接这两个) 到一个新项目中,我认为您不需要进行任何修改来验证这两个项目是否正常工作; 但如果情况并非如此,请告诉我。

    /*正在尝试擦除扇区。 在此功能中,API将自动尝试清除最大尝试次数。 如果失败,
    在无限循环中捕获*/
    IF(!MAP_FlashCtl_eraseSector(calibration_start))
    {
    同时(1)
    {
    ;}
    
    }
    /*正在尝试对内存进行编程。 在此函数中,API将
    自动尝试设定最大尝试次数。 如果失败,
    在无限循环内陷印*/
    IF(!MAP_FlashCTL_programMemory(arr,
    (void*) calibration_start,NumBytes))
    同时(1);
    /*正在尝试擦除扇区。 在此功能中,API将自动尝试清除最大尝试次数。 如果失败,
    在无限循环中捕获*/
    IF(!MAP_FlashCtl_eraseSector(calibration_start))
    {
    同时(1)
    {
    ;}
    
    } 

    e2e.ti.com/.../0486.flash.docx e2e.ti.com/.../2553.1055 .main.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是否有帮助?