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

感谢原作者:huangmeimao

原帖地址:http://blog.csdn.net/huangmeimao/article/details/73649301 


写了很久的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。

 代码

   

[objc]  view plain  copy
 print ?
  1. #define ZD_NV_TEMP_ID 0x0404  
  2. uint8 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的内容

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

[objc]  view plain  copy
 print ?
  1. zclAirConditionFuns  AirConditionStatusNV;  
[objc]  view plain  copy
 print ?
  1. readNVStatus=osal_nv_read(ZD_NV_TEMP_ID,0sizeof(zclAirConditionFuns),&AirConditionStatusNV );  
  2. if(readNVStatus==SUCCESS&&InitNVStatus==SUCCESS){    
  3. ...................  
  4. }  


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


第三: 向NV写内容


[objc]  view plain  copy
 print ?
  1. writeNVStatus=osal_nv_write(ZD_NV_TEMP_ID,0,sizeof(zclAirConditionFuns),&AirConditionStatus);   


注意事项:

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值