赞
踩
写了很久的CC2530代码,终于要用到断电存储功能了。比如,我希望断电之后,重新上电能把我上次采集的温度信息保存下来。
其实很简单。
第一:不要预定义什么,你只需要看看你的代码里有没有用到 osal_nv_init(NULL)来进行NV初始化就好了。
查询位置: ZMain.c文件中的main()函数,如果有就可以进行第二步了。实在不是很确定的,可以IAR工具里Debug看看。
第二:写初始化代码
osal代码里说的很清楚,在使用osal_nv_read和osal_nv_write之前必须调用osal_nv_item_init进行初始化。
从CC2530的<OSAL API.pdf>中可以看到自定义的NV 编号范围是 0x0401 – 0x0FFF。
代码
- #define ZD_NV_TEMP_ID 0x0404
- 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的内容
其实第一次读取时,读到的内容必然是无效的,因此要结合初始化的结果来判断信息是否有效。
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方式验证代码的有效性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。