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.

[参考译文] CC3220:如何从 CC3220读取内部闪存?

Guru**** 2536790 points
Other Parts Discussed in Thread: CC3220SF, UNIFLASH

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/750404/cc3220-how-to-read-internal-flash-from-cc3220

器件型号:CC3220

您好!

根据 CC3220 SDK、"simplelink_cc32xx_sdk_2_30_00_05\source\ti\devices\cc32xx\driverlib"中的"flash"文件我发现 API 仅用于编程。 但是、没有 API 可以从 CC3220SF 的内部闪存读取相同的数据、我能不知道通过指向地址和长度来读取数据的任何替代方法。  

谢谢你

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

    内部闪存(XIP)被映射到芯片的地址空间。 如果您需要读取 XIP 闪存的内容、则可以使用指针。 这与地址空间的任何部分相同。 替代方法您可以通过链接器文件创建专用段。 但我认为这对我没有太大帮助。

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

    尊敬的 Jan:

    感谢您的响应、我计划将一些数据存储到闪存中、以使其保持永久性、并在每次上电时读取。

    如果您需要读取 XIP 闪存的内容、则可以使用指针

    在运行时我要读取它、您能简单介绍一下吗? 我通过指向地址来教授读取、可以从 RAM 中读取。

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

    为此、您应该使用 SL_文件系统 API 并将数据保存到闪存中。 XIP 闪存不是存储永久数据的最佳位置。 在某些情况下,XIP 闪存的内容由 ROM 引导加载程序(例如 e2e.ti.com/.../747150 )擦除。

    要阅读内容、您可以使用类似的内容:

    CHAR* XIP = 0x01000000;// 0x01000000 - XIP 闪存开始*/
    printf ("%2x"、*XIP);

    1月
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何使用 SL_文件系统 API? 是否有任何可用的示例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请参阅 www.ti.com/.../swru455e.pdfdev.ti.com/.../上的第7章

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

    我已经尝试过相同的操作、我正在获取 错误代码以打开新文件。 我是这样做的

    char file[8]="testfile";
    OpenNewFile (file); 

    FileHdl = sl_FsOpen ((unsigned char *) DeviceFileName、\
    SL_FS_CREAT|SL_FS_CREATE_SECURE | SL_FS_CREATE_NOSIGNATURE | SL_FS_CREATE_MAX_SIZE (MaxSize)、\
    &MasterToken);
    UART_PRINT ("OpenNewFile %d"、FileHdl);
    if (FileHdl < 0)
    {
    /*ERROR */
    } 

    获取错误代码-2018

    似乎是错误 SL_RET_CODE_DEV_NOT _Started 和器件尚未启动。

    您能否简要介绍一下它的工作原理、

    我需要在 Uniflash 中存储闪存期间的任何文件、还是要存储什么?

    谢谢你

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

    在使用任何 SL_ API 之前、您需要通过 sl_Start()启用 NWP。

    1月
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jan:
    在初始化所有任务后、我将在 OOB 项目中执行此操作。 sl_Start()在 sl_FS_open()之前调用;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您需要在项目中遇到其他问题。 我非常确定返回错误代码、因为 NWP 未启动。 您能不能显示您将 SL_文件系统 API 放置在哪个位置?

    1月
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void * mainThread (void * arg)
    {
    int32_t RetVal;
    pthread_attr_t pAttrs;
    pthread_attr_t pAttrs_spawn;
    struct sched_param primParam;
    struct timespec ts ={0};
    
    GPIO_init();
    spi_init();
    I2C_init();
    
    /*初始化终端,并打印应用程序名称*/
    InitTerm();
    
    /*初始化实时时钟*/
    Clock_settime (clock_realtime、&ts);
    
    InitializeAppVariables();
    
    /*关闭主板上的所有 LED */
    GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_OFF);
    
    /*初始化所有任务的信号*/
    SEM_INIT (&Provisioning_ControlBlock.connectionAppouminedEvent、0、0);
    SEM_INIT (&Provisioning_ControlBlock.provisioningDoneSignal、0、0);
    SEM_INIT (Provisioning_ControlBlock.provisioningConnDoneToOtaServerSignal、
    0、
    0);
    SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStartSignal、0、0);
    SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStopSignal、0、0);
    
    /*创建 sl_Task */
    pthread_attr_init (&pAttrs_spawn);
    priParam.sched_priority = sawn_task_priority;
    RetVal = pthread_attr_setschedparam (&pAttrs_spawn、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs_spawn、task_stack_size);
    
    RetVal = pthread_create (&gSpawnThread、&pAttrs_sprawn、sl_Task、NULL);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 SL_Task 线程\n");
    while (1)
    {
    ;
    }
    }
    MODE = SL_Start (0、0、0);
    if (mode >= 0)
    {
    DisplayBanner (application_name、application_version);
    MODE = SL_Stop (SL_STOP_TIMEOUT);
    if (MODE < 0)
    {
    /*句柄错误*/
    UART_PRINT ("\n SL_Stop 失败\n");
    while (1)
    {
    ;
    }
    }
    
    否则(((MODE < 0)&&(MODE!= SL_ERROR_RESTORE_IMAGE_COMPLETE))
    {
    /*句柄错误*/
    UART_PRINT ("\n sl_Start Failed\n");
    UART_PRINT ("\n %s 示例版本。 %s\n",application_name,
    application_version);
    while (1)
    {
    ;
    }
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、LINKLOCAL_STACK_SIZE);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 linkLocalTask 线程参数\n");
    while (1)
    {
    ;
    }
    }
    
    RetVal = pthread_create (&gLinklocalThread、&pAttrs、linkLocalTask、NULL);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 linkLocalTask 线程\n");
    while (1)
    {
    ;
    }
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、task_stack_size);
    
    if (重定位)
    {
    //处理错误//
    UART_PRINT ("无法配置置备任务线程参数\n");
    while (1)
    {
    ;
    }
    }
    
    RetVal = pthread_create (.gProvisioningThread、&pAttrs、ProvisioningTask、
    null);
    
    if (重定位)
    {
    //处理错误//
    UART_PRINT ("无法创建置备任务线程\n");
    while (1)
    {
    ;
    }
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、control_stack_size);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 controlTask 线程参数\n");
    while (1)
    {
    ;
    }
    }
    
    RetVal = pthread_create (&gControlThread、&pAttrs、controlTask、NULL);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 controlTask 线程\n");
    while (1)
    {
    ;
    }
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 5;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、task_stack_size);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 otaTask 线程参数\n");
    while (1)
    {
    ;
    }
    }
    
    RetVal = pthread_create (&gOtaThread、&pAttrs、otaTask、NULL);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 otaTask 线程\n");
    while (1)
    {
    ;
    }
    }
    
    char testfileName[8]="testfile";
    OpenNewFile (testfileName);
    
    返回(0);
    } 

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

    您好!

    您在 NWP 停止时调用 API、请参阅代码:

    MODE = SL_Start (0、0、0);
    if (mode >= 0)
    {
    DisplayBanner (application_name、application_version);
    MODE = SL_Stop (SL_STOP_TIMEOUT);
    if (MODE < 0)
    {
    /*句柄错误*/
    UART_PRINT ("\n SL_Stop 失败\n");
    while (1)
    {
    ;
    }
    }
    
    否则(((MODE < 0)&&(MODE!= SL_ERROR_RESTORE_IMAGE_COMPLETE))
    {
    /*句柄错误*/
    UART_PRINT ("\n sl_Start Failed\n");
    UART_PRINT ("\n %s 示例版本。 %s\n",application_name,
    application_version);
    while (1)
    {
    ;
    }
    }
    

    1月