分析成果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ù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

PublishedinkBldg3,1500ZuchongzhiZhangjiangHi-TechPark,Shanghai,?inkSemiconductorAllRightLegalDiThisisprovidedas-is.inkSemiconductorreservestherighttomakeimprovementswithoutfurthernoticetothis oranyproductsherein.Thismaycontaintechnicalinaccuraciesortypographicalerrors.inkSemiconductordisanyandallliabilityforanyerrors,inaccuraciesorpletenesscontainedCopyright(c) inkSemiconductor ,Forfurtherinformationonthetechnology,productandbusinessterm,please inkSemiconductor Forsalesortechnicalsupport,pleasesend totheaddressof:版本歷史作者&標準化WSH,FQH&Keyscanflow,8.6BLEmasterfeaturedemo和driverflash空間的操作2.3.4GPIO數字狀態(tài)在deepsleepretentionmode失效, inkBLEConnstateSlaverole時序LinkLayerTXfifo&RXDataLengthblc_ll03.3233.3ATT&4.1.1低功耗模式3.3.1BLEhost介紹12.232k時鐘源選擇TYF,WSH,FQH,1.1軟件組織架構2.1.2Sram空間分配4.2.6作者&標準化SDK介 軟件組織架 application BLEstack 適用IC介紹 softwarebootloader介 Demo介 BLEslave BLEmaster featuredemo和driverdemo MCU基礎模塊 MCU地址空 MCU地址空間分 Sram空間分 2list文件分析 MCU地址空間 flash空間的操 SDKFLASH空間的分 時鐘模 Systemclock&System SystemTimer的使 GPIO模 GPIO定 GPIO狀態(tài)控 GPIO的初始 GPIO數字狀態(tài)在deepsleepretentionmode失 配置SWS上拉防止死 BLE模 BLESDK軟件架 標準BLESDK軟件架 inkBLESDK軟件架 inkBLE inkBLE inkBLE BLE BLEcontroller介 LinkLayer狀態(tài) LinkLayer狀態(tài)機組合應用 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參數配 SMP綁定信息說 master GAP初始 GAP 低功耗管理 低功耗 4.1 低功耗模 低功耗喚醒 低功耗模式的進入和喚 低功耗喚醒后運行流 API BLE低功耗管 BLEPM初始 BLEPMforLink 相關變 API API API PM軟件處理流 deepsleepretention的詳細分 API ConnectionLatency API GPIO喚醒的注意事 喚醒電平有效時無法進入sleep BLE系統(tǒng)低功耗管理參 應用層定時喚 低電檢 低電檢測的重要 低電檢測的實 5 低電檢測的注意事 必須使用GPIO輸入通 必須使用Dfifo模式獲得ADC采樣 低電檢測單獨使 低電檢測和Amic Audio初始 Amic和低電檢 Amic初始化設 Dmic初始化設置 Audio數據處 Audio數據量和RF傳送方 Audio數據壓 壓縮與解壓縮算 Flash架構設計和OTA流程 FLASH架構 OTA更新流 修改Firmwaresize和boot OTA模式RF數據處 Slave端AttributeTable中OTA的處 OTA數據packet格 7.2 master端RFtransform處理方 slave端RFreceive處理方 按鍵掃 鍵盤矩 Keymap Keyscan Deepsleep喚醒快速掃鍵(wake_upfast RepeatKey處 卡鍵處 LED管 LED任務相關調用函 LED任務的配置和管 定義led Ledevent的優(yōu)先 Blt軟件定時器(Software timer初始 Timer的查詢處 刪除定時器任務 id和管 時 11.1 波形取 開啟和停 模 脈沖數(pulse 中 APIforIRDMAFIFO DMAFIFO的配 設置DMAFIFO IRDMAFIFOmode的開啟與停 IR 模式的選 DemoIR協(xié) IR時序設 IR初始 IR硬件配 IR變量初始 FifoTask的配 應用層判斷IR 其他模 24M晶體外部電 32k時鐘源選 PhyTest PhyTest EMI Emi初始化設 EmiTX EMI EMITest 附 附錄1:crc16算 圖圖1-1SDK文件結 圖2-1MCU地址空間分 圖2-2各IC在16k和32kretention對應的Sram空間分 圖2-3Sram空間分配&Firmware空間分 圖2-4list文件section統(tǒng) 圖2-5list文件section地 圖2-6512KFLASH地址分 圖2-7systemclock&System 圖3-1BLESDK標準架 圖3-2Host和Controller的HCI數據交 圖3-38258hci架 inkBLEslave架構 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結構以及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根據不同IO能力映射KEY產生方 圖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數據抓 MICserviceinAttribute 圖6-3數據壓縮處 圖6-4壓縮算法對應數 圖7-1Flash結 圖7-2BLE協(xié)議棧WriteCommand格 圖7-3OTA命令和數據的格 圖7-4master通過ReadByTypeRequest獲取OTA的Attribute master發(fā)OTA masterOTA數 圖8-1行列式鍵盤結 cycle& 圖11-3DMAFIFObufferforIRDMAFIFO 圖11-4demoIR協(xié) 圖11-5IRtiming 圖11-6IRtiming 圖12-124M晶體電 圖12-2EMItest 圖12-3選擇型 圖12-4選擇數據總 圖12-5Swire同步操 圖12-6set 圖12-7選擇RF模式 圖12-8setRF模式顯示界 圖12-9選擇測試模 圖12-10設置TXpacket 圖12-11RXpacketnumber和 SDKBLESDKBLEslave/masterdemodemo基礎軟件組織架構 件夾有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驅動、PM驅動等文件,被封裝在庫文件里,用戶無法看到源文件。intmain(void)}}irq_nable(); while(1){#ifwd_clear();//clearwatchdog();//}}GPIO的配置、PMBLEslaveapp_att.c:serviceprofile的配置文件,有ink定義的Attribute,用戶可以參考這些添加自己的service和profile。BLEstackinkBLESDK中BLEstack部分code的函數有兩個irq_blt_sdk_handler_attribute_ram_code_void{}applicationfilemain_loopBLE邏輯和數據處理的函數blt_sdk_main_loopvoidmain_loop{/////////////////////BLEentry//////////////////////////////////////////////////UIentry//////////////////////PMconfiguration}硬件模塊基本一致,只是在SRAMsize方面略有差異。FlashSRAM512325124851264ICSRAMsize,其他部分是一致的,SDK文件架構除了SDK/boot/啟動(即softwarebootloader文件)和boot.link文件有差softwarebootloader 1-2ICbootloader以及boot.linkIC3個softwarebootloader文件,分別對應16kdeepretention、32kdeepretentiondeepretention功能(deepretention的介紹可以參考以cstartup_8258_RET_16K.S為例,第一句#ifdefMCU_STARTUP_8258_RET_16K說明了只有當user定義了MCU_STARTUP_8258_RET_16K時,該bootloader才會生效。softwarebootloader8258ICMCU_STARTUP_8258/deepretention16kdeepretention32kdeepretention功能的softwarebootloader,其他IC型號與此類似。8258_ble_remote為例說明如何選擇8258softwarebootloader。user1-3softwarebootloader 實際用戶在選擇不同的softwarebootloader文件后還需要修改SDK根 boot.link文件(根據下表對應關系將其中的link文件中的內容替換到SDK根boot.link中),ICsoftwarebootloaderboot.link選用關系見下16kB32kBcstartup_8258RET_32KS根據上面的例子以及映射表,我們知道softwarebootloader文件為SDK/boot/boot_16k_retn_8251_8253_8258.link文件內容替換到SDK根 boot.link文件中。DemoinkBLESDKBLEdemocode上進行修改,完成自己的應用開發(fā)。1-4BLESDKdemoBLEslaveBLEslavedemoMCU8258BLE其他MCUhost通信8258ApplicationMCUBLE8258ble8258ble最簡單的slaveMCUhost通信,形成一個完整的BLEslave系統(tǒng)。8258bleremote/8258module都是inkBLEslavestack。8258寫在對方主控MCU。BLEmaster8258masterkmadongle是BLEmastersingleconnection的demo8258blesample/8258bleremote/8258module連接并通信。stackslave共用一libary),包BLEcontroller+BLEhost,用戶只需要在app層添加自己的應用代碼,不用再去處理BLEhost的東西,完全依賴于controller和host的API即可。SDKlibraryslavemaster8258masterkmadonglecodeBLEcontroller功能部分,library中并沒有master的標準host功能。8258masterkmadongledemocodeapp層上給出了參考的BLEHost的實現方法,包括ATTSDP(servicediscoveryprotocol)和最常用的SMP(securitymanagementprotocol)等。BLEmaster最復雜的功能在于對slaveserver的servicediscovery和所有serviceandroid/linux系統(tǒng)中才能實現。ink8258ICflashsize和Sramsize的限制,無法提供完整的servicediscovery。但是SDK中提供了所有8258bleremoteservicediscovery過程,去實現自己的特定service的遍歷。featuredemodriver戶可參demo完成自己的功能code。該文BLE部分會介紹所有的feature。進行選擇性的定義,即可切換到不同featuretest的Demo。8258drivertestdriversamplecode供用戶參考并實現自己的driver功能。本文檔driver部分會詳細介紹各個driver。選擇性的定義,即可切換到不同drivertest的Demo。MCU基礎MCU地址MCU地址空間分00x7FFFFF8M8Mbytes0x8000000xFFFFFF為外部設備空間:0x800000~0x80FFFF為寄存器空間;0x840000~0x84FFFF為64KSram空間。2-1MCU8x5xMCUBIT(23)用于區(qū)別程序空間/Sram空間請用戶先掌握了解deepsleepretention相關知識。deepsleepretentionsuspenddeepsleep空間分配可以和SDK的用戶可先參考《826xBLESDKhandbookSram空間分配的介紹,再和SramFirmware空MCUSram32kBSram0x840000~0x848000,48kBSram地址空間范圍0x840000~0x84C000,64kBSram地址空間范圍為0x840000~0x850000。下圖82588253825116kretention32kretention模式下對SRAMIC8251deepsleepretention32Ksram模sramsoftwarebootloader和link文件。2-2IC16k32kretentionSram模式為例詳細Sram區(qū)域各個Sramsize是其他deepsleepretention32ksram模式,用戶可以類推一下即可。64kSramSramFirmware area(16K)

retention

retention

sramCache(2.25K)irq

flasharea

normal

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

0x77000~0x77fff這個sectorinkMCU需要校準定制的信息。只有這部bytes按照每64bytes劃分為不同的單元,每個單元一類校準信息。校準信息可以放在同一個sector,是因為校準信息在治具燒錄的過程到對第二64bytes:因ink上一ICRF需要TP值校準,所以這個位TPTP的問題,但這個位置仍然沿用了上一代IC的設計。第三個64bytes用來外部32kcrystal的電容校準值,后面的第四個、0x74000~0x75FFF這兩個sector被BLE協(xié)議棧系統(tǒng)占用,用來配對和加密信息。usersector的位置,sizesector8K,0x00000~0x3FFFF256K0x00000~0x1FFFF共128K為Firmware空間;0x20000~0x3FFFF128K改方法見后面OTA章節(jié)的詳細說明。 時鐘模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的設置使用的是以上幾個定義,說明該模塊的時鐘源為systemclock。如驅動中周期和占空的設置如下,說明的時鐘源是system 0_ID,(u16)(1000*CLOCK_SYS_CLOCK_1US),(u16)(500*CLOCK_SYS_CLOCK_1US));SystemTimer16M,所以對于這個timer,SDKcode中使用如下的數值來表示S、mS和uS。//systemtimerclocksourceisconstant16M,never API操作時,都使用上面類似”CLOCK_16M_SYS_TIMER_CLK_xxx”的方式來表示時voidsleep_us(unsignedlongunsignedintintclock_time_exceed(unsignedintref,unsignedint#define #define #define SystemTimer的使用戶可以SystemTimer計數器的值(簡稱SystemTimertick)。最小值0x 到最大值0xffffffff需要的時間為:(1/16)us*(2^32)約等于268S,每過268SSystemTimertick轉一圈。u32current_tick=clock_time();BLESDKBLESystemTimertick設計的,程序中也大量SystemTimertick來實現一些簡單的定時和超時判斷。u32start_tick 在程序的某處不斷查詢當前SystemTimertick和start_tick的差值是否超過需if((u32)(clock_time()-start_tick) 100* 268S,需要在軟件上加計數器累計實現(這里不介應用舉例: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的初始化為默認狀態(tài)。32個GPIO默認狀態(tài)為:全部為float。app_config.hgpio的默認狀態(tài)是使用宏來表示的,這些宏的寫法為(以PA0的ie為例):#ifndef#define app_config.h中配置GPIO狀態(tài)方法為(PA0為例 #define #define1 #define0 GPIO可以在user_init函數中通過GPIO狀態(tài)控制函數(gpio_set_input_en等)加以設加以執(zhí)行,在user_init中設定另外一些。不同的值時,根據程序的先后執(zhí)行順序,最終以user_init中設定為準。voidgpio_init(int{//gpiodigitalstatus}}GPIO模擬上下拉電阻的寄存器deepsleepretentionGPIO模擬上下拉電阻的狀態(tài)能在deepsleepretentionmode下被維持住。deepsleepretentionGPIO模擬上下拉電阻的狀態(tài)不被改狀態(tài)去設置anaRes_init_en的值,如下面的code所示:intdeepRetWakeUp=pm_is_MCU_deepRetentionWakeup();gpio_init(!deepRetWakeUp);GPIO數字狀態(tài)在deepsleepretentionmode失GPIO狀態(tài)控制中,除了模擬上下拉電阻是由模擬寄存器(ogregister)控制,其他所有的狀態(tài)(func、ie、oe、dataO等)都是被數字寄存器register的狀態(tài)掉電丟失。 ink上一代826x系列IC上,suspend期間可以用gpiooutput來控制一模擬上下拉電阻的狀態(tài)來代替實現:上拉10K代替gpiooutputhigh,下拉100K代替gpiooutputlow。VCC低一些)10KPC0~PC7的其他GPIO上拉10K都是可以的。配置SWS上拉防止死機終的應用代碼上,SWS這個pin的狀態(tài)為:發(fā)來令,這個錯誤令可能會導致程序掛掉。拉1M電阻來解決。1M#ifndef#define PM_PIN_PULLUP_1M//swsBLEBLESDK軟件架標準BLESDK軟件架PhysicalLinkLogicalLinkControlandAdaptionSecurityMAttributeGenericAttributeGenericAccessProfileProfileProfile3-1BLESDKControllerBLE底層協(xié)議,包括PhysicalLayer(PHY)LinkLayer(LL)。HostControllerInterface(HCI)是Controller與Host的唯一通口,Controller與Host所有的數據交互都通過該接口完成。HostBLELogicLinkControlandAdaptionuser通過GAP去控制Host。HostHCIController3-2HostControllerHCI要介紹的controllerAPI。數據直接丟到PhysicalLayer進行發(fā)送。Controller在PhysicalLayerRFLinkLayer的數據HostLinkLayerHost的數據,則通過HCI將數據傳到Host。inkBLESDK軟件架LL(linklayer)。SlaveroleMasterrolesingleconnectionLinkLayer只能維持一個連接,無法同時多個Slave/MasterSlaveMaster同時存在。HostMCU協(xié)調工作形成一個標準的BLESlave系統(tǒng),架構圖如下。PhysicalLink3-38258hciLinkLayerconnectionsingleconnectionSlave和Master,那inkBLEst+Controller,實際的協(xié)議棧架構會對上面標準的結構做一些簡化處理,SDK的系統(tǒng)資源開銷(sram、運行時間、功耗等)最小,其架構如下圖所示。SDK8258blesample、8258remote、8258module都是基于該架PhysicalLinkLogicalLinkControlandAdaptionSecurityAttributeGenericAttributeGenericAccess inkBLEslave架提供userAPI??招募^是協(xié)議棧內部完成的數據交互,user無法參與。不是唯一的接口,APP應用層也可以直接與LinkLayer進行數據交互。Power件需要通過GAP層和應用層交互。應用層基GATT,定user自己需要的各種profileserviceBLESDKdemocode提供幾個基本的profile,包括HIDS、BAS、AUDIO、OTA等。的userAPI。HostController的部分數據交互還是HCI來完但基本Host和Controller協(xié)議棧完成,應用層幾乎不參與,只需要在L2CAP層HCI數據回調處理函數就行了,所以對HCI部分也不做介紹。

溫馨提示

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

評論

0/150

提交評論