分析成果telink入門c4kite ble sdk developer handbook_第1頁
分析成果telink入門c4kite ble sdk developer handbook_第2頁
分析成果telink入門c4kite ble sdk developer handbook_第3頁
分析成果telink入門c4kite ble sdk developer handbook_第4頁
分析成果telink入門c4kite ble sdk developer handbook_第5頁
已閱讀5頁,還剩303頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

PublishedinkBldg3,1500ZuchongzhiZhangjiangHi-TechPark,Shanghai,?inkSemiconductorAllRightLegalDiThisisprovidedas-is.inkSemiconductorreservestherighttomakeimprovementswithoutfurthernoticetothis oranyproductsherein.Thismaycontaintechnicalinaccuraciesortypographicalerrors.inkSemiconductordisanyandallliabilityforanyerrors,inaccuraciesorpletenesscontainedCopyright(c) inkSemiconductor ,Forfurtherinformationonthetechnology,productandbusinessterm,please inkSemiconductor Forsalesortechnicalsupport,pleasesend totheaddressof:版本歷史作者&標(biāo)準(zhǔn)化WSH,FQH&Keyscanflow,8.6BLEmasterfeaturedemo和driverflash空間的操作2.3.4GPIO數(shù)字狀態(tài)在deepsleepretentionmode失效, inkBLEConnstateSlaverole時序LinkLayerTXfifo&RXDataLengthblc_ll03.3233.3ATT&4.1.1低功耗模式3.3.1BLEhost介紹12.232k時鐘源選擇TYF,WSH,FQH,1.1軟件組織架構(gòu)2.1.2Sram空間分配4.2.6作者&標(biāo)準(zhǔn)化SDK介 軟件組織架 application BLEstack 適用IC介紹 softwarebootloader介 Demo介 BLEslave BLEmaster featuredemo和driverdemo MCU基礎(chǔ)模塊 MCU地址空 MCU地址空間分 Sram空間分 2list文件分析 MCU地址空間 flash空間的操 SDKFLASH空間的分 時鐘模 Systemclock&System SystemTimer的使 GPIO模 GPIO定 GPIO狀態(tài)控 GPIO的初始 GPIO數(shù)字狀態(tài)在deepsleepretentionmode失 配置SWS上拉防止死 BLE模 BLESDK軟件架 標(biāo)準(zhǔn)BLESDK軟件架 inkBLESDK軟件架 inkBLE inkBLE inkBLE BLE BLEcontroller介 LinkLayer狀態(tài) LinkLayer狀態(tài)機組合應(yīng)用 Idle+ Idle+Scannni Ide+Advtersing+ 3.5Idle+Scannning+Initiating+ LinkLayer時 32.4.1Idlestate時 ConnstateSlaverole時 ConnstateMasterrole時 LinkLayer狀態(tài)機擴 Scanningin Advertisingin LinkLayerTXfifo&RX Controller DataLength ControllerAPI ControllerAPI說 API返回類型 BLEMACaddress初始 LinkLayer狀態(tài)機初始化 3.2.9 3 Whiist& BLE BLEhost介 ATT& GATT基本單位 AttributePDU&GATT SMP參數(shù)配 SMP綁定信息說 master GAP初始 GAP 低功耗管理 低功耗 4.1 低功耗模 低功耗喚醒 低功耗模式的進入和喚 低功耗喚醒后運行流 API BLE低功耗管 BLEPM初始 BLEPMforLink 相關(guān)變 API API API PM軟件處理流 deepsleepretention的詳細(xì)分 API ConnectionLatency API GPIO喚醒的注意事 喚醒電平有效時無法進入sleep BLE系統(tǒng)低功耗管理參 應(yīng)用層定時喚 低電檢 低電檢測的重要 低電檢測的實 5 低電檢測的注意事 必須使用GPIO輸入通 必須使用Dfifo模式獲得ADC采樣 低電檢測單獨使 低電檢測和Amic Audio初始 Amic和低電檢 Amic初始化設(shè) Dmic初始化設(shè)置 Audio數(shù)據(jù)處 Audio數(shù)據(jù)量和RF傳送方 Audio數(shù)據(jù)壓 壓縮與解壓縮算 Flash架構(gòu)設(shè)計和OTA流程 FLASH架構(gòu) OTA更新流 修改Firmwaresize和boot OTA模式RF數(shù)據(jù)處 Slave端AttributeTable中OTA的處 OTA數(shù)據(jù)packet格 7.2 master端RFtransform處理方 slave端RFreceive處理方 按鍵掃 鍵盤矩 Keymap Keyscan Deepsleep喚醒快速掃鍵(wake_upfast RepeatKey處 卡鍵處 LED管 LED任務(wù)相關(guān)調(diào)用函 LED任務(wù)的配置和管 定義led Ledevent的優(yōu)先 Blt軟件定時器(Software timer初始 Timer的查詢處 刪除定時器任務(wù) id和管 時 11.1 波形取 開啟和停 模 脈沖數(shù)(pulse 中 APIforIRDMAFIFO DMAFIFO的配 設(shè)置DMAFIFO IRDMAFIFOmode的開啟與停 IR 模式的選 DemoIR協(xié) IR時序設(shè) IR初始 IR硬件配 IR變量初始 FifoTask的配 應(yīng)用層判斷IR 其他模 24M晶體外部電 32k時鐘源選 PhyTest PhyTest EMI Emi初始化設(shè) EmiTX EMI EMITest 附 附錄1:crc16算 圖圖1-1SDK文件結(jié) 圖2-1MCU地址空間分 圖2-2各IC在16k和32kretention對應(yīng)的Sram空間分 圖2-3Sram空間分配&Firmware空間分 圖2-4list文件section統(tǒng) 圖2-5list文件section地 圖2-6512KFLASH地址分 圖2-7systemclock&System 圖3-1BLESDK標(biāo)準(zhǔn)架 圖3-2Host和Controller的HCI數(shù)據(jù)交 圖3-38258hci架 inkBLEslave架構(gòu) inkBLEmaster架 圖3-6StatediagramoftheLinkLayerstatemachineinBLE inkLinkLayerstate 圖3-8Idle+ 圖3-9Idle+ 圖3-10BLEslaveLL 圖3-11BLEmasterLL 圖3-12AdvertisingState時 圖3-13Scanningstate時 圖3-14Initiatingstate時 圖3-15ConnstateSlaverole時 圖3-16ConnMasterRole時 圖3-17ScanninginAdvertisingstate時 圖3-18ScanninginConnSlaveRole時 圖3-19AdvertisinginConnSlaveRole時 圖3-20AdvertisingandScanninginConnSlaveRole時 圖3-21RXoverflow圖示 圖3-22RXoverflow圖示 圖3-23BLESDKevent架 圖3-24HCI 圖3-25DisconnectionComplete 圖3-26ReadRemoteVersionInformationComplete 圖3-27LEConnectionComplete 圖3-28LEAdvertisingReport 圖3-29LEConnectionUpdateComplete 圖3-30connectrequest 圖3-32BLE協(xié)議棧廣播包格 圖3-33BLE協(xié)議棧里Advertising 圖3-34BLE協(xié)議棧四種廣播圖3-35BLEL2CAP結(jié)構(gòu)以及ATT組包模 圖3-36BLE協(xié)議棧中ConnectionParaupdateReq格 圖3-37抓包顯示connparaupdatereqeust和 圖3-38BLE協(xié)議棧中connparaupdatersp格 圖3-39抓包顯示llconnupdate 圖3-41該BLESDKAttributeTable截 圖3-42master讀hidInformation的BLE抓 圖3-43BLE協(xié)議棧中Write 圖3-44BLE協(xié)議棧中Write 圖3-45BLE協(xié)議棧中ExecuteWrite 圖3-47ReadbyGroupTypeRequest/ReadbyGroupType 圖3-48FindbyTypeValueRequest/FindbyTypeValue 圖3-49ReadbyTypeRequest/ReadbyType 圖3-52ReadBlobRequest/ReadBlob 圖3-53ExchangeMTURequest/ExchangeMTU 圖3-55WriteLongCharacteristicValues示 圖3-56BLESpec中HandleValue 圖3-57BLESpec中HandleValue 圖3-58BLESpec中HandleValue 圖3-60ATTPermission定 圖3-62抓包顯示Pairing 圖3-63傳統(tǒng)配對模式下MITM、OOBflag使用規(guī) 圖3-64根據(jù)不同IO能力映射KEY產(chǎn)生方 圖3-65抓包顯示PairingPeer 圖3-67master發(fā)起Pairing_Req.. 圖4-18x5xMCU硬件喚醒 圖4-2sleepmodewakeupwork 圖4-3sleeptimingforAdvertisingstate&ConnstateSlave 圖4-4suspend&deepsleepretentiontiming& 圖4-5T_init 圖4-6sleeptimingforconn_latency 圖4-7Earlywake_upat 圖6-1audio數(shù)據(jù)抓 MICserviceinAttribute 圖6-3數(shù)據(jù)壓縮處 圖6-4壓縮算法對應(yīng)數(shù) 圖7-1Flash結(jié) 圖7-2BLE協(xié)議棧WriteCommand格 圖7-3OTA命令和數(shù)據(jù)的格 圖7-4master通過ReadByTypeRequest獲取OTA的Attribute master發(fā)OTA masterOTA數(shù) 圖8-1行列式鍵盤結(jié) cycle& 圖11-3DMAFIFObufferforIRDMAFIFO 圖11-4demoIR協(xié) 圖11-5IRtiming 圖11-6IRtiming 圖12-124M晶體電 圖12-2EMItest 圖12-3選擇型 圖12-4選擇數(shù)據(jù)總 圖12-5Swire同步操 圖12-6set 圖12-7選擇RF模式 圖12-8setRF模式顯示界 圖12-9選擇測試模 圖12-10設(shè)置TXpacket 圖12-11RXpacketnumber和 SDKBLESDKBLEslave/masterdemodemo基礎(chǔ)軟件組織架構(gòu) 件夾有7個:application,boot,common,drivers,proj_lib,stack,vendor。1-1SDK后的匯編處理過程,為后面C語言程序的運行搭建好環(huán)境。i2c、usb、gpio、uart等。proj_lib:SDK運行所必需的庫文件(liblt_8258.a)。BLE協(xié)議棧、RF驅(qū)動、PM驅(qū)動等文件,被封裝在庫文件里,用戶無法看到源文件。intmain(void)}}irq_nable(); while(1){#ifwd_clear();//clearwatchdog();//}}GPIO的配置、PMBLEslaveapp_att.c:serviceprofile的配置文件,有ink定義的Attribute,用戶可以參考這些添加自己的service和profile。BLEstackinkBLESDK中BLEstack部分code的函數(shù)有兩個irq_blt_sdk_handler_attribute_ram_code_void{}applicationfilemain_loopBLE邏輯和數(shù)據(jù)處理的函數(shù)blt_sdk_main_loopvoidmain_loop{/////////////////////BLEentry//////////////////////////////////////////////////UIentry//////////////////////PMconfiguration}硬件模塊基本一致,只是在SRAMsize方面略有差異。FlashSRAM512325124851264ICSRAMsize,其他部分是一致的,SDK文件架構(gòu)除了SDK/boot/啟動(即softwarebootloader文件)和boot.link文件有差softwarebootloader 1-2ICbootloader以及boot.linkIC3個softwarebootloader文件,分別對應(yīng)16kdeepretention、32kdeepretentiondeepretention功能(deepretention的介紹可以參考以cstartup_8258_RET_16K.S為例,第一句#ifdefMCU_STARTUP_8258_RET_16K說明了只有當(dāng)user定義了MCU_STARTUP_8258_RET_16K時,該bootloader才會生效。softwarebootloader8258ICMCU_STARTUP_8258/deepretention16kdeepretention32kdeepretention功能的softwarebootloader,其他IC型號與此類似。8258_ble_remote為例說明如何選擇8258softwarebootloader。user1-3softwarebootloader 實際用戶在選擇不同的softwarebootloader文件后還需要修改SDK根 boot.link文件(根據(jù)下表對應(yīng)關(guān)系將其中的link文件中的內(nèi)容替換到SDK根boot.link中),ICsoftwarebootloaderboot.link選用關(guān)系見下16kB32kBcstartup_8258RET_32KS根據(jù)上面的例子以及映射表,我們知道softwarebootloader文件為SDK/boot/boot_16k_retn_8251_8253_8258.link文件內(nèi)容替換到SDK根 boot.link文件中。DemoinkBLESDKBLEdemocode上進行修改,完成自己的應(yīng)用開發(fā)。1-4BLESDKdemoBLEslaveBLEslavedemoMCU8258BLE其他MCUhost通信8258ApplicationMCUBLE8258ble8258ble最簡單的slaveMCUhost通信,形成一個完整的BLEslave系統(tǒng)。8258bleremote/8258module都是inkBLEslavestack。8258寫在對方主控MCU。BLEmaster8258masterkmadongle是BLEmastersingleconnection的demo8258blesample/8258bleremote/8258module連接并通信。stackslave共用一libary),包BLEcontroller+BLEhost,用戶只需要在app層添加自己的應(yīng)用代碼,不用再去處理BLEhost的東西,完全依賴于controller和host的API即可。SDKlibraryslavemaster8258masterkmadonglecodeBLEcontroller功能部分,library中并沒有master的標(biāo)準(zhǔn)host功能。8258masterkmadongledemocodeapp層上給出了參考的BLEHost的實現(xiàn)方法,包括ATTSDP(servicediscoveryprotocol)和最常用的SMP(securitymanagementprotocol)等。BLEmaster最復(fù)雜的功能在于對slaveserver的servicediscovery和所有serviceandroid/linux系統(tǒng)中才能實現(xiàn)。ink8258ICflashsize和Sramsize的限制,無法提供完整的servicediscovery。但是SDK中提供了所有8258bleremoteservicediscovery過程,去實現(xiàn)自己的特定service的遍歷。featuredemodriver戶可參demo完成自己的功能code。該文BLE部分會介紹所有的feature。進行選擇性的定義,即可切換到不同featuretest的Demo。8258drivertestdriversamplecode供用戶參考并實現(xiàn)自己的driver功能。本文檔driver部分會詳細(xì)介紹各個driver。選擇性的定義,即可切換到不同drivertest的Demo。MCU基礎(chǔ)MCU地址MCU地址空間分00x7FFFFF8M8Mbytes0x8000000xFFFFFF為外部設(shè)備空間:0x800000~0x80FFFF為寄存器空間;0x840000~0x84FFFF為64KSram空間。2-1MCU8x5xMCUBIT(23)用于區(qū)別程序空間/Sram空間請用戶先掌握了解deepsleepretention相關(guān)知識。deepsleepretentionsuspenddeepsleep空間分配可以和SDK的用戶可先參考《826xBLESDKhandbookSram空間分配的介紹,再和SramFirmware空MCUSram32kBSram0x840000~0x848000,48kBSram地址空間范圍0x840000~0x84C000,64kBSram地址空間范圍為0x840000~0x850000。下圖82588253825116kretention32kretention模式下對SRAMIC8251deepsleepretention32Ksram模sramsoftwarebootloader和link文件。2-2IC16k32kretentionSram模式為例詳細(xì)Sram區(qū)域各個Sramsize是其他deepsleepretention32ksram模式,用戶可以類推一下即可。64kSramSramFirmware area(16K)

retention

retention

sramCache(2.25K)irq

flasharea

normal

23Sram空間分配&Firmwarecstartup_8258_RET_16K.S。(如果使用deepsleepretention32KSram,則bootloader對應(yīng)cstartup_8258_RET_32K.S,link文件對應(yīng)FlashFirmware包括vector、ramcode、retention_data、text、RodataDatainitialvalueunusedsramarearetention_data的拷貝。vectors、碼(softwarebootloader)。二是放到ram中執(zhí)行的函數(shù)每次被調(diào)用時不需要從flash重新,可以節(jié)效率。SDKBLE時序相關(guān)的一些經(jīng)常要執(zhí)行的函數(shù)常駐到內(nèi)存,大大降中看到該函數(shù)在ramcode段了。Firmwarevectorramcode都需要MCU上電時全部搬到ram上,編果_ramcode_size_vectorramcodecodesize。.=.vectors{}ram_code{}8258的deepsleepretentionmodeMCUdeepsleep后,Sram段的內(nèi)容不16K的retention區(qū)域,進入deepsleep會掉電丟失。 int unsignedintBB= int unsignedintDD[4]=參考下面即將要介紹的“data/bss”段可知,datainitialvalue需要提前存放在flash上;bss段的變量initialvalue0,無需提前準(zhǔn)備,bootloader運行時直接在sram上設(shè)為0即可。它們initialvalue,存放flashretention_dataarea上。上電(或normaldeepsleep喚醒)后會整體拷貝到sramretention_dataarea上?!皉etention_data”段是緊跟著”ram_code”段的,即”vectorramcoderetention_data”3段按順序排布在flash的前面,它們的總大小為retention_data”sram的前面,此后程序執(zhí)行過程中只要deepsleep(suspend/deepsleepretention),這一整塊的內(nèi)容就一直保持在sram上,MCU無須再從flash上。.=(0x840000+.retention_data:AT(_rstored_{.=(((.+3)/PROVIDE(_retention_data_start_=.PROVIDE(_retention_data_end_=.);}flashfirmware中分布的起始地址為“_rstored_Sram上對應(yīng)的地址0x840000(_rstored_)。而“_rstored_”這個值就是"ram_code”section的”使用deepsleepretention16KSrammode,“_retention_size_ 如果超過16K的限制,用戶可以選擇切換為deepsleepretention32KSram”當(dāng)“_retention_size_16K時(12K),flash4K會有4K的“wastefulsramarea”(無效SRAM區(qū)域)。retention_dataram_code/retention_data的tion(函數(shù)放在ram_code中的function可以節(jié)省運行時間以降低功耗,放在retention_datavariable也可以節(jié)省初始化時間以降低功耗(具體原因請CacheMCUSram中的一段才可以正常運行。Cachesize是固定的,包256tag2048字節(jié)Instructionscache,總共0x900=2.25K。常駐內(nèi)存的code可以直接從內(nèi)存中并執(zhí)行,但firmware中可以常駐內(nèi)FlashcodeCache中,如果當(dāng)前需要執(zhí)行的codeCacheCacheCache中,則從Flashcode并覆蓋Cache中之前的code,再從Cache中指令執(zhí)行。Sram16Kretentionarea后面,即起始地址為0x844000,結(jié)束地址為data/“data”Sraminitialvalue0的0的全局變量。這兩部分是連在一起的,data段后緊跟bss段,所以這里boot.link中的代碼,直接定義Sramdata段開始的地址:.=.datastack/unused0x84C000,32KSram0x848000)開始的,其方向為從下往上延伸,即stack指針SP在數(shù)據(jù)入棧時自減,數(shù)據(jù)出棧時自加。默認(rèn)情況下,SDKlibrarystacksize256bytestackstack比較深的情況,都會導(dǎo)致最終stack的使用size變大。Sram使用較多時,需要明確知道自己的程序使用了多stack,這list文件來分析,只能讓應(yīng)用程序運行起來,確保其運行了程序中所有的可能使用stack比較深的code后,將MCUreset,Sram空間去確定stack的使用量。最深的地方和bss段重合了,則說明Sram不夠用了。用戶需要分析這個空間是否足夠,結(jié)合上面說的查看stack最深地址,可以知道Sram的使用是否超出。下面demo中會給出分析方法。“text”Flashfirmwareram_code函數(shù)的集合。程序中的函數(shù)如果加了“_attribute_ram_code_ram_code段,其他沒有加這段是要執(zhí)行的codeloadCache中再可以被執(zhí)行。Firmwarevector、ram_code和text,剩余的數(shù)據(jù)為”rodata”段和”datainitialvalue”。義的變量。比如Slave中的ATTtable:constattribute_tmy_Attributes[]= testValue=list文件分析配&Firmware空間分配”圖來分析。8258blesamplebinlist文件見“SDK”->“Demo”->“l(fā)istfile8258blesample.bin8258blesample.list,請用戶自行查找文件找到截圖對應(yīng)位2-4listsectiontext:Flash0x4000開始,Size0x614crodata:Flash0xa14c開始,Size0x8ecdata:Sram0x844900開始,Size0x2cbytestack需要使用的256byte45943byte。2-5listsection圖,結(jié)合該圖和上面“l(fā)ist文件Section統(tǒng)計”圖,分析如下:“vector”flashfirmware中起始地址0,結(jié)束地址0x170(最后一筆數(shù)據(jù)地址0x16e~0x16f),size0x170。上電搬移SramSram上的地址為0x840000~0x840170?!皉am_code”section0x170,結(jié)束地0x2560(最后一筆數(shù)據(jù)地0x255c~0x255f)。上電搬移SramSram上的地址0x840170~后一筆數(shù)據(jù)地址為0x843244~0x843247)。0x3248flashfirmware16K0x3248byte0x32480x40003.43K的空間屬于“wastefulflasharea(flash區(qū)域)”(用戶可以打開8258_ble_sample.bin看到這段空間中全部是無效的0);Sram中0x843248~0x8440003.43K的空間屬于“wastefulsramarea”(SRAMCacheSram中地址范圍為:0x844000~0x844900筆數(shù)據(jù)地址為0xa148~0xa14b),Size0xa14c–0x4000=0x614c,和前面Section統(tǒng)計中數(shù)據(jù)一致。筆數(shù)據(jù)地址為0xaa34~0xaa37)。要使用的256byte,還剩45943byte。MCU地址空外設(shè)空間的讀寫操作外設(shè)空間(register和sram)的讀寫操作直接用指針實現(xiàn) x*(volatile //register0x66*(volatileu8*)0x800066 //register0x66u32y*(volatile //sram0x40000-0x40003*(volatileu32*)0x840000 //sram0x40000-0x40003程序中使用函數(shù)write_reg8、write_reg16、write_reg32、read_reg8、read_reg16、read_reg32對外設(shè)空間進行讀寫,其實質(zhì)是指針操作。信息,請參照drivers/8258/bsp.h。)/下所示,可以看到是自動加上0x800000的偏移(地BIT(23)1),所以MCU能夠確保的是Register/Sram空間,而不會去flash空間。#define #definewrie_reg8(addr,v)U8_SET((addr+REG_BASE_ADDR),v)#definewrite_reg16(addr,v)U16_SET((addr+REG_BASE_ADDR),v)#definewrite_reg32(addr,v)U32_SET((addr+REG_BASE_ADDR),v)#defineread_reg8(addr) U8_GET((addr+REG_BASE_ADDR))#defineread_reg16(addr)U16_GET((addr+REG_BASE_ADDR))#defineread_reg32(addr)U32_GET((addr+REG_BASE_ADDR))2字節(jié)/4字節(jié)的指針來讀寫2字節(jié)/4字節(jié)對齊的,如果不對齊的話,會發(fā)生 x*(volatile *(volatileu32*)0x840005=0x x*(volatile 2*(volatileu32*)0x840004 4flash空間的操flashflash_read_page和flash_write_page函數(shù),flash的擦除使用flash_erase_sector函數(shù)。flash flash_read_page(u32addr,u32len,u8*buf); flash_write_page(u32addr,u32len,u8flash_read_page函數(shù)flash上的內(nèi)容voidflash_read_page(u32addr,u32len,u8*buf);u8data[6]={0};flash_read_page(0x110006dataflash0x110006bytedataflash_write_page函數(shù)對flash進行寫操作:flash_write_page(u32addr,u32len,u8*buf);u8data[60x11,0x22,0x33,0x44,0x55,0x66flash_write_page(0x12000,6data);flash0x120006個byte寫入0x665544332211。個函數(shù)操作的地址大小最大為256byte,不能兩個不同page范圍。當(dāng)作的地址是一個page的首地址時,最大地址為256byte,flash_write_page(0x120f020data)160x12000page4個地址在0x12100page。byte的數(shù)據(jù)。flash使用flash_erase_sector函數(shù)來擦除flash。 addr必須是一個sector的首地址,該函數(shù)每次擦除整個sector。sector的時間會比較長,16M30~100ms甚flash上面介紹的三個flash操作函數(shù)flash_read_page、flash_write_page、造成的是BLE收發(fā)包的時序會被破壞,得不到及時響應(yīng)。中斷影響很小但連續(xù)讀寫的地址越長,時間就越長。所以強烈建議用戶在main_loop里BLE連接狀態(tài)時,不要連續(xù)讀寫太長的地址。flash_erase_sector函數(shù)的執(zhí)行時間為幾十到幾百個ms,所以在主程序的讀flash可以使用指針來實BLESDK的firmware在flash上,程序運行時,只是將flash前一部分的ram上執(zhí)行,剩余的絕大部分代碼根據(jù)程序的局部性原在需要的時候從flash讀到ram高速緩存cache(簡稱cache。MCU通過自動控制內(nèi)部MSPI硬件模塊,flash上的內(nèi)容??梢允褂弥羔樀男问絝lash上的內(nèi)容,指針形式讀flash的原理是MCUMSPI,通過、MCLK、MSDIMSDOspi的時序來獲得flash數(shù)據(jù)。 x*(volatileu16*)0x10000flash0x10000兩個byteu8data[16];memcpy(data,0x20000,16); //flash0x2000016個bytecopydataif(!memcmp(data,0x3000016flash0x3000016個bytedata}針flash的方式實現(xiàn)的,請參考SDK里函數(shù)staticinlinevoid據(jù)沒有被其他內(nèi)容覆蓋時,又有新的該數(shù)據(jù)的請求發(fā)生,此時MCU會 result=*(volatileu16*)0x40000; u8data=0x5A;flash_write_page(0x40000,1,&dataresult=*(volatileu16*)0x40000;//指針flashif(result!=0x5A){ flash0x400000xff1result0xff,然后寫入從cache里拿到的第一次緩存的結(jié)果。函數(shù)讀到的結(jié)果不會從cache里拿之前緩存的值。改成如下實現(xiàn)才正確: flash_read_page(0x40000,1,&result); //APIflashu8data=0x5A;flash_write_page(0x40000,1,&data);flash_read_page(0x40000,1,&result); //APIflashif(result!=0x5A){ SDKFLASH空間的分FLASH信息以一個sector的大?。?Kbyte)為基本的單位,因為flash擦除信息時將其他類的信息誤擦除)。所以建議user在使用FLASH定制信息時遵循“不同類信息放在不同sector”的原則。UserUserDataCustomedMACPair&SecUserDataOTANewbinstorageOldFirmware26512KFLASHuser提供了對應(yīng)的修改接口,user可以根據(jù)自己需要去規(guī)劃地址分配。0x76000FLASH0x760000x760050x110x220x330x440x550x66,那么MACaddress為0x665544332211。MAC0x76000這個地址,作了相應(yīng)的修改。SDKuser_initFLASHCFG_ADR_MAC讀MAC地址,這個宏在stack/ble/blt_config.h里面修改即可。#ifndef

0x77000~0x77fff這個sectorinkMCU需要校準(zhǔn)定制的信息。只有這部bytes按照每64bytes劃分為不同的單元,每個單元一類校準(zhǔn)信息。校準(zhǔn)信息可以放在同一個sector,是因為校準(zhǔn)信息在治具燒錄的過程到對第二64bytes:因ink上一ICRF需要TP值校準(zhǔn),所以這個位TPTP的問題,但這個位置仍然沿用了上一代IC的設(shè)計。第三個64bytes用來外部32kcrystal的電容校準(zhǔn)值,后面的第四個、0x74000~0x75FFF這兩個sector被BLE協(xié)議棧系統(tǒng)占用,用來配對和加密信息。usersector的位置,sizesector8K,0x00000~0x3FFFF256K0x00000~0x1FFFF共128K為Firmware空間;0x20000~0x3FFFF128K改方法見后面OTA章節(jié)的詳細(xì)說明。 時鐘模Systemclock&System系統(tǒng)時鐘(systemclock)MCUinkIC(826x系列上,SystemTimersystemclock,8x5xIC上,SystemTimersystemclock是獨立分開的。如下圖所示,SystemTimer24MCrystalOscillator3/2分頻得到的16M。

FHSSystemClockFHSSystemClockDD24MHz24MHzCrystalSyetem2-7systemclock&System48M后再分16M24M32M48M等,這一clock我們稱crystal24MRCOscillitor24MRCclock、32MRCclock、48MRCclock等。這一類我們稱為RCclock(BLESDK不支持RCclock)。8x5xSystemTimersystemclockMCU上各硬clocksystemclockSystemTimersystemclock為#defineCLOCK_SYS_CLOCK_1S=CLOCK_SYS_CLOCK_HZ,CLOCK_SYS_CLOCK_1MS=(CLOCK_SYS_CLOCK_1S/1000),CLOCK_SYS_CLOCK_1US=(CLOCK_SYS_CLOCK_1S/ clock的設(shè)置使用的是以上幾個定義,說明該模塊的時鐘源為systemclock。如驅(qū)動中周期和占空的設(shè)置如下,說明的時鐘源是system 0_ID,(u16)(1000*CLOCK_SYS_CLOCK_1US),(u16)(500*CLOCK_SYS_CLOCK_1US));SystemTimer16M,所以對于這個timer,SDKcode中使用如下的數(shù)值來表示S、mS和uS。//systemtimerclocksourceisconstant16M,never API操作時,都使用上面類似”CLOCK_16M_SYS_TIMER_CLK_xxx”的方式來表示時voidsleep_us(unsignedlongunsignedintintclock_time_exceed(unsignedintref,unsignedint#define #define #define SystemTimer的使用戶可以SystemTimer計數(shù)器的值(簡稱SystemTimertick)。最小值0x 到最大值0xffffffff需要的時間為:(1/16)us*(2^32)約等于268S,每過268SSystemTimertick轉(zhuǎn)一圈。u32current_tick=clock_time();BLESDKBLESystemTimertick設(shè)計的,程序中也大量SystemTimertick來實現(xiàn)一些簡單的定時和超時判斷。u32start_tick 在程序的某處不斷查詢當(dāng)前SystemTimertick和start_tick的差值是否超過需if((u32)(clock_time()-start_tick) 100* 268S,需要在軟件上加計數(shù)器累計實現(xiàn)(這里不介應(yīng)用舉例:A條件觸發(fā)(只會觸發(fā)一次)的2S后,程序進行B()操作。 {a_trig_=1;}if(a_trig_&&clock_time_exceed(a_trig_tick,2*1000*1000)){a_trig_=0;}}GPIOGPIO模塊的說明請user對照drivers/8258/gpio_8258.hgpio_default_8258.hgpio_8258.cGPIO定8258系列共有5組36個GPIO,分別為GPIO_PA0GPIO_PA7、GPIO_PB0GPIO_PB7、GPIO_PC0GPIO_PC7GPIO_PD0-GPIO_PD7、GPIO_PE0-GPIO_PE37GPIOMSPI4GPIO4GPIOMCUSPI總線,用于讀寫這個4個GPIO為PE0、PE1、PE2、PE3。程序中一般不使用。8x5x的SWS管腳為PA7。GPIO狀態(tài)控一般GPIO。pinGPIO定義,以下一樣。funcAS_GPIOie(inputenable)voidgpio_set_input_en(GPIO_PinTypeDefpin,unsignedintvalue:10分別表示enable和disableunsignedintgpio_read(GPIO_PinTypeDef讀到高電平時,返回值不一定是1,是一個非0的值。ifgpio_read(GPIO_PA01)的寫法,推薦使用方法是將讀到的值取反處理,取反后只有1和0兩種情況: voidgpio_set_output_en(GPIO_PinTypeDefpin,unsignedintvalue10enable和disablevoidgpio_write(GPIO_PinTypeDefpin,unsignedint可配置的狀態(tài)有4種:1M上拉、10K上拉、100K下拉和float狀態(tài)。typedefenum = = = =GPIO, gpio_set_func(GPIO_PC6,AS_GPIO); gpio_setup_up_down_resistor(GPIO_PC6,PM_PIN_PULLUP_10K);gpio_set_input_en(GPIO_PC6,1) }PA5、PA6腳配置成USB功能。gpio_set_func(GPIO_PA5,AS_USBgpio_set_func(GPIO_PA6,AS_USB);gpio_set_input_en(GPIO_PA5,1);GPIO的初始化為默認(rèn)狀態(tài)。32個GPIO默認(rèn)狀態(tài)為:全部為float。app_config.hgpio的默認(rèn)狀態(tài)是使用宏來表示的,這些宏的寫法為(以PA0的ie為例):#ifndef#define app_config.h中配置GPIO狀態(tài)方法為(PA0為例 #define #define1 #define0 GPIO可以在user_init函數(shù)中通過GPIO狀態(tài)控制函數(shù)(gpio_set_input_en等)加以設(shè)加以執(zhí)行,在user_init中設(shè)定另外一些。不同的值時,根據(jù)程序的先后執(zhí)行順序,最終以user_init中設(shè)定為準(zhǔn)。voidgpio_init(int{//gpiodigitalstatus}}GPIO模擬上下拉電阻的寄存器deepsleepretentionGPIO模擬上下拉電阻的狀態(tài)能在deepsleepretentionmode下被維持住。deepsleepretentionGPIO模擬上下拉電阻的狀態(tài)不被改狀態(tài)去設(shè)置anaRes_init_en的值,如下面的code所示:intdeepRetWakeUp=pm_is_MCU_deepRetentionWakeup();gpio_init(!deepRetWakeUp);GPIO數(shù)字狀態(tài)在deepsleepretentionmode失GPIO狀態(tài)控制中,除了模擬上下拉電阻是由模擬寄存器(ogregister)控制,其他所有的狀態(tài)(func、ie、oe、dataO等)都是被數(shù)字寄存器register的狀態(tài)掉電丟失。 ink上一代826x系列IC上,suspend期間可以用gpiooutput來控制一模擬上下拉電阻的狀態(tài)來代替實現(xiàn):上拉10K代替gpiooutputhigh,下拉100K代替gpiooutputlow。VCC低一些)10KPC0~PC7的其他GPIO上拉10K都是可以的。配置SWS上拉防止死機終的應(yīng)用代碼上,SWS這個pin的狀態(tài)為:發(fā)來令,這個錯誤令可能會導(dǎo)致程序掛掉。拉1M電阻來解決。1M#ifndef#define PM_PIN_PULLUP_1M//swsBLEBLESDK軟件架標(biāo)準(zhǔn)BLESDK軟件架PhysicalLinkLogicalLinkControlandAdaptionSecurityMAttributeGenericAttributeGenericAccessProfileProfileProfile3-1BLESDKControllerBLE底層協(xié)議,包括PhysicalLayer(PHY)LinkLayer(LL)。HostControllerInterface(HCI)是Controller與Host的唯一通口,Controller與Host所有的數(shù)據(jù)交互都通過該接口完成。HostBLELogicLinkControlandAdaptionuser通過GAP去控制Host。HostHCIController3-2HostControllerHCI要介紹的controllerAPI。數(shù)據(jù)直接丟到PhysicalLayer進行發(fā)送。Controller在PhysicalLayerRFLinkLayer的數(shù)據(jù)HostLinkLayerHost的數(shù)據(jù),則通過HCI將數(shù)據(jù)傳到Host。inkBLESDK軟件架LL(linklayer)。SlaveroleMasterrolesingleconnectionLinkLayer只能維持一個連接,無法同時多個Slave/MasterSlaveMaster同時存在。HostMCU協(xié)調(diào)工作形成一個標(biāo)準(zhǔn)的BLESlave系統(tǒng),架構(gòu)圖如下。PhysicalLink3-38258hciLinkLayerconnectionsingleconnectionSlave和Master,那inkBLEst+Controller,實際的協(xié)議棧架構(gòu)會對上面標(biāo)準(zhǔn)的結(jié)構(gòu)做一些簡化處理,SDK的系統(tǒng)資源開銷(sram、運行時間、功耗等)最小,其架構(gòu)如下圖所示。SDK8258blesample、8258remote、8258module都是基于該架PhysicalLinkLogicalLinkControlandAdaptionSecurityAttributeGenericAttributeGenericAccess inkBLEslave架提供userAPI。空心箭頭是協(xié)議棧內(nèi)部完成的數(shù)據(jù)交互,user無法參與。不是唯一的接口,APP應(yīng)用層也可以直接與LinkLayer進行數(shù)據(jù)交互。Power件需要通過GAP層和應(yīng)用層交互。應(yīng)用層基GATT,定user自己需要的各種profileserviceBLESDKdemocode提供幾個基本的profile,包括HIDS、BAS、AUDIO、OTA等。的userAPI。HostController的部分?jǐn)?shù)據(jù)交互還是HCI來完但基本Host和Controller協(xié)議棧完成,應(yīng)用層幾乎不參與,只需要在L2CAP層HCI數(shù)據(jù)回調(diào)處理函數(shù)就行了,所以對HCI部分也不做介紹。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論