日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【BLE】CC2541之SNV

發(fā)布時(shí)間:2024/3/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BLE】CC2541之SNV 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇博文最后修改時(shí)間:2017年01月06日,11:06。


一、簡介

本文以SimpleBLEPeripheral工程為例,介紹SNV的使用。


二、實(shí)驗(yàn)平臺

協(xié)議棧版本:BLE-CC254x-1.4.0

編譯軟件:IAR 8.20.2

硬件平臺:Smart RF開發(fā)板(主芯片CC2541)


版權(quán)聲明

博主:甜甜的大香瓜

聲明:喝水不忘挖井人,轉(zhuǎn)載請注明出處。

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

聯(lián)系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜單片機(jī)之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘寶店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、實(shí)驗(yàn)前提 1、在進(jìn)行本文步驟前,請先閱讀以下博文: 暫無
2、在進(jìn)行本文步驟前,請先實(shí)現(xiàn)以下博文:
暫無


五、基礎(chǔ)知識

1、SNV是什么?

答:

NV就是從內(nèi)部flash劃分出來的一塊專用于存儲數(shù)據(jù)的flash。

NV就是Non-Volatile (非易揮發(fā)),香瓜在文檔中看到的都是NV,很長一段時(shí)間困惑為什么大家都叫它SNV。

詳細(xì)閱讀OSAL API.pdf(位于C:\Texas Instruments\BLE-CC254x-1.4.0\Documents\osal)后發(fā)現(xiàn),該文檔第10章講解的是NV,第11章則講述的是SNV(Simple Non-Volatile)。

2541的協(xié)議棧用的是SNV(8位ID),而不是NV(16位ID)。

由這個(gè)線索,將我心中的各種百度不到的SNV的疑問也都迎刃而解了。

注:詳細(xì)了解SNV后才發(fā)現(xiàn)我低估它了,并不像多數(shù)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個(gè)BANK,每塊BANK為32K。

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


// Internal flash used for NV address space. // --------------------------- // // Address range for HAL_FLASH_PAGE_SIZE == 2048 -D_BLENV_ADDRESS_SPACE_START=0x7E800 -D_BLENV_ADDRESS_SPACE_END=0x7F7FF // // Address range for HAL_FLASH_PAGE_SIZE == 4096 //-D_BLENV_ADDRESS_SPACE_START=0x7D000 //-D_BLENV_ADDRESS_SPACE_END=0x7EFFF // -Z(CODE)BLENV_ADDRESS_SPACE=_BLENV_ADDRESS_SPACE_START-_BLENV_ADDRESS_SPACE_END

上面這段代碼說明NV的起始地址是0x7E800,終止地址是0x7F7FF,兩個(gè)數(shù)值之間有4096個(gè)字節(jié),也就是4K。(注釋部分為8192字節(jié),也就是8K)

這個(gè)NV大小我們可以根據(jù)需要來改變,當(dāng)然NV的flash大了、放代碼的flash就小了。


2)在TI的技術(shù)論壇看到這么一句話也印證了上述說法:


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

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


4、使用SNV有什么需要注意的?

答:

在OSAL API.pdf的文檔中提到了幾個(gè)注意點(diǎn):

1)寫SNV會耗時(shí)百毫秒級,盡可能在寫的時(shí)候關(guān)閉中斷。

2)盡可能地少寫SNV,因?yàn)樗臅r(shí)耗電。

3)如果SNV的存儲結(jié)構(gòu)改變,或者協(xié)議棧版本升級了,有必要重新擦除和初始化SNV內(nèi)存數(shù)據(jù),否則讀寫時(shí)會出錯(cuò)。

4)盡量不要把SNV的代碼放到中斷函數(shù)里。


香瓜也補(bǔ)充一個(gè)很重要的注意點(diǎn):

IAR的debug仿真時(shí)默認(rèn)是全片擦除,因此會擦除flash中的code、NV。

所以經(jīng)常有群友來回仿真調(diào)試時(shí)發(fā)現(xiàn)自己寫的掉電保存數(shù)據(jù)沒了,不知所以然,問題就出在這里。

解決辦法:


(具體我也不知道該怎么填,大家自行百度或?qū)嶒?yàn)吧)


5、SNV的哪些ID是可以用的?

答:

在bcomdef.h中已經(jīng)定義了一些我們不能用的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 */

實(shí)際上上面的ID所在的區(qū)域,本來就不是我們該使用的,我們適合用的ID是在0x80~0xFE:


注:這張表要看OSAL API.pdf的第十一章的SNV,別看錯(cuò)到第十章的NV。


六、實(shí)驗(yàn)步驟

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

#include "osal_snv.h"


2、按鍵處理代碼中添加測試代碼(simpleBLEPeripheral.c)

static uint8 write_time = 0; //擦寫次數(shù) #define SNV_TEST_ID 0x80 static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys ) {VOID shift; // Intentionally unreferenced parameter uint8 data[252];uint8 ret;//UP 讀SNVif ( keys & HAL_KEY_SW_1 ){ret = osal_snv_read(SNV_TEST_ID, sizeof(data), data);if(ret == NV_OPER_FAILED){//未保存過,設(shè)置出廠數(shù)據(jù)//osal_memset(data, 0x55, sizeof(data)); //作為發(fā)送緩沖區(qū),寫0x55for(uint8 i = 0; i < 252; i++){data[i] = i;}osal_snv_write(SNV_TEST_ID, sizeof(data), data); osal_memset(data, 0, sizeof(data)); //清空緩沖區(qū)后,作為接收緩沖區(qū) ret = osal_snv_read(SNV_TEST_ID, sizeof(data), data);} }//DOWN 寫SNVif ( keys & HAL_KEY_SW_3 ){write_time++;osal_memset(data, write_time, sizeof(data));osal_snv_write(0x80, sizeof(data), data);} }


七、注意事項(xiàng)

暫無


八、實(shí)驗(yàn)結(jié)果

1、當(dāng)寫入252字節(jié)到SNV、并讀出252字節(jié)SNV時(shí),讀寫正常。



2、當(dāng)寫入253字節(jié)到SNV、并讀出253字節(jié)SNV時(shí),讀寫異常。

實(shí)驗(yàn)結(jié)果如上,一次性寫入最多252字節(jié),當(dāng)需要寫大于252字節(jié)時(shí)則需要分包,依次寫到不同ID中。

因此,實(shí)驗(yàn)成功。






總結(jié)

以上是生活随笔為你收集整理的【BLE】CC2541之SNV的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。