【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中有這么兩段代碼:
// Setup of CODE banks // ------------------- // -D_BANK0_START=0x00000 // Note: Unconventional bank numbering on this part: -D_BANK0_END=0x07FFF // "BANK0" is the root bank/common area! // -D_BANK1_START=0x18000 -D_BANK1_END=0x1FFFF // -D_BANK2_START=0x28000 -D_BANK2_END=0x2FFFF // -D_BANK3_START=0x38000 -D_BANK3_END=0x3FFFF // -D_BANK4_START=0x48000 -D_BANK4_END=0x4FFFF // -D_BANK5_START=0x58000 -D_BANK5_END=0x5FFFF // -D_BANK6_START=0x68000 -D_BANK6_END=0x6FFFF // -D_BANK7_START=0x78000 // End of code space has to match that of OSAL NV page start. // Note that in this way, we'll be wasting last page spaced by NV pages, // but in order not to overwrite NV pages when downloading new image, the waste // is inevitable. // New OSAL NV driver will move the NV pages to the last pages not wasting // last page itself. -D_BANK7_END=(_BLENV_ADDRESS_SPACE_START-1)上面這段代碼說明256K的flash被分為8個BANK,每塊BANK為32K。在第8塊BANK的末尾分出了一塊flash,用于NV。
上面這段代碼說明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:
/** @defgroup BLE_NV_IDS BLE Non-volatile IDs* @{*/ // Device NV Items - Range 0 - 0x1F #define BLE_NVID_IRK 0x02 //!< The Device's IRK #define BLE_NVID_CSRK 0x03 //!< The Device's CSRK #define BLE_NVID_SIGNCOUNTER 0x04 //!< The Device's Sign Counter// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings #define BLE_NVID_GAP_BOND_START 0x20 //!< Start of the GAP Bond Manager's NV IDs #define BLE_NVID_GAP_BOND_END 0x5f //!< End of the GAP Bond Manager's NV IDs Range// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries #define BLE_NVID_GATT_CFG_START 0x70 //!< Start of the GATT Configuration NV IDs #define BLE_NVID_GATT_CFG_END 0x79 //!< End of the GATT Configuration NV IDs /** @} End BLE_NV_IDS */實際上上面的ID所在的區域,本來就不是我們該使用的,我們適合用的ID是在0x80~0xFE:
注:這張表要看OSAL API.pdf的第十一章的SNV,別看錯到第十章的NV。
六、實驗步驟
1、添加頭文件(simpleBLEPeripheral.c)
#include "osal_snv.h"
七、注意事項
暫無
1、當寫入252字節到SNV、并讀出252字節SNV時,讀寫正常。
2、當寫入253字節到SNV、并讀出253字節SNV時,讀寫異常。
實驗結果如上,一次性寫入最多252字節,當需要寫大于252字節時則需要分包,依次寫到不同ID中。
因此,實驗成功。
總結
以上是生活随笔為你收集整理的【BLE】CC2541之SNV的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏突然卡顿, NVIDIA提示 显示设
- 下一篇: 利用好模拟器