打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【BLE】CC2541之SNV

本篇博文最后修改时间:2017年01月06日,11:06。


一、简介

本文以SimpleBLEPeripheral工程为例,介绍SNV的使用。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

硬件平台:Smart RF开发板(主芯片CC2541)


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、实验前提
1、在进行本文步骤前,请先阅读以下博文:
暂无

2、在进行本文步骤前,请先实现以下博文:
暂无


五、基础知识

1、SNV是什么?

答:

NV就是从内部flash划分出来的一块专用于存储数据的flash。

NV就是Non-Volatile (非易挥发),香瓜在文档中看到的都是NV,很长一段时间困惑为什么大家都叫它SNV。

详细阅读OSAL API.pdf(位于C:\Texas Instruments\BLE-CC254x-1.4.0\Documents\osal)后发现,该文档第10章讲解的是NV,第11章则讲述的是SNV(Simple Non-Volatile)。

2541的协议栈用的是SNV(8位ID),而不是NV(16位ID)。

由这个线索,将我心中的各种百度不到的SNV的疑问也都迎刃而解了。

注:详细了解SNV后才发现我低估它了,并不像多数SNV资料中写的那么简单,因此本篇增加了大篇幅来解析SNV是怎么一回事。


2、SNV有多大?

答:

1)在C:\Texas Instruments\BLE-CC254x-1.4.0\Projects\ble\common\cc2540\ti_51ew_cc2540b.xcl中有这么两段代码:

  1. // Setup of CODE banks  
  2. // -------------------  
  3. //  
  4. -D_BANK0_START=0x00000         // Note: Unconventional bank numbering on this part:  
  5. -D_BANK0_END=0x07FFF           //       "BANK0" is the root bank/common area!  
  6. //  
  7. -D_BANK1_START=0x18000  
  8. -D_BANK1_END=0x1FFFF  
  9. //  
  10. -D_BANK2_START=0x28000  
  11. -D_BANK2_END=0x2FFFF  
  12. //  
  13. -D_BANK3_START=0x38000  
  14. -D_BANK3_END=0x3FFFF  
  15. //  
  16. -D_BANK4_START=0x48000  
  17. -D_BANK4_END=0x4FFFF  
  18. //  
  19. -D_BANK5_START=0x58000  
  20. -D_BANK5_END=0x5FFFF  
  21. //  
  22. -D_BANK6_START=0x68000  
  23. -D_BANK6_END=0x6FFFF  
  24. //  
  25. -D_BANK7_START=0x78000  
  26. // End of code space has to match that of OSAL NV page start.  
  27. // Note that in this way, we'll be wasting last page spaced by NV pages,  
  28. // but in order not to overwrite NV pages when downloading new image, the waste  
  29. // is inevitable.  
  30. // New OSAL NV driver will move the NV pages to the last pages not wasting  
  31. // last page itself.  
  32. -D_BANK7_END=(_BLENV_ADDRESS_SPACE_START-1)  
上面这段代码说明256K的flash被分为8个BANK,每块BANK为32K。

在第8块BANK的末尾分出了一块flash,用于NV。


  1. // Internal flash used for NV address space.  
  2. // ---------------------------  
  3. //  
  4. // Address range for HAL_FLASH_PAGE_SIZE == 2048  
  5. -D_BLENV_ADDRESS_SPACE_START=0x7E800  
  6. -D_BLENV_ADDRESS_SPACE_END=0x7F7FF  
  7. //  
  8. // Address range for HAL_FLASH_PAGE_SIZE == 4096  
  9. //-D_BLENV_ADDRESS_SPACE_START=0x7D000  
  10. //-D_BLENV_ADDRESS_SPACE_END=0x7EFFF  
  11. //  
  12. -Z(CODE)BLENV_ADDRESS_SPACE=_BLENV_ADDRESS_SPACE_START-_BLENV_ADDRESS_SPACE_END  

上面这段代码说明NV的起始地址是0x7E800,终止地址是0x7F7FF,两个数值之间有4096个字节,也就是4K。(注释部分为8192字节,也就是8K)

这个NV大小我们可以根据需要来改变,当然NV的flash大了、放代码的flash就小了。


