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.

[参考译文] CCS/MSP432P401R:如何解锁闪存信息存储器扇区(TLV)

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/575884/ccs-msp432p401r-how-to-unlock-flash-information-memory-sector-tlv

部件号:MSP432P401R

工具/软件:Code Composer Studio

你好

我正在使用具有MSP432 MCU的定制板。

正如我所看到的数据表,我似乎能够对闪存信息存储器上的一些数据(变量)进行编程。

我正在尝试在上面写入一些数据,但它不起作用。

问题:

1.是否可以在闪存信息存储器(0x0020_0000 ~0000 ~ 0x0020_3FFF)区域中写入一些变量?

2.如果可能,在关机时是否存储此数据?

3.如果不能,是否有办法存储一些数据(变量),这些数据可以更改,但应在关机时存储?

这是我的尝试代码

----------------------------------------------------------------------------------------------------------------------------------------------

//写入闪存
 Flashctl_enableWordProgramming(flash_eded_write_mode);
  FlashCtl_unprotectSector (FLASH_MAIN_MEMORY_SPACE_BANK00xFFFFFFFF);
  FlashCtl_unprotectSector (FLASH_MAIN_MEMORY_SPACE_BANK1,0xFFFFFFFF);
  Flashctl_unprotectSector(flash_info_memory_space_BANK0,flash_SECTOR0 | flash_SECTOR1);
  Flashctl_unprotectSector(flash_info_memory_space_Bank1,flash_sector0| flash_sector1);
  UINT32_t* FLASH_PTR;
  FLASH_PTR =(int*)0x2.0102万C;
  *FLASH_PTR = c_address[0];
  FLASH_PTR =(int*)0x2.0102万D;
  *FLASH_PTR = c_address[1];
  FLASH_PTR =(int*)0x2.0102万E;
  *FLASH_PTR = c_address[2];
  FlashCtl_protectSector (FLASH_MAIN_MEMORY_SPACE_BANK00xFFFFFFFF);
  FlashCtl_protectSector (FLASH_MAIN_MEMORY_SPACE_BANK1,0xFFFFFFFF);
  Flashctl_protectSector(flash_info_memory_space_BANK0,flash_SECTOR0 | flash_SECTOR1);
  Flashctl_protectSector(flash_info_memory_space_Bank1,flash_SECTOR0 | flash_SECTOR1);
  Flashctl_disableWordProgramming();

 ----------------------------------------------------------------------------------------------------------------------------------------------

//读取闪存

  tempp =(int*)0x2.0102万C;
  temp[0]=*tempp;
  tempp =(int*)0x2.0102万d;
  temp[1]=*tempp;
  tempp =(int*)0x2.0102万E;
  temp[2]=*tempp;
----------------------------------------------------------------------------------------------------------------------------------------------
//链接器命令  
内存

   main      (rwx):原点= 0x0万,长度= 0x4万
   info      (rwx):origin = 0x20万,length = 0x0.4万    //cheanged to rwx以便写入
   SRAM_CODE (rwx):原始= 0x100万,长度= 0x1万
   SRAM_DATA (RW):原点= 0x2000万,长度= 0x1万
}
/*以下命令行选项作为CCS项目的一部分进行设置。    */
/*如果您使用命令行进行构建,或出于某种原因希望   */
/*在此处定义它们,您可以根据需要取消注释和修改这些行。     */
/*如果您使用CCS进行构建,最好制作任何这样的*/
/*在CCS项目中进行修改,并将此文件保留为单独文件。              */
/*                                                                          */
/*当您计划使用printf()   */时,建议使用1024字节的堆大小
/*用于控制台窗口的调试输出。                                   */
/*                                                                          */
/*--heap_size=1024                                                         */
/*--stack_size=512                                                         */
/*--library=rtsv7M4_T_le_eabi.lib                                          */
/*内存中的部分分配*/
章节

   intvecs   :>0x0万
   text      :> main
   const     :> main
   constdata :> main
   .cinit     :> main
   Pinit     :> Main
   init_array:> main
   *          :>主要
   sysmem:>信息
   .flashMailbox:>0x20万
   .vtable:  > 0x2000万
   数据  :  > SRAM_DATA
   .bss   :  > SRAM_DATA
   sysmem:  > SRAM_DATA
   .stack :  > SRAM_DATA (高)
}
/* RTS的WDTCTL寄存器的符号定义*/
wdttl_sym = 0x400.048万C;
----------------------------------------------------------------------------------------------------------------------------------------------

此致

