本篇博文最后修改时间:2017年01月06日11:06。
1、在进行本文步骤前请先阅读以下博文:
2、在进行本文步骤前,请先实现以下博文:
答:TI的BLE协议栈使用到大量的回调函数函数名末尾带“CB”的通常都是回调函数,它是指“call back”在状态有改变时会调用此函数。
1、定义一个“成员为函数指针”的结构体
2、写一个回调函數并完成注册
注:实际上此时simpleBLECentralEventCB在第二步结束时,即可直接通过操作结构体来调用这个回调函数了
数据手册上说有2048个字节大小那麼osal 的 NV ID号最大可以定义多大?一条NV ID可以存几个字节
恩,这个我找到了这里边定义的每个NV ID 都可以直接写入255个字节吗?
但是之前我从一位代悝商技术支持那获知每个NV ID只能存16个字节的数据。
还有就是假设现在定义了两个NV ID假如第一个NV ID没写满255个字节,那么第二个NV ID它是另取一行吗即第一个NV ID 和第二个NV ID之间是不是有空闲的可写入的存储空间?
我没测过看代码对长度的定义是unsigned char,因此认为可以写255,你可以实测一下忘了┅点需要4字节对齐,所以最大应该是252
注意下面的表述也就是说2K,1K存数据另1K是做备份。
恩也就是说另外1K是不能被使用的咯。好的非瑺感谢!这个信息非常重要!
怎样把存储空间扩大到10k呢,求赐教
本篇博文最后修改时间:2017年01月06日11:06。
1、在进行本文步骤前请先阅读以下博文:
2、在进行本文步骤前,请先实现以下博文:
NV就是从内部flash划分出来的一块专用于存储数据的flash
NV就是Non-Volatile (非易挥发),香瓜在文档中看到的都是NV很长一段时间困惑为什么大家都叫它SNV。
2541的协议栈用的是SNV(8位ID)而不是NV(16位ID)。
由这个线索将我心中的各种百度不到的SNV的疑问也都迎刃而解了。
注:详细了解SNV后才发现我低估它了并不像多数SNV资料中写的那么简单,因此本篇增加了大篇幅来解析SNV是怎么一回事
在第8块BANK的末尾分出了一块flash,用于NV
上面这段代码说明NV的起始地址是0x7E800,终止地址是0x7F7FF两个数值之间有4096个字節,也就是4K(注释部分为8192字节,也就是8K)
这个NV大小我们可以根据需要来改变当然NV的flash大了、放代码的flash就小了。
2)在TI的技术论坛看到这么┅句话也印证了上述说法:
3、SNV的接口资料哪里有
4、使用SNV有什么需要注意的?
在OSAL API.pdf的文档中提到了几个注意点:
1)写SNV会耗时百毫秒级尽可能在写的时候关闭中断。
2)尽可能地少写SNV因为它耗时耗电。
3)如果SNV的存储结构改变或者协议栈版本升级了,有必要重新擦除和初始化SNV內存数据否则读写时会出错。
4)尽量不要把SNV的代码放到中断函数里
香瓜也补充一个很重要的注意点:
IAR的debug仿真时默认是全片擦除,因此會擦除flash中的code、NV
所以经常有群友来回仿真调试时发现自己写的掉电保存数据没了,不知所以然问题就出在这里。
(具体我也不知道该怎麼填大家自行百度或实验吧)
5、SNV的哪些ID是可以用的?
在bcomdef.h中已经定义了一些我们不能用的SNV的ID:
实际上上面的ID所在的区域本来就不是我们該使用的,我们适合用的ID是在0x80~0xFE:
注:这张表要看OSAL API.pdf的第十一章的SNV别看错到第十章的NV。
//未保存过设置出厂数据1、当写入252字节到SNV、并读出252字節SNV时,读写正常
2、当写入253字节到SNV、并读出253字节SNV时,读写异常
实验结果如上,一次性写入最多252字节当需要写大于252字节时则需要分包,依次写到不同ID中