NV操作实验
1、实验内容:通过串口调试助手发送“nvread”命令,开发板接受到该命令读取NV存储器中的数据并发送给PC端的串口调试助手。
2、基本知识:
NV(Non Volatile),即非易失性存储器(Flash存储器),即系统掉电,存储器中的数据不掉失。主要用途保存网路的配置参数,或掉电后,上电该节点还是加入原来的网络并且该节点的网络地址就可以从NV读取。
NV存储器主要的操作有初始化NV存储器、读NV存储器、写NV存储器。这些都在OSAL文件夹下中的OSAL_Nv.h和OSAL.h文件中定义和实现。
下面三个操作函数分别是:
NV初始化函数:uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf ),NV存储器将该存储器分成多个条目,每个条目都有一个ID号。
条目的分类见OSAL文件夹中的ZcomDef.h文件,其中要知道的是:用户应用程序定义的条目地址范围为是0x0201到0x0FFF;
NV写操作函数:uint8 osal_nv_write( uint16 id, uint16 ndx, uint16 len, void *buf );
NV读取函数:uint8 osal_nv_read( uint16 id, uint16 ndx, uint16 len, void *buf );
第一个参数:uint16:NV条目ID号
第二参数:举例条目开始的偏移量
第三参数:要写入的数据长度
第四参数:执行要存放写入或读取数据函数缓冲区的指针
3、实验代码:在实验3 串口通信实验的基础上添加或修改代码实现的。
首先,在OSAL文件夹中的ZcomDef.h文件文件中添加一行代码,如下:
-
-
- #define ZCD_NV_APS_LINK_KEY_DATA_START 0x0201 // APS key data
- #define TEST_NV 0x0202 //添加了该行,表 测试条目
- #define ZCD_NV_APS_LINK_KEY_DATA_END 0x02FF
在Coordinator.c中添加或修改代码,具体如下:
-
- #include "OSAL.h"
- #include "AF.h"
- #include "ZDApp.h"
- #include "ZDObject.h"
- #include "ZDProfile.h"
- #include <string.h>
- #include "Coordinator.h"
- #include "DebugTrace.h"
- #if !defined(WIN32) //????
- #include "OnBoard.h"
- #endif
- #include "hal_lcd.h"
- #include "hal_led.h"
- #include "hal_key.h"
- #include "hal_uart.h"
- #include "OSAL_Nv.h" //使用NV操作函数,必须包含该头文件
- const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=
- {
- GENERICAPP_CLUSTERID
- };
-
-
- const SimpleDescriptionFormat_t GenericApp_SimpleDesc=
- {
- GENERICAPP_ENDPOINT,
- GENERICAPP_PROFID,
- GENERICAPP_DEVICEID,
- GENERICAPP_DEVICE_VERSION,
- GENERICAPP_FLAGS,
- GENERICAPP_MAX_CLUSTERS,
- (cId_t*)GenericApp_ClusterList,
- 0,
- (cId_t *)NULL
- };
-
- endPointDesc_t GenericApp_epDesc;
- byte GenericApp_TaskID;
- byte GenericApp_TransID;
- unsigned char uartbuf[128];
- void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pckt);
- void GenericApp_SendTheMessage(void);
-
- static void rxCB(uint8 port,uint8 envent);
- void GenericApp_Init(byte task_id)
- {
- GenericApp_TaskID =task_id;
- GenericApp_TransID =0;
-
-
- GenericApp_epDesc.endPoint =GENERICAPP_ENDPOINT;
- GenericApp_epDesc.task_id =&GenericApp_TaskID;
- GenericApp_epDesc.simpleDesc =(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;
- GenericApp_epDesc.latencyReq =noLatencyReqs;
- afRegister(&GenericApp_epDesc);
-
-
- halUARTCfg_t uartConfig;
-
- uartConfig.configured =TRUE;
- uartConfig.baudRate =HAL_UART_BR_115200;
- uartConfig.flowControl =FALSE;
- uartConfig.callBackFunc =rxCB;
-
-
-
- HalUARTOpen(0,&uartConfig);
- }
-
-
-
-
-
-
- static void rxCB(uint8 port,uint8 envent)
- {
-
-
- uint8 value_read;
- uint8 value=18;
- uint8 uartbuf[2];
- uint8 cmd[6];
- HalUARTRead(0,cmd,6);
- if(osal_memcmp(cmd,"nvread",6))
- {
- osal_nv_item_init(TEST_NV,1,NULL);
- osal_nv_write(TEST_NV,0,1,&value);
- osal_nv_read(TEST_NV,0,1,&value_read);
- uartbuf[0]=value_read/10+'0';
- uartbuf[1]=value_read%10+'0';
- HalUARTWrite(0,uartbuf,2);
- HalLedBlink(HAL_LED_1,0,50,500);
- }
- }
-
-
-
- UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events)
- {
- }
4、实验结果(ASCII中十六进制的31、38表字符1、8):
5、本文参考自:《ZigBee无线传感器网络设计与实现》 王小强等人编著化学工业出版社