ble学习笔记十五----------ble协议栈之flash数据存储实验

协议栈flash数据存储实验

Cc2540自带了256kflash,可以存储数据也可以存储代码

协议栈自带了snv管理代码,读函数osal_snv_read,写函数osal_snv_write

数据都有一个唯一的id,snv通过这个唯一的id管理FLASH中的数据 

OSAL目录下的Bcomdef.h中定义了他自身所使用的一部分id,示例代码如下:

示例应用:SNV中存入串口接收的数据,断电重启后读取这串字符串,并通过串口发送

首先在bcomdef.h中添加哪下代码

//自定义存储数据的id 

#define BLE_NVID_USER_CFG_START    0x80  //!< Start of the USER Configuration NV IDs

#define BLE_NVID_USER_CFG_END       0x89  //!< End of the USER Configuration NV IDs

修改simpleBLEPeripheral.c文件

添加头文件


#include "osal_snv.h"

然后在启动事件中添加读取snv0x80的值

//启动事件

  if ( events & SBP_START_DEVICE_EVT )

  {

    // Start the Device

    VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );

    Serial_Init();      // 串口初始化

    

    //读取snv0x80的值

if(SUCCESS == osal_snv_read( BLE_NVID_USER_CFG_START,  128, SerialRxBuf))

    {

      SerialPrintf("Read Snv ID %d success   Value is:"%s" ", BLE_NVID_USER_CFG_START, SerialRxBuf);

    }

    else

    {

        SerialPrintf("Read Snv ID %d failed ",  BLE_NVID_USER_CFG_START);

    }

    

    // Start Bond Manager

    VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );

    // Set timer for first periodic event

    osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );

    return ( events ^ SBP_START_DEVICE_EVT );

  }

在串口接收事件中将接收到的数据存储到snv,示例代码如下:

if ( events & UART_EVENT )

  {

    HalLcdWriteString( (char*)SerialRxBuf, HAL_LCD_LINE_6 );    // 在第5行显示启动信息

    //HalUARTWrite(HAL_UART_PORT_0, SerialRxBuf, osal_strlen(SerialRxBuf));

    if(SUCCESS == osal_snv_write( BLE_NVID_USER_CFG_START,  osal_strlen(SerialRxBuf), SerialRxBuf))

    {

        SerialPrintf("Save "%s" to Snv ID %d success ", SerialRxBuf, BLE_NVID_USER_CFG_START);

    }

    osal_memset(SerialRxBuf, 0, 128);

    return (events ^ UART_EVENT);

  }

  // Discard unknown events

  return 0;

}

运行结果如下

 

原文地址:https://www.cnblogs.com/retacn-yue/p/6194240.html