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.

[参考译文] CC2640:OSAL_SNV 挂起外部存储中的应用程序

Guru**** 2553450 points
Other Parts Discussed in Thread: CC2640, CC2650, CC1350, CC1310, CC2630

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/574840/cc2640-osal_snv-hangs-application-in-external-storage

器件型号:CC2640
主题中讨论的其他器件: CC2650CC1350CC1310CC2630

您好!

IDE:CCS v6.2
编译器:v5.2.8
适用于 CC13xx 和 CC26xx 的 TI-RTOS:2.18.0.03
CC2640蓝牙 SDK 版本: BLE_SDK_2_02_00_31

我们有一个从传感器标签项目派生出来的项目。 我们只有2个任务:GapRole 和 Sensortag。

我们需要能够在非易失性存储器中存储几个字节(小于20)。 我们来看看有两种方法:

1) 1)直接访问闪存

2)使用 SNV

因此、我们尝试通过转到堆栈项目并将 OSAL_SNV 从0设置为1 (甚至是2)来使用 SNV。

但是,当我们重新编译应用程序和堆栈、程序并运行时,应用程序在调用 BIOS_start()时立即挂起。

当我们编译时、我们会看到应用程序和堆栈的链接器中的更改、在此段中需要额外的0x1000。 因此、我们不知道失败的原因、这是否是以前的错误
解决了该问题、或者需要其他任何东西。
我们有足够的闪存空间、我们使用的是标准 ccfg_app_ble.c 配置、这似乎会禁用安全性和其他功能。

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

    您好!

    我之前已经对 CC2650的闪存(同一器件不同的无线电)进行了编程、但由于 SNV 似乎与我们所需的内容不一致、因此我一直远离 SNV。

    当您使用闪存 driverlib 时、代码实际上非常简单。

    在文件中、您需要包含 flash.h 和 vims.h (以及用于标准 halLibrary 函数的 hal_mcu.h)

    下面是我们使用的代码:

    void FlashDriverWrite (uint8*数据、uint32地址、uint16长度)
    {
    uint32 status;
    uint32 VM;
    halIntState_t cs;
    
    HAL_enter_critical_section (cs);
    DisableFlashCache (&VM);
    //将所有字节写入源缓冲区
    状态= FlashProgram (数据、地址、长度);
    
    RestoreFlashCache (VM);
    HAL_EXIT_CRITICAL_SECTION (cs);
    }
    
    void FlashDriverRead (uint8*数据、uint32地址、uint16长度)
    {
    while (length---)(while (l
    {
    *数据=*((uint8*)地址);
    ++数据;
    ++地址;
    }
    }
    
    uint32 FlashDriverErasePage (uint32地址)
    {
    uint32 err;
    uint32 VM;
    halIntState_t cs;
    
    HAL_enter_critical_section (cs);
    DisableFlashCache (&VM);
    err = FlashSectorErase (address);
    RestoreFlashCache (VM);
    HAL_exit_critical_section (cs);
    
    返回错误;
    }
    
    void DisableFlashCache (UINT32 *VM)
    {
    //保存当前高速缓存模式
    *VM = VIMSModeGet (VIMS_BASE)& VIMS_STAT_MODE_M;
    //禁用高速缓存
    VIMSModeSet (VIMS_BASE、VIMS_MODE_DISABLED);
    //等待直至它出现
    while (VIMSModeGet (VIMS_BASE)!= VIMS_MODE_DISABLED);
    }
    
    静态空 RestoreFlashCache (UINT32 VM)
    {
    //将高速缓存恢复到以前的状态
    VIMSModeSet (VIMS_BASE、VM);
    } 

    如果您想使用 SNV、那么我将不会提供太多帮助。 但您可以在论坛中寻找答案(在搜索字段中、您可以尝试不同的器件、例如 CC2650、CC2630、CC1310、CC1350)

    此致、

    米歇尔