世元公园

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

    您好,

    我将开始研究这个问题,但可能需要几天时间才能给出回复。  不过,您应该会在周五收到我的回复。

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

    你好,SAE Won Park

     让我尝试回答您的问题:

    [报价用户="Park SAE Won"]1. 是否可以在闪存信息存储器(0x0020_0000 ~0000 ~ 0x0020_3FFF)区域中写入一些变量?

    是的(TLV区除外), 但我不推荐。 该区域由四个扇区组成,其中包含预先编程的数据。

    因此 ,请使用Flash的不同部分(主闪光灯),如果您需要任何设置方面的帮助,请告诉我们。

    [QUETE USER="Park SAE Won]2. 如果可能,在关闭电源时是否存储此数据?[/QUOT]

      关闭电源后,存储在闪存中的所有数据都将保留。

    希望这能有所帮助。

     David

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

    我需要更多帮助。

    因为我在问题后编写代码,所以在编写代码时无法正常工作。

    当我在上面写一些数据时,它不会改变。

    如何更改?

    您还能建议我在哪里(地址)书写吗?

    谢谢。

    世元公园
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外,当我在SRAM_DATA (RW)中写入任何位置时:origin = 0x2000万,length = 0x1万,它会改变,但在关机时就消失了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    世元公园

    您会看 一下这篇文章吗?  我用它作为学习基础修改了一些代码,它对我来说非常有用。

    我建议使用主内存来完成此操作。

    每次重置设备时,我修改的代码基本上会将一个添加到存储在主气缸组1,扇区31中的var1中。 我将代码放在下面。  在CCS上输入debug将擦除主内存,因此应转至项目属性->调试->MSP432设置。  然后,如果您打算使用调试器内存浏览器来验证是否正在存储值并将其保存在闪存中,请将擦除配置更改为“仅擦除并下载必要的段”。  我从 这个例子开始。 我更改了.cmd和.c文件以使其工作。

    修改后的.cmd文件:

    /************************************************************************

    *

    *版权所有(C) 2012 - 2016 Texas Instruments Incorporated - http://www.ti.com/

    *

    *以源代码和二进制形式重新分发和使用,无论是否使用

    *允许进行修改,前提是满足以下条件

    满足*:

    *

    *重新分发源代码必须保留上述版权

    *注意,此条件列表和以下免责声明。

    *

    *以二进制形式重新分发必须复制上述版权

    *注意,此条件列表和中的以下免责声明

    *随提供的文档和/或其他材料

    *分发。

    *

    *既不是德州仪器(TI)公司的名称,也不是的名称

    *其贡献者可用于支持或推广衍生产品

    *未经事先书面许可。

    *

    *本软件由版权所有者和贡献者提供

    *"按原样"和任何明示或暗示的担保,包括但不包括

    *仅限于对适销性和适用性的暗示担保

    *不承担特定目的。 在任何情况下,版权都不应享有

    *所有者或贡献者对任何直接,间接,附带,

    *特殊,典型或后果性损害(包括但不包括

    *限于采购替代货物或服务;无法使用,

    *数据或利润;或业务中断)

    责任理论,无论是合同,严格责任还是侵权行为

    *(包括疏忽或其他)因使用而产生的任何原因

    本软件的*版本,即使已被告知可能会造成此类损坏。

    *

    *用于德州仪器(TI) MSP432P401R的默认链接器命令文件

    *

    *文件创建日期:2016年06月29日

    *

    ***************** /

    --retain=flashMailbox

    内存

    主(RX):原点= 0x0万,长度= 0x0003F000

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

    信息(RX):原点= 0x20万,长度= 0x0.4万

    #ifdef __TI_Compiler_version__

    #if __TI_Compiler_version__>= 1500.9万

    别名

    SRAM_CODE (rwx):原始= 0x100万

    SRAM_DATA (RW):原点= 0x2000万

    }长度= 0x1万

    #否则

    /*提示:如果用户要使用ram功能,请注意SRAM_CODE */

    /*和SRAM_DATA存储器区域重叠。 您需要采取措施分离*/

    /* RAM中代码的数据。 这仅对早于15.09 .0.STS.*/的编译器版本有效

    SRAM_CODE (rwx):原始= 0x100万,长度= 0x1万

    SRAM_DATA (RW):原点= 0x2000万,长度= 0x1万

    #endif

    #endif

    }

    /*以下命令行选项作为CCS项目的一部分进行设置。 */

    /*如果您使用命令行进行构建,或出于某种原因希望*/

    /*在此处定义它们,您可以根据需要取消注释和修改这些行。 */

    /*如果您使用CCS进行构建,最好制作任何这样的*/

    /*在CCS项目中进行修改,并将此文件保留为单独文件。 */

    /**/

    /*当您计划使用printf()*/时,建议使用1024字节的堆大小

    /*用于控制台窗口的调试输出。 */

    /**/

    /*--heap_size=1024 */

    /*--stack_size=512 */

    /*--library=rtsv7M4_T_le_eabi.lib */

    /*内存中的部分分配*/

    章节

    intvecs:> 0x0万

    text:> main

    const:> main

    .cinit:> main

    Pinit:> Main

    init_array:> main

    MyData :{}> MyData

    binit :{}> main

    /*以下各节显示了INFO闪存的使用情况*/

    /* info闪存用于以下*/

    /*设备特定用途:*/

    /*用于设备安全操作的闪存邮箱*/

    .flashMailbox:>0x20万

    /*用于设备识别和表征的TLV表*/

    .tlvTable:> 0x20.1万

    /*设备引导加载程序的BSL区域*/

    .bslArea :>0x20.2万

    .vtable:> 0x2000万

    数据:> SRAM_DATA

    .bss:> SRAM_DATA

    sysmem:> SRAM_DATA

    .stack:> SRAM_DATA (高)

    #ifdef __TI_Compiler_version__

    #if __TI_Compiler_version__>= 1500.9万

    .TI.ramfunc :{} load=main, run=SRAM_code, table(BINIT)

    #endif

    #endif

    }

    /* RTS的WDTCTL寄存器的符号定义*/

    wdttl_sym = 0x400.048万C;

    修改的.c文件:

    /*
    --------------------------------------------
    * MSP432驱动程序库- v3_50_00_02
    *----------------------------------
    *
    **-版权所有-,BSD,BSD
    *版权所有(c) 2016,Texas Instruments Incorporated
    *保留所有权利。
    *
    **
    允许以源代码和二进制格式重新发布和使用,无论是否进行*修改,只要
    满足以下条件*:
    *
    ****重新发布源代码必须保留上述版权
    *声明,此条件列表和以下免责声明。
    *
    ***以二进制格式重新分发时,必须在
    
    随分发提供的*文档和/或其他材料中复制上述版权*声明,此条件列表和以下免责声明。
    *
    ***
    
    未经事先书面许可,不得使用德州仪器(TI)公司的名称或*其贡献者的名称来支持或促销由本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *,
    
    不提供任何明示或暗示的担保,包括但不限于*对适销性和特定*用途适用性的暗示担保。 在任何情况下,版权所有者或
    *贡献者均不对任何直接,间接,附带,特殊,
    *示范, 或后果性损害(包括但不限于
    *购买替代商品或服务;使用,数据或利润损失;
    (*或业务中断),但根据任何责任理论
    ,*无论是合同,严格责任还是侵权行为(包括疏忽或
    *其他),均因使用本软件而导致*
    ,即使已被告知此类损害的可能性。
    -/copyright--*//*******************************************************************************************************
    
    * MSP432闪存控制器-编程校准数据
    *
    说明:此示例显示了使用闪存控制器API
    *擦除模拟校准数据并将其编程到内存中的特定区域。
    *本例中的数据编程到用户存储器区域。 "fake (假)
    "*校准数据存储在RAM阵列中,并使用memset函数进行设置,
    但在实际应用中,此缓冲区将使用串行
    *接口(如I2C)进行填充。
    *
    ** MSP432P401
    * -----------
    * /|\\| |
    * || |
    * --|RST |
    * | |
    * | |
    * | |
    * | |
    * | |
    *
    *作者:Timothy Logan (由John Morrison为这一E2E职位修改)
    ****************************************************************************** /*
    DriverLib包括*/
    #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/*
    
    Standard包括*/
    #include <stdint.h>
    
    #include <stdbool.h>
    #include <string.h>
    
    #define calibration_start 0x0003F000
    
    /* statics */
    uint16_pragma 1;<1中
    
    的模拟数据(<stratedated.1);
    
    
    var1LOCAL =0;
    
    int main (void)
    {
    var1LOCAL = var1;
    var1LOCAL++;
    /*由于此程序具有模拟校准数据的巨大缓冲区,
    *在重置ISR中停止监视程序,以避免监视程序
    *归零期间超时
    */
    
    /*将MCLK设置为48MHz以加快编程*/
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
    Flashctl_setWaitState(flash_BANK0, 2);
    Flashctl_setWaitState(flash_Bank1,2);
    MAP_CS_setDCOCenteredFrequency (CS_DCO_Frequency_48);
    
    /*将缓冲区初始化为0xA5 */模式
    memset (simulatedCalibrationData,0xA54096);
    simulatedCalibrationData[0]= var1LOCAL;
    
    /* 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);
    
    /*不使用时转到LPM3 */
    同时(1)
    {
    MAP_PCM_GotoLPM3();
    }
    }
    

    如果这对我有帮助,或者您需要进一步解释这里的内容,请告诉我。

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

    这非常有效。