分析成果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页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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数字状态在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状态控 GPIO的初始 GPIO数字状态在deepsleepretentionmode失 配置SWS上拉防止死 BLE模 BLESDK软件架 标准BLESDK软件架 inkBLESDK软件架 inkBLE inkBLE inkBLE BLE BLEcontroller介 LinkLayer状态 LinkLayer状态机组合应用 Idle+ Idle+Scannni Ide+Advtersing+ 3.5Idle+Scannning+Initiating+ LinkLayer时 32.4.1Idlestate时 ConnstateSlaverole时 ConnstateMasterrole时 LinkLayer状态机扩 Scanningin Advertisingin LinkLayerTXfifo&RX Controller DataLength ControllerAPI ControllerAPI说 API返回类型 BLEMACaddress初始 LinkLayer状态机初始化 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系统低功耗管理参 应用层定时唤 低电检 低电检测的重要 低电检测的实 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的优先 Blt软件定时器(Software timer初始 Timer的查询处 删除定时器任务 id和管 时 11.1 波形取 开启和停 模 脉冲数(pulse 中 APIforIRDMAFIFO DMAFIFO的配 设置DMAFIFO IRDMAFIFOmode的开启与停 IR 模式的选 DemoIR协 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统 图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协议栈广播包格 图3-33BLE协议栈里Advertising 图3-34BLE协议栈四种广播图3-35BLEL2CAP结构以及ATT组包模 图3-36BLE协议栈中ConnectionParaupdateReq格 图3-37抓包显示connparaupdatereqeust和 图3-38BLE协议栈中connparaupdatersp格 图3-39抓包显示llconnupdate 图3-41该BLESDKAttributeTable截 图3-42master读hidInformation的BLE抓 图3-43BLE协议栈中Write 图3-44BLE协议栈中Write 图3-45BLE协议栈中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传统配对模式下MITM、OOBflag使用规 图3-64根据不同IO能力映射KEY产生方 图3-65抓包显示PairingPeer 图3-67master发起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协议栈WriteCommand格 图7-3OTA命令和数据的格 图7-4master通过ReadByTypeRequest获取OTA的Attribute master发OTA masterOTA数 图8-1行列式键盘结 cycle& 图11-3DMAFIFObufferforIRDMAFIFO 图11-4demoIR协 图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语言程序的运行搭建好环境。i2c、usb、gpio、uart等。proj_lib:SDK运行所必需的库文件(liblt_8258.a)。BLE协议栈、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上进行修改,完成自己的应用开发。1-4BLESDKdemoBLEslaveBLEslavedemoMCU8258BLE其他MCUhost通信8258ApplicationMCUBLE8258ble8258ble最简单的slaveMCUhost通信,形成一个完整的BLEslave系统。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系统中才能实现。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)用于区别程序空间/Sram空间请用户先掌握了解deepsleepretention相关知识。deepsleepretentionsuspenddeepsleep空间分配可以和SDK的用户可先参考《826xBLESDKhandbookSram空间分配的介绍,再和SramFirmware空MCUSram32kBSram0x840000~0x848000,48kBSram地址空间范围0x840000~0x84C000,64kBSram地址空间范围为0x840000~0x850000。下图82588253825116kretention32kretention模式下对SRAMIC8251deepsleepretention32Ksram模sramsoftwarebootloader和link文件。2-2IC16k32kretentionSram模式为例详细Sram区域各个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中执行的函数每次被调用时不需要从flash重新,可以节效率。SDKBLE时序相关的一些经常要执行的函数常驻到内存,大大降中看到该函数在ramcode段了。Firmwarevectorramcode都需要MCU上电时全部搬到ram上,编果_ramcode_size_vectorramcodecodesize。.=.vectors{}ram_code{}8258的deepsleepretentionmodeMCUdeepsleep后,Sram段的内容不16K的retention区域,进入deepsleep会掉电丢失。 int unsignedintBB= int unsignedintDD[4]=参考下面即将要介绍的“data/bss”段可知,datainitialvalue需要提前存放在flash上;bss段的变量initialvalue0,无需提前准备,bootloader运行时直接在sram上设为0即可。它们initialvalue,存放flashretention_dataarea上。上电(或normaldeepsleep唤醒)后会整体拷贝到sramretention_dataarea上。“retention_data”段是紧跟着”ram_code”段的,即”vectorramcoderetention_data”3段按顺序排布在flash的前面,它们的总大小为retention_data”sram的前面,此后程序执行过程中只要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区域)。retention_dataram_code/retention_data的tion(函数放在ram_code中的function可以节省运行时间以降低功耗,放在retention_datavariable也可以节省初始化时间以降低功耗(具体原因请CacheMCUSram中的一段才可以正常运行。Cachesize是固定的,包256tag2048字节Instructionscache,总共0x900=2.25K。常驻内存的code可以直接从内存中并执行,但firmware中可以常驻内FlashcodeCache中,如果当前需要执行的codeCacheCacheCache中,则从Flashcode并覆盖Cache中之前的code,再从Cache中指令执行。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中会给出分析方法。“text”Flashfirmwareram_code函数的集合。程序中的函数如果加了“_attribute_ram_code_ram_code段,其他没有加这段是要执行的codeloadCache中再可以被执行。Firmwarevector、ram_code和text,剩余的数据为”rodata”段和”datainitialvalue”。义的变量。比如Slave中的ATTtable:constattribute_tmy_Attributes[]= testValue=list文件分析配&Firmware空间分配”图来分析。8258blesamplebinlist文件见“SDK”->“Demo”->“listfile8258blesample.bin8258blesample.list,请用户自行查找文件找到截图对应位2-4listsectiontext:Flash0x4000开始,Size0x614crodata:Flash0xa14c开始,Size0x8ecdata:Sram0x844900开始,Size0x2cbytestack需要使用的256byte45943byte。2-5listsection图,结合该图和上面“list文件Section统计”图,分析如下:“vector”flashfirmware中起始地址0,结束地址0x170(最后一笔数据地址0x16e~0x16f),size0x170。上电搬移SramSram上的地址为0x840000~0x840170。“ram_code”section0x170,结束地0x2560(最后一笔数据地0x255c~0x255f)。上电搬移SramSram上的地址0x840170~后一笔数据地址为0x843244~0x843247)。0x3248flashfirmware16K0x3248byte0x32480x40003.43K的空间属于“wastefulflasharea(flash区域)”(用户可以打开8258_ble_sample.bin看到这段空间中全部是无效的0);Sram中0x843248~0x8440003.43K的空间属于“wastefulsramarea”(SRAMCacheSram中地址范围为:0x844000~0x844900笔数据地址为0xa148~0xa14b),Size0xa14c–0x4000=0x614c,和前面Section统计中数据一致。笔数据地址为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字节/4字节的指针来读写2字节/4字节对齐的,如果不对齐的话,会发生 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收发包的时序会被破坏,得不到及时响应。中断影响很小但连续读写的地址越长,时间就越长。所以强烈建议用户在main_loop里BLE连接状态时,不要连续读写太长的地址。flash_erase_sector函数的执行时间为几十到几百个ms,所以在主程序的读flash可以使用指针来实BLESDK的firmware在flash上,程序运行时,只是将flash前一部分的ram上执行,剩余的绝大部分代码根据程序的局部性原在需要的时候从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据没有被其他内容覆盖时,又有新的该数据的请求发生,此时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的大小(4Kbyte)为基本的单位,因为flash擦除信息时将其他类的信息误擦除)。所以建议user在使用FLASH定制信息时遵循“不同类信息放在不同sector”的原则。UserUserDataCustomedMACPair&SecUserDataOTANewbinstorageOldFirmware26512KFLASHuser提供了对应的修改接口,user可以根据自己需要去规划地址分配。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协议栈系统占用,用来配对和加密信息。usersector的位置,sizesector8K,0x00000~0x3FFFF256K0x00000~0x1FFFF共128K为Firmware空间;0x20000~0x3FFFF128K改方法见后面OTA章节的详细说明。 时钟模Systemclock&System系统时钟(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条件触发(只会触发一次)的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状态控一般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可配置的状态有4种:1M上拉、10K上拉、100K下拉和float状态。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的初始化为默认状态。32个GPIO默认状态为:全部为float。app_config.hgpio的默认状态是使用宏来表示的,这些宏的写法为(以PA0的ie为例):#ifndef#define app_config.h中配置GPIO状态方法为(PA0为例 #define #define1 #define0 GPIO可以在user_init函数中通过GPIO状态控制函数(gpio_set_input_en等)加以设加以执行,在user_init中设定另外一些。不同的值时,根据程序的先后执行顺序,最终以user_init中设定为准。voidgpio_init(int{//gpiodigitalstatus}}GPIO模拟上下拉电阻的寄存器deepsleepretentionGPIO模拟上下拉电阻的状态能在deepsleepretentionmode下被维持住。deepsleepretentionGPIO模拟上下拉电阻的状态不被改状态去设置anaRes_init_en的值,如下面的code所示:intdeepRetWakeUp=pm_is_MCU_deepRetentionWakeup();gpio_init(!deepRetWakeUp);GPIO数字状态在deepsleepretentionmode失GPIO状态控制中,除了模拟上下拉电阻是由模拟寄存器(ogregister)控制,其他所有的状态(func、ie、oe、dataO等)都是被数字寄存器register的状态掉电丢失。 ink上一代826x系列IC上,suspend期间可以用gpiooutput来控制一模拟上下拉电阻的状态来代替实现:上拉10K代替gpiooutputhigh,下拉100K代替gpiooutputlow。VCC低一些)10KPC0~PC7的其他GPIO上拉10K都是可以的。配置SWS上拉防止死机终的应用代码上,SWS这个pin的状态为:发来令,这个错误令可能会导致程序挂掉。拉1M电阻来解决。1M#ifndef#define PM_PIN_PULLUP_1M//swsBLEBLESDK软件架标准BLESDK软件架PhysicalLinkLogicalLinkControlandAdaptionSecurityMAttributeGenericAttributeGenericAccessProfileProfileProfile3-1BLESDKControllerBLE底层协议,包括PhysicalLayer(PHY)LinkLayer(LL)。HostControllerInterface(HCI)是Controller与Host的唯一通口,Controller与Host所有的数据交互都通过该接口完成。HostBLELogicLinkControlandAdaptionuser通过GAP去控制Host。HostHCIController3-2HostControllerHCI要介绍的controllerAPI。数据直接丢到PhysicalLayer进行发送。Controller在PhysicalLayerRFLinkLayer的数据HostLinkLayerHost的数据,则通过HCI将数据传到Host。inkBLESDK软件架LL(linklayer)。SlaveroleMasterrolesingleconnectionLinkLayer只能维持一个连接,无法同时多个Slave/MasterSlaveMaster同时存在。HostMCU协调工作形成一个标准的BLESlave系统,架构图如下。PhysicalLink3-38258hciLinkLayerconnectionsingleconnectionSlave和Master,那inkBLEst+Controller,实际的协议栈架构会对上面标准的结构做一些简化处理,SDK的系统资源开销(sram、运行时间、功耗等)最小,其架构如下图所示。SDK8258blesample、8258remote、8258module都是基于该架PhysicalLinkLogicalLinkControlandAdaptionSecurityAttributeGenericAttributeGenericAccess inkBLEslave架提供userAPI。空心箭头是协议栈内部完成的数据交互,user无法参与。不是唯一的接口,APP应用层也可以直接与LinkLayer进行数据交互。Power件需要通过GAP层和应用层交互。应用层基GATT,定user自己需要的各种profileserviceBLESDKdemocode提供几个基本的profile,包括HIDS、BAS、AUDIO、OTA等。的userAPI。HostController的部分数据交互还是HCI来完但基本Host和Controller协议栈完成,应用层几乎不参与,只需要在L2CAP层HCI数据回调处理函数就行了,所以对HCI部分也不做介绍。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论