2)在TI的技术论坛看到这么一句话也印证了上述说法:



3、SNV的接口资料哪里有?

答:OSAL API.pdf(位于C:\Texas Instruments\BLE-CC254x-1.4.0\Documents\osal)


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:

  1. /** @defgroup BLE_NV_IDS BLE Non-volatile IDs 
  2.  * @{ 
  3.  */  
  4. // Device NV Items -    Range 0 - 0x1F  
  5. #define BLE_NVID_IRK                    0x02  //!< The Device's IRK  
  6. #define BLE_NVID_CSRK                   0x03  //!< The Device's CSRK  
  7. #define BLE_NVID_SIGNCOUNTER            0x04  //!< The Device's Sign Counter  
  8.   
  9. // Bonding NV Items -   Range  0x20 - 0x5F    - This allows for 10 bondings  
  10. #define BLE_NVID_GAP_BOND_START         0x20  //!< Start of the GAP Bond Manager's NV IDs  
  11. #define BLE_NVID_GAP_BOND_END           0x5f  //!< End of the GAP Bond Manager's NV IDs Range  
  12.   
  13. // GATT Configuration NV Items - Range  0x70 - 0x79 - This must match the number of Bonding entries  
  14. #define BLE_NVID_GATT_CFG_START         0x70  //!< Start of the GATT Configuration NV IDs  
  15. #define BLE_NVID_GATT_CFG_END           0x79  //!< End of the GATT Configuration NV IDs  
  16. /** @} End BLE_NV_IDS */  

实际上上面的ID所在的区域,本来就不是我们该使用的,我们适合用的ID是在0x80~0xFE:


注:这张表要看OSAL API.pdf的第十一章的SNV,别看错到第十章的NV。


六、实验步骤

1、添加头文件(simpleBLEPeripheral.c)

  1. #include "osal_snv.h"  


2、按键处理代码中添加测试代码(simpleBLEPeripheral.c)

  1. static uint8 write_time = 0;    //擦写次数  
  2. #define SNV_TEST_ID     0x80  
  3. static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )  
  4. {  
  5.   VOID shift;  // Intentionally unreferenced parameter    
  6.   uint8 data[252];  
  7.   uint8 ret;  
  8.     
  9.   //UP 读SNV  
  10.   if ( keys & HAL_KEY_SW_1 )  
  11.   {  
  12.     ret = osal_snv_read(SNV_TEST_ID, sizeof(data), data);  
  13.   
  14.     if(ret == NV_OPER_FAILED)  
  15.     {  
  16.         //未保存过,设置出厂数据  
  17.         //osal_memset(data, 0x55, sizeof(data));  //作为发送缓冲区,写0x55  
  18.           
  19.         for(uint8 i = 0; i < 252; i++)  
  20.         {  
  21.           data[i] = i;  
  22.         }  
  23.   
  24.         
  25.         osal_snv_write(SNV_TEST_ID, sizeof(data), data);   
  26.   
  27.         osal_memset(data, 0, sizeof(data)); //清空缓冲区后,作为接收缓冲区         
  28.         ret = osal_snv_read(SNV_TEST_ID, sizeof(data), data);  
  29.     }   
  30.   }  
  31.   
  32.   //DOWN 写SNV  
  33.   if ( keys & HAL_KEY_SW_3 )  
  34.   {  
  35.     write_time++;  
  36.     osal_memset(data, write_time, sizeof(data));  
  37.     osal_snv_write(0x80, sizeof(data), data);  
  38.   }       
  39. }  


七、注意事项

暂无


八、实验结果

1、当写入252字节到SNV、并读出252字节SNV时,读写正常。



2、当写入253字节到SNV、并读出253字节SNV时,读写异常。

实验结果如上,一次性写入最多252字节,当需要写大于252字节时则需要分包,依次写到不同ID中。

因此,实验成功。






本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
CC2541,请问在工程选项中使能串口后HAL
[转载]蓝牙4.0 BLE 数据传输(四)
CC2640使用snv保存信息
由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(4)
蓝牙4.0 BLE开发从入门到精通
项目五 蓝牙无线通信技术应用设计
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服