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 \r\n Value is:\"%s\"\r\n", BLE_NVID_USER_CFG_START, SerialRxBuf);

    }

    else

    {

        SerialPrintf("Read Snv ID %d failed\r\n",  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\r\n", SerialRxBuf, BLE_NVID_USER_CFG_START);

    }

    osal_memset(SerialRxBuf, 0, 128);

    return (events ^ UART_EVENT);

  }

 

  // Discard unknown events

  return 0;

}

 

运行结果如下

 

 

 

posted @ 2014-10-30 20:53  retacn_yue  阅读(519)  评论(0编辑  收藏  举报