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.

[参考译文] CC1310:编程期间写入闪存扇区(而非运行时)

Guru**** 2482225 points
Other Parts Discussed in Thread: CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1212132/cc1310-writing-to-a-flash-sector-during-programming-not-during-runtime

器件型号:CC1310

您好!

是否可以在编程期间将数据写入闪存中的 NVS 扇区(与其余固件一起)、然后在运行时读取?  

基本而言、我们要做的是:我们将在制造过程中对控制器进行编程(但不运行)。 之后、对所有器件进行测试、并将校准数据写入 NVS。 在此校准期间、如果我们要保存在 NVS 中的某些参数已经具有可从 NVS 获取的默认值、将会很有帮助。 例如、器件 ID 被初始化为公共批号、之后由单个唯一的器件 ID 覆盖。  

我曾尝试搜索类似这样的示例、但我的所有搜索都以 NVS_DRIVER 结束。 因此、如果这是可能的(并不是非常复杂、容易出错)、您可以向我指出查找的方向吗? 我不知道我需要搜索什么。  

使用 CC1310以及 SDK 4.20和 CCS 11.1

大家好  

最大值

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

    您好、Max:

    这有两个方面。  

    1. 在编译+加载期间、您希望将特定信息片段放在闪存中的特定地址中。  
    2. 然后您需要在运行时编辑此闪存位置。  

    第一步、可以使用连接器 pragma。 这个线程的建议是一样的。  

    https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/748131/ccs-cc1310-cc1310-initial-nvs-content

    然后、要在运行时写入内存位置、必须使用 NVS 驱动程序。  

    此致、

    SID  

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

    尊敬的 Sid:

    这听起来正是我们需要的,我会有一个很大的收益。 非常感谢。  

    大家好

    最大值

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

    尊敬的 Sid:

    抱歉、现在我有时间进行调查、请跟进问题:  

    我将 ABS 建议(根据您发布的主题)添加到了我的代码中、因此我的 CC1310_LAUNCHXL.c 看起来与类似;  

    #define NVS_REGIONS_BASE 0x1A000
    #define SECTORSIZE       0x1000
    #define REGIONSIZE       (SECTORSIZE * 4)
    
    #ifndef Board_EXCLUDE_NVS_INTERNAL_FLASH
    
    /*
     * Reserve flash sectors for NVS driver use by placing an uninitialized byte
     * array at the desired flash address.
     */
    #if defined(__TI_COMPILER_VERSION__)
    
    /*
     * Place uninitialized array at NVS_REGIONS_BASE
     */
    
    #pragma LOCATION(flashBuf, NVS_REGIONS_BASE);
    #pragma NOINIT(flashBuf);
    static char flashBuf[REGIONSIZE];
    
    #define ADDRESS (volatile uint16_t*)0x0001A000
    #pragma LOCATION( myData , ADDRESS );
    const uint8_t myData[4] = {0xFA, 0xFB, 0xFC, 0xFD};
    

    这给了我一个错误: 第683行:错误#159:表达式必须是一个积分常量表达式

    如果我用硬编码的 0x0001A000替换该地址、它就会编译。  

    但是、当我运行程序时、写入在0x1A000处的数据仍然是我在之前的测试中写入的数据(使用 NVS 驱动程序)。

    我删除了写入部分、只是从该位置读取、因此我不是误删除数据:  

    int main(void)
    {
    	Board_initGeneral();
    
    	GPIO_init();
    	SPI_init();
    	ADC_init();
    	NVS_init();
    
    	nvmData strNvmData; 
    	bool bStatus; 
    	bStatus = NVMRead(&strNvmData);
    	
    	...

    我猜它与设置 flashBuf 区域的 NOINIT 语句有什么关系? 如果我尝试更改 NOINIT 区域、它要么不运行、要么读取 NVS 不再起作用、但仍然不能使用链接器 pragma 写入闪存(即新值、我可以在"Memory Browser"中看到旧值)。

    我是什么人?  

    大家好

    最大值  

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

    您好、Max:

    抱歉该线程上的延迟。 我 能够使用 LOCATION pragma。  

    您对未初始化数组的放置方式是正确的。 不应将它放在那里、这样您就可以将变量放置在该位置、然后由 NVS 驱动程序访问。  

    我已注释掉 flashBuf 在 CC1310_LAUNCHXL.c 文件中的位置。

    #define NVS_REGIONS_BASE 0x1A000
    #define SECTORSIZE       0x1000
    #define REGIONSIZE       (SECTORSIZE * 4)
    
    #ifndef Board_EXCLUDE_NVS_INTERNAL_FLASH
    
    /*
     * Reserve flash sectors for NVS driver use by placing an uninitialized byte
     * array at the desired flash address.
     */
    #if defined(__TI_COMPILER_VERSION__)
    
    /*
     * Place uninitialized array at NVS_REGIONS_BASE
     */
    //#pragma LOCATION(flashBuf, NVS_REGIONS_BASE);
    //#pragma NOINIT(flashBuf);
    //static char flashBuf[REGIONSIZE];
    
    
    /* Allocate objects for NVS Internal Regions */
    NVSCC26XX_Object nvsCC26xxObjects[1];
    
    /* Hardware attributes for NVS Internal Regions */
    const NVSCC26XX_HWAttrs nvsCC26xxHWAttrs[1] = {
        {
            .regionBase = (void *)NVS_REGIONS_BASE,
            .regionSize = REGIONSIZE,
        },
    };

    然后使用该 pragma  

    #pragma LOCATION(placementtest, 0x1A000)
    static const char placementtest[20] = {"ABCDEFGHIJKL"};

    我能够使用 NVS 驱动程序读取此闪存位置。  

    希望这对您有所帮助。  


    此致、

    SID

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

    尊敬的 Sid:  

    不用担心、感谢您就此问题再次与我联系。  

    当我得到机会时、我会对此进行测试。 但这对我来说看起来很完美,我会假设这可以解决我的问题。

    再次感谢大家。

    您好!

    最大值