CC2530 NV最细致讲解操作

刚开始接触CC2530NV时,我查的协议栈API函数,结果发现怎么也使用不对NV函数,我就开始各种测试,终于在我不懈努力下,弄清楚了NV操作,而且更重要的是,协议栈API函数说明对读者有误,在此我跟正一下。

NV就是NonVolatile的缩写,即为非易失性存储器,也就是断电后也不会擦除。在CC2530单片机中这存储器称为Flash存储器。下面我隆重介绍一下这三个API函数。

1. osal_nv_item_init(uint16 id,uint16len,void *buf)

说明:这是NV条目初始化函数,在协议栈中使用NV存储器是将该存储器分成很多条目,每个条目都有一个ID号,我是用的是Z-Stack Home 1.2.2a。该协议栈留给用户的ID条目是在ZconDef.h文件中,从0x0401 —0x0FFF。

uint16 id:即为你宏定义0x0401的条目。

uint16 len: 这个是你想保存在nv里的数据长度。这个很关键!!!如:你要保存uint8 Nv_BUFF[N],则这个参数即为N,这是协议栈API函数没有说清楚的地方。

void *buf:这个毫无意义,在接下来的两个函数中会用到,在这个初始化函数中其值为空,所以NULL。

2. osal_nv_write(uint16 id, uint16ndx,uint16 len,void *buf)

说明:这是NV写入函数,就是想要把你的数据写到NV存储器中。

uint16 id:还是和你初始化时的条目一样如0x0401。

uint16 ndx:这个也要和读者解释一下,协议栈说明也有误。它指的是距离条目开始地址的偏移量,如果你有多个NV条目,你需要做的是初始化NV条目和写NV条目都要对应起来,这样ndx参数一直为0,因为你没有偏移量。所以这个参数一直为0!

uint16 len: 这个是你要写入数据的长度,很明显即为Nv_BUFF[N],即为N。

void *buf:这个是你要写入NV存储器数据的指针,所以这个参数即为&Nv_BUFF。

3. osal_nv_read(uint16 id,uint16ndx,uint16 len,void *buf)

说明:这是NV读函数,即将NV存储器中该ID条目下的数据读取出来,然后存放在*buf中。

  id,ndx,len和写函数一致,但是void*buf的值,你需要创建一个和Nv_BUFF[N]一样类型一样长度的数组,(假如:uint8 Nv_TXT[N])则该参数为&Nv_TXT。

最重要的要来了,试问,怎样在终端上电后,就能读取NV条目然后按照上一次保存在NV存储器中的参数运行呢?

你需要定义一个标志位,在程序烧入进去的时候,你将标志位写一个0,然后终端上电后读取NV标志位,如果是0则没有写入NV存储器按照定义的参数运行即可,一旦有新的参数过来,你把参数保存在NV顺便将标志位赋一个中间数,也写入到NV中。如果发生断电,上电后,终端再次读取NV中的标志位时已经不是0了,所以将NV条目下所有的数据读取出来,按照这个参数运行,即可。

全部手打,好累啊,如果有人转载,请注明出处,谢谢。保护知识产权,从我们现在做起。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值