协议栈flash数据存储实验
Cc2540自带了256k的flash,可以存储数据也可以存储代码
协议栈自带了snv管理代码,读函数osal_snv_read,写函数osal_snv_write
数据都有一个唯一的id,snv通过这个唯一的id管理FLASH中的数据
OSAL目录下的Bcomdef.h中定义了他自身所使用的一部分id,示例代码如下:
示例应用:在SNV中存入串口接收的数据,断电重启后读取这串字符串,并通过串口发送
1 首先在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
2 修改simpleBLEPeripheral.c文件
添加头文件
#include "osal_snv.h"
然后在启动事件中添加读取snv中0x80的值
//启动事件
if ( events & SBP_START_DEVICE_EVT )
{
// Start the Device
VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );
Serial_Init(); // 串口初始化
//读取snv中0x80的值
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;
}
运行结果如下