ZStack(CC2530) 断电存储(NV)方法

来源:互联网 发布:面向对象编程什么意思 编辑:程序博客网 时间:2024/05/22 07:03

  写了很久的CC2530代码,终于要用到断电存储功能了。比如,我希望断电之后,重新上电能把我上次采集的温度信息保存下来。

其实很简单。

第一:不要预定义什么,你只需要看看你的代码里有没有用到  osal_nv_init(NULL)来进行NV初始化就好了。

查询位置: ZMain.c文件中的main()函数,如果有就可以进行第二步了。实在不是很确定的,可以IAR工具里Debug看看。

第二:写初始化代码

osal代码里说的很清楚,在使用osal_nv_readosal_nv_write之前必须调用osal_nv_item_init进行初始化。

从CC2530的<OSAL API.pdf>中可以看到自定义的NV 编号范围是 0x0401 – 0x0FFF。

 代码

   

#define ZD_NV_TEMP_ID 0x0404uint8 InitNVStatus=osal_nv_item_init(ZD_NV_TEMP_ID,sizeof(zclAirConditionFuns),NULL);

其中 zclAirConditionFuns为一个struct.
InitNVStatus的输出值见下表,这个非常关键:


值含义SUCCESS表示成功,并且该ID已经存在NV_ITEM_UNINIT表示成功,但ID之前不存在,即第一次初始化。NV_OPER_FAILED初始化失败


第二 : 读取NV的内容

    其实第一次读取时,读到的内容必然是无效的,因此要结合初始化的结果来判断信息是否有效。

zclAirConditionFuns  AirConditionStatusNV;
readNVStatus=osal_nv_read(ZD_NV_TEMP_ID,0, sizeof(zclAirConditionFuns),&AirConditionStatusNV );if(readNVStatus==SUCCESS&&InitNVStatus==SUCCESS){  ...................}


也就是说初次烧录代码时不会处理读到的信息,因为第一次读取的本来就是无效的,因为还没有写入过。当然,如果你在读取之前已经写过了,那就能读出有效信息。


第三: 向NV写内容


writeNVStatus=osal_nv_write(ZD_NV_TEMP_ID,0,sizeof(zclAirConditionFuns),&AirConditionStatus); 


注意事项:

1.  NV操作不能过于频繁,耗时耗能量。

2. 每次利用IAR烧录时就是重新擦除了,因此如果希望看自己的代码是否有效,只能断电重启通过其他方式验证,别指望通过DEBUG方式验证代码的有效性。


原创粉丝点击