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.

[参考译文] CC2538的NV还原问题

Guru**** 2928980 points

Other Parts Discussed in Thread: TIMAC

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/615656/nv-restore-issue-for-cc2538

主题中讨论的其他部件:TIMAC

您好,TI:

我对NV内存感到困惑,我发现NV不在闪存的特定位置,现在我不知道如何检查特定NV存储正确或错误。

因为我只保存了一个NV,NV ID为0x0402,如下所示:

#define WTM_in_TIMAC_OR_ZStack_mode    0x0401
#define WTM_SENSOR_ID       0x0402

OSAL_NV_ITE_INIT (WTM_SENSOR_ID,1,NULL);
   OSAL_NV_READ (WTM_SENSOR_ID,0,1,&SENSOR_id);

重置后的某个时间,该值将转到0xFF,我不知道为什么? 因为在此之前我设置为0x01。

我的版本是statv.1.2 2a.

我也不知道下面的两个问题:

1:

#ifdef NV_RESTORE
 OSAL_NV_INIT(NULL);/*此函数显示时间为21.85ms*/

#endif

如果我不调用此函数,如果我想在启动时保存消耗的电流,是否正常?

2:为了减少启动时间的消耗电流,我们的项目已对TIMAC和ZStack固件进行了控制。

如果某个时候项目运行TIMAC,我们不调用zgInit();/*consume51ms*/,如果运行ZStack代码,它将调用zgInit(); function。它是否会影响WTM_SENSOR_ID的NV ID值?

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您尝试遵循以下代码,它是否正常工作?

    #define NV_test_id 0x0401

    UINT16 test_write= 0x1234;

    UINT16 test_read=0x0;

    OSAL_NV_item_init(NV_test_id,1, NULL);

    OSAL_NV_WRITE (NV_TEST_id,0,1,&TEST_WRITE);

    OSAL_NV_READ(NV_test_id,0,1,&test_read);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是可以的,因为在读取之前,我们会将值写入ID。但有时并非所有时间都将进入0xFF,因为我们只在启动时读取。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在进行调试时是否会看到此问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在调试器状态下找不到它,因为重置后,MCU在我使用system_reset时不会与调试器同步,但如果我只是重置代码,它就不能更改。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可能不太了解您的问题。 您能再详细说明一下吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /************************************************************************
    *@fn. 主
    *
    *@启动后调用的第一个简短函数。
    *
    *@参数无
    *
    *@返程不在乎
    */
    INT MAIN ( void )

    //关闭中断
    OSAL_int_disable( ints_all );/*此2.2毫秒之前*/


    //板相关内容(如LED)的初始化
    HAL_Board_init();/*此函数为550us*/


    //初始化板I/O

    InitBoard( OB_COLD );/*时间很短,不能从示波器*/进行测量


    //初始化HAL驱动程序

    HalDriverInit();/*200us*/

    //GPIOPinTypeGPIOOutput (GPIO_A_BASE,GPIO PIN_0);
    //GPIOPinWrite (GPIO _A_BASE,GPIO PIN_0,GPIO PIN_0);

    //初始化NV系统
    #ifdef NV_RESTORE
    //osal_NV_init(NULL);/*此函数的超时时间为21.85ms*/

    #endif

    OSAL_NV_ITE_INIT (WTM_IN_TIMAC_OR_ZStack_MODE,1,NULL);

    OSAL_NV_READ(WTM_IN_TIMAC_OR_ZStack_MODE, 0, 1,&Timac_ZStack_MODE);


    IF (Timac_ZStack_mode=0xFFU)

    TIMAC_ZStack_MODE=0U;
    OSAL_NV_ITE_INIT (WTM_IN_TIMAC_OR_ZStack_MODE,1,NULL);
    OSAL_NV_WRITE (WTM_IN_TIMAC_OR_ZStack_MODE,0,1,&Timac_ZStack_MODE);
    }
    //初始化MAC
    IF (Timac_ZStack_mode=0U)

    Mac_Init();/*有时时间很长,超过25ms,正常温度为540us*/

    }
    否则

    ZMacInit();//22ms之前/*无法打开此文件,因为在高温测试中,初始化时间为80ms*/
    }
    /*50ms*/





    //确定扩展地址
    zmain_ext_addr();

    #if已定义ZCL_KEY_establish
    //初始化Certicom证书信息。
    zmain_cert_init();
    #endif

    //初始化基本NV项目
    IF (Timac_ZStack_mode!=0U)

    zgInit();//消耗51毫秒/*********************************************** //*进入ISP并退出*//*时不会保存NV项目。如果屏蔽了此信息,则ZStack TX/Rx未确定*/
    }

    #ifndef NONWK.
    //由于AF不是一项任务,因此将其称为初始化例程
    afInit();
    #endif

    IF (Timac_ZStack_mode=0U)

    //tasksArr = tasksArr_Timac;
    tasksCnt = tasksCnt_Timac;
    }
    否则

    //tasksArr = tasksArr_ZStack;
    tasksCnt = taskscnt_ZStack;
    }


    /*50ms*/
    //初始化操作系统
    OSAL_INIT_SYSTEM();
    /*50ms*/

    #IF 1.
    IF (Timac_ZStack_mode=0U)



    Mac_Read_chip_IEEE-ADDR (MSA_ExtAddr);

    network_init_check();



    /*恢复设备的网络设置*/
    Mac_NvDeviceRestore (&MSA_ExtAddr,
    &MSA_PanId,
    &MSA_AssociateReq.coordAddress.addr.shortAddr,
    &MSA_DevShortAddr,
    #ifdef feature_MAC_security
    &MSA_NumOfSecureDevices,
    &MSA_deviceTable,
    &MSA_keytable);
    #否则
    空,
    空,
    空);
    #endif

    }



    #endif

    OSAL_NV_ITE_INIT (WTM_SENSOR_ID,1,NULL);
    OSAL_NV_READ (WTM_SENSOR_ID,0,1,&SENSOR_id);

    #IF 1.
    #ifdef ota_client
    #ifdef TIMAC
    /*设置键盘回叫*/
    HalKeyConfig (MSA_KEY_INT_ENABLED,MSA_Main_KeyCallback);
    /*如果设置了回调函数,则开始轮询*/
    OSAL_SET_EVENT (Hal_TaskID,HAL_KEY_EVENT);//如果MSA_KEY_INT_ENABLED =true//for test,则需要此参数
    #endif
    #endif
    #ifdef ota_client
    #ifdef NV_RESTORE
    //osal_set_event (MSA_TaskId,MSA_NV_RESTORE_EVENT);
    #endif
    #endif
    #endif
    //允许中断
    OSAL_int_enable( ints_all );//用于测试

    SysTickSetup();

    //最终板初始化
    InitBoard( OB_READY );

    /*在LCD上显示设备信息*/
    #ifdef lcd_supported
    //zmain_dev_info();
    //zmain_lcd_init();
    #endif

    //#ifdef WDT_IN_PM1
    #ifndef watchdog调试禁用

    /*如果使用WDT,这是启用它的好地方。 */

    IF (Timac_ZStack_mode=0U)


    WatchDogEnable( watchdog_interval_3.2768万);
    //osal_set_event( ZDAppTaskID, LOADCONTROL_WDT_CLEAR );
    }

    #endif
    //#endif




    OSAL_START_SYSTEM();//从此处不返回

    返回0;//不应到达此处。
    }//主()


    这是我的主要功能,有时读取NV ID WTM_SENSOR_ID:

    OSAL_NV_ITE_INIT (WTM_SENSOR_ID,1,NULL);
    OSAL_NV_READ (WTM_SENSOR_ID,0,1,&SENSOR_id);



    OSAL_NV_ITE_INIT (WTM_IN_TIMAC_OR_ZStack_MODE,1,NULL);

    OSAL_NV_READ(WTM_IN_TIMAC_OR_ZStack_MODE, 0, 1,&Timac_ZStack_MODE);

    sensor_id和Timac_ZStack_mode的值将为0xFF,我意味着有时不是每次都是。
    闪存似乎已被擦除,并进入装置状态。

    巴西,
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不认为在main()中进行NV读/写是好的。 我建议您在应用程序init中执行此操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的YiKai:

    感谢您的回复。因为在正常模式下,我们对系统使用TIMAC初始化,而对于OTA,我们使用了ZStack初始化,所以我们只能在main()中使用NV读/写进行初始化控制。

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

    我在主功能中测试了以下红色代码,并且工作正常。

    #define NV_test_id 0x0401
    UINT8 test_write= 0x78;
    UINT8 test_read=0x0;

    INT MAIN ( void )

     //关闭中断
     OSAL_int_disable( ints_all );

     //板相关内容(如LED)的初始化
     HAL_Board_init();

     //初始化板I/O
     InitBoard( OB_COLD );

     //初始化HAL驱动程序
     HalDriverInit();

     //初始化NV系统
     OSAL_NV_INIT( NULL );

     //YK测试NV
     
     OSAL_NV_item_init(NV_test_id,1, NULL);
     OSAL_NV_READ(NV_test_id,0,1,&test_read);
     OSAL_NV_WRITE (NV_TEST_id,0,1,&TEST_WRITE);
     OSAL_NV_READ(NV_test_id,0,1,&test_read);

     //初始化MAC
     ZMacInit();