企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
* 导师**视频**讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> NV也就是非易失存储器,简单来讲就是Z-Stack把芯片(比如CC2530)内部FLASH的一片空间拿出来用来存储数据,这片空间中一部分被Z-Stack使用了,使用的情况可以在文件ZComDef.h中进行查看: ![](https://img.kancloud.cn/98/67/98678642f8ac15819adf4f14e7dc2f84_418x696.png =300x) ### 我们重点要关注的是,ZStack保留了多少空间给用户使用,同样可以在文件ZComDef.h找到相应的定义: ![](https://img.kancloud.cn/6f/d3/6fd3de67368064a620cbb8c9b4abafd8_832x196.png =600x) ### 也就是地址从0x0401到0x0FFFF是保留给用户使用的,如果用户需要使用,在这里定义即可,比如我们想使用地址为0x0401的NV空间(每个地址可以存储一个字节的数据): ![](https://img.kancloud.cn/4b/aa/4baa81d3c96c0a202b123861b87b8a90_832x82.png =600x) ### ## \*\* **操作NV的文件及API** 在OSAL\_Nv.h中有几个重要的API: ![](https://img.kancloud.cn/71/8e/718e2bf1ebe38594b1fe9b2f1d9300b0_264x318.png =200x) ``` 1./*  2. * Initialize an item in NV  3. */   4.extern uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf );   5. 6./*  7. * Read an NV attribute  8. */   9.extern uint8 osal_nv_read(uint16 id,uint16 offset, uint16 len, void *buf);   10./*  11. * Write an NV attribute  12. */   13.extern uint8 osal_nv_write(uint16 id,uint16 offset,uint16 len, void *buf); ``` ### 第一个API用来初始化指定地址的NV,比如我们想初始化0x0401这个地址的空间: ``` 1.osal_nv_item_init(0x0401, 1, NULL);  // 参数len为1表示一个字节, 2. // 如果len不为1表示起始地 3. // 址后连续len个字节的空间 ``` ### 第二个API和第三个API的作用是对指定地址NV的读/写操作,其中参数id表示起始地址,offset表示起始地址需要偏移多少个字节作为操作的地址,len表示要操作的字节数。比如我要分别对0x0401地址进行写和读操作: ``` 1.uint8 writeVal;   2.uint8 readVal;   3.   4./*  5. *   Write, USER_NV_TEST -> 0x0401  6. */   7.osal_nv_write( USER_NV_TEST, 0, 1, &writeVal );  // 写 8.   9./*  10. *   Read, USER_NV_TEST -> 0x0401  11. */   12.osal_nv_read( USER_NV_TEST, 0, 1, &readVal);   // 读 ``` ### 使用NV时,必须先初始化后才能进行读/写操作,NV指定地址的空间只需要被初始化一次即可,后面再对该地址调用初始化函数其实不会起作用了,待会结合例子大家就明白!