感谢原作者:huangmeimao
原帖地址:http://blog.csdn.net/huangmeimao/article/details/73649301
写了很久的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。
代码
其中 zclAirConditionFuns为一个struct.
InitNVStatus的输出值见下表,这个非常关键:
值 | 含义 |
SUCCESS | 表示成功,并且该ID已经存在 |
NV_ITEM_UNINIT | 表示成功,但ID之前不存在,即第一次初始化。 |
NV_OPER_FAILED | 初始化失败 |
第二 : 读取NV的内容
其实第一次读取时,读到的内容必然是无效的,因此要结合初始化的结果来判断信息是否有效。
也就是说初次烧录代码时不会处理读到的信息,因为第一次读取的本来就是无效的,因为还没有写入过。当然,如果你在读取之前已经写过了,那就能读出有效信息。
第三: 向NV写内容
注意事项:
1. NV操作不能过于频繁,耗时耗能量。
2. 每次利用IAR烧录时就是重新擦除了,因此如果希望看自己的代码是否有效,只能断电重启通过其他方式验证,别指望通过DEBUG方式验证代码的有效性。