蓝牙4.0实战演练网蜂团队倾力打造_第1页
蓝牙4.0实战演练网蜂团队倾力打造_第2页
蓝牙4.0实战演练网蜂团队倾力打造_第3页
蓝牙4.0实战演练网蜂团队倾力打造_第4页
蓝牙4.0实战演练网蜂团队倾力打造_第5页
已阅读5页,还剩297页未读 继续免费阅读

下载本文档

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

文档简介

前蓝牙4.0是2012年蓝牙版本,是3.0的升级版本,较3.0版本更省电、成本低、3毫秒低延迟、超长有效连接距离、AES-128加密等。蓝牙4.0是一款低功耗产品,目前,4s,ipad4等等都配备支持了4.0,刚刚发布不久的安卓本书内容第一章:蓝牙4.0简介和开发环境快速建立。本章内容主要对蓝牙4.0第二章:基础实验。本章内容主要是对蓝牙4.0CC2540的片上资源进CC2540第三章:BLE协议栈演练。本章主要是对蓝牙4.0协议栈BLE-CC254x-1.3.2进行介绍和开发。BLE-CC254x-1.3.2是TI公司为其蓝牙4.0CC2540专门编写的一个片上运行系统,在系统上运行蓝牙4.0协议。本章通过剖析系统的工作能通过学习后,DIY自己想要的功能。第四章:项目实战。本章主要利用蓝牙4.0协议栈,在栈上开发项目2013.8网店 :《蓝牙4.0实战演练》已经由网蜂科技于广州局备案,任何单位或个人同意其中内容的网蜂科技将以法律形式责任。4.0练》由网蜂科技倾力打造,始终坚持开源原则,开源全部源代码、学习资料,以及部分蓝牙4.0学习模块的原理图和PCB。当前版本为V2第二版。采用全新文档编写方法,规范内容和排版;协议栈版本更新至BLE-stack1.3.1版;项目实战新增蓝牙台灯、蓝牙防丢器、蓝牙键盘、蓝牙鼠标;新增网蜂蓝牙4.0周边学习模块介多个TI重要工具的使用;修正了蜂迷学习第一版过程中所有发现的BUG。历史版本第一版。内容涵盖了蓝牙4.0的简介、开发环境的建立、基础实验、BlE协议栈演练和项目实战。第1章蓝牙4.0简介和开发环境快速建 蓝牙4.0简 网蜂蓝牙4.0开发平台介 网蜂蓝牙4.0 蓝牙4.0MINI模 网蜂蓝牙4.0功能底 网蜂蓝牙4.0增强型功能底 网蜂蓝牙4.0普通底板(PCB开源 网蜂蓝牙4.0USB 网蜂蓝牙4.0 网蜂ZigBee仿真器 网蜂TICC系列仿真器CC 网蜂蓝牙4.0开发套 开发环境快速建 相关软件和驱动安 IAR工程文件的快速建 附录 使用TISmartRFFlashProgrammer程 第2章基础实 点亮第一个 按 外部中 定时 定时器T1(查询方式 定时器T3(中断方式 串口通 串口发送(o 串口接收和发送(send& UART0-控制 AD控制(自带温度计 睡眠唤 中断唤 定时器唤 看门 第3章BLE协议栈演 BLE协议栈简 协议栈工作原理介 工程文件介 OSAL介 协议栈的串口实 串口发 串口接 协议栈的按键实 SimpleBLECentral工程按键配 SimpleBLEPeripheral工程按键配 蓝牙无线数据传输入 部分代码简 建立连 连接和简单数据传输测 实现上电自动连 Profile简单介 SimpleGATTProfile及Btool的使 串口透 客户端接收串口数据并写入特征 服务器接收串口数据并写入特征值,再通知主 传感器应用(开发中 温度传感器 温湿度度传感器 红外收 附 packetSniffer协议栈分析软件使用说 蓝牙4.0在IOSAPP中测 其它工具及源码获 第4章项目实 蓝牙台 蓝牙防丢 蓝牙键 蓝牙无线操作 蓝牙无线操作音乐 蓝牙无线鼠 无线飞 蓝牙4.0系列穿戴设备(项目开发中 第1章蓝牙4.0简介和开发环境快速建立4.01.1蓝牙4.01.2电池连续工作数年之久。此外,低成本和跨厂商互操作性,3毫秒低延迟、100单模式面向高度集成、紧凑的设备,使用一个轻量级连接层(LinkLayer)制、医疗及运动感应器等广大新兴市场的应用奠定基础。另外蓝牙4.0依旧向下兼容,包含经典蓝牙技术规范和最高速度24Mbps的蓝具。FitbitFuelbandMOTACTV,和时尚的基1.3网蜂蓝牙4.0开发平台介绍网蜂蓝牙4.0图1.4网蜂蓝牙4.0板TI图1.5蓝牙4.0板效果功能特点:1、尺寸:3.6*2.75、功耗:接收电流<20mA,发射电流6、使用2.4G全向天线,可靠传输距离达200米。4.0MINI1.64.0MINI模块功能特点:1、尺寸:2.0*1.55、功耗:接收电流<20mA,发射电流7、超低功耗,睡眠功耗<10uA,应用于物联网智能家居、穿戴设备等嵌入式领域。网蜂蓝牙4.01.74.0功能特点:1、底板尺寸:7*5网蜂蓝牙4.01.8功能特点:底板尺寸:7*5串口通讯:自带USB(PL-2303),方便笔记本用户引脚以及5V/3.3V引脚模块支持:支持WeBeeCC2540网蜂特色:模块可以使用7号3.7V锂电池通过LDO进行稳压供电,此时可以由学习板变身为移动节点,学习使用2计大大提高了节点的工作时间和节约用户开支。加入锂电池充电电路,USB即插即充电。非常方便!网蜂蓝牙4.0普通底板(PCB开源图1.9图 PCB开功能特点:底板尺寸:5*55V引脚以及5V/3.3V引脚功能按键:1个复位,1个普通按键模块支持:支持WeBeeCC2540网蜂蓝牙 图 蓝牙4.0USB功能特点:1、尺寸:4.5*1.73、4、5、功耗:接收电流<20mA,6、PCB7、SmartRFPacketSnifferBLE能;同时可利用BToolPC上位机。8、设计,兼容所有应用。全网唯一超窄边框设计USBDongle采用人性化设计,板子宽度缩小达到1.7cm,这使得USBDongle插入电脑USB口后,不会挡住相邻USB口的位置,而这是其他很多USBDongle所没有考虑的,特别适合USB接口缺乏的笔记本电脑用户。网蜂蓝牙4.0图 功能特点:9、尺寸:6*3.311、12、13、功耗:接收电流<20mA,、15、设计,兼容所有应用。全网唯一弧形设计,方便直接应网蜂Keyfob采用人性化设计,带有扣孔,可以变成随身产品。集成重力感应传感器,开发应用2不误。ZigBee仿真器1.13功能特点:支持仿真器直接供电;支持IAR调试、程序、SmartRFSTUDIO和packetsniffer协议支持TIzigbee系列,如支持TI蓝牙4.0网蜂特色:预留 更新接口,允许用户自行更新USB_bootloader网蜂TICC系列仿真器CC1.14CC功能特点:支持IAR调试、程序、SmartRFSTUDIO和packetsniffer协议支持USB更新固件;兼容TI全CC系列CC1110,CC1111CC2430,CC2431CC2510,CC2530,CC2531,CC2533CC2540,CC2541CC2543,CC2544,CC2545CC1120,CC1121,CC1125,CC1175CC1100,CC1101,CC110L,CC113L,CC115LCC2500,CC2520CC8520,CC8521CC8530,网蜂蓝牙4.01.15本开发套件平台具有一下特点·板上资源丰富,引出全部IO口,更适合学习DIY自己的作品·LED、按键应有尽有,符合国内学习者的开发习惯·USB串口电路,方便笔记本以及没有串口的电脑用户使用5号3.7V电池供电。·国内首创物联网接口。通过配套的网蜂物联网盒子可以与嵌入式网关、ZigBee、RFID、WIFI通1.164.0开发套件+USB开发环境快速建立这里我们使用IAR编译环境,IAR开发最大优势就是能够直接使用TI公司提供的BLE协议栈进行开开发过程中只需要调用API接口函数无需编写底层代码本选用以下版本进行学习本节内容分两部分:12、IAR项目工程文件的快速相关软件和驱动安装第一步:安装IAR8.10方法 1.171.12后生成License,到License#处:图1.18码输图1.19IAR1.20IAR图1.21IAR8.10第二步:TI议栈BLE-CC254x-1.3.2法1.22 1.23BLEBLE协议栈我们还没需要用得这么快,在接下来的里,我们先把它当的就当做复下单片机吧。第三步CCDEBUGGER动图1.24IAR6连接CC2540开发板,按下DEBUGGER复位键,指示灯亮(表示检测到开发板上CC2540,则完成连接工作。图1.27仿真器识别指示灯第四步:USB转串口驱动的安装ZigBee所有开发板上集成PL2303的USB转串口,我们通过安装相应的驱动可通过USB直接开发调试。打开PL2303_driver软件直接进行安(安装时USBzigbee)1.28PL2303属性—硬件—设备管理器,查看到USB-to-SerialCom,说明驱动安装成功。1.29至此,相关开发软件和仿真器驱动都安装好了,接下来我们讲一下 编译环境中如何快速建立自己的工程和修改相关配置。IAR工程文件的快速建立选择默认选项可以了,点击1.301.31有这个头文件。然后保存为.c格式到工程文件路径下。怎么样,是不是跟KEIL开发51很相似呢?1.32保存为.c程里单击右键add刚保存的C文件,成功添加后如图所示。1.33第四步:IARProjectOptions,1.34GeneralOptions选择Linker—Config—Linkercommandfile选项1.27所示按钮,导出文件,先向上返回上一级,然后打TexasInstruments件夹,选择lnk51ew_cc2540F256.xcl(这里是使用CC2540F256。1.35Linker–Config1.36CC2540F256第五步:然后在Debugger选项的Driver里选择TexasInstruments(使用编程器仿真),下面选择ioCC2540F256.ddf文件,如图1.29所示。至此,基图 Debugger参数配第六步:Project-Make编译后显示00CCDEBUGGER和快捷键如图1.30所示:图1.38程 图1.39程序图1.40调试。结束后程序仍然保留在flash内,相当于烧写工具。非常方便。1.41全速运行后,LED1使用TISmartRFFlashProgrammer程非常方便。在这里我们补充一下另一种程序烧写方法,使用TISmartRFFlash 下的Debug—Exe找到生成的.hex文件图 Options-图 第二步:TISmartRFFlashProgrammerSystem-on-chip(切记别选错),添加刚刚生产的.hex文件。点击程序按钮,.hex文件变被图 TISmartRFFlash第2础实学习本章将能令你快速掌握CC2540的编程方在以后学习完组网及数据传标题:基础实验内容前言:简单介绍这个版块的应用实验现象:提前让大家知道此程序实现的现象。实验讲解:对寄存器、代码、编程方法详细讲解,代码为了方便大家会使用颜分,尽量做到像编译器一样。实 :记录程 到开发板上 示例点亮第一个前言实验现象:程序实验点亮图 点亮实验讲解:我们先来看看BlueTooth底板的LED部分原理图:如下图2.2LED口2-1(CC253xandCC2540User's2-1CC2540IOP1SEL(0:IO口1:P1DIR(0:输 1:输 P1INP(0:上拉/下 1:三 出低电平时LED1被点亮。所以配置如下:P1SEL&=~0x01;IOP1DIR|=0x01;//P1_0P1INP&=~0X01;//打开上拉P1SELP1DIR|=0xff;P1INP=0X00;P1DIR|=0x01;//P1_0源程序代码(全程序描述:点亮#include<ioCC2540.h>#defineLED1 //定义P10LED1制void{P1DIR|= //P1_0定义为输}void{ //调用初始化程序LED1 //点亮}实验2.3按前言相信大家经过例1LED实验CC2540的编程以IAR的编译方法有一定的了解。我们来讲解一下BlueTooth模块的按键实验,按键是实现人机交互必不可少的东西,我们实验就用来实现按键控制LED。实验现象:依次按下按键S1控制LED1的亮和灭2.4S1LED1实验讲解图 LED、按键电路能如表2-2(CC253xandCC2540User'sGuide.pdf)表2- CC2540P0口寄存P1SEL(0:IO1:P1DIR(0:输 1:输 P1INP(0:上拉/下 1:三 P1SEL&=~0x01;//作为普通IOP1DIR|=0x01;//P1_0P1INP&=~0X01;//打开上拉P0SEL&= P0DIR&= P0_0P0INP&= P0_0P1SEL=0x00;P1DIR=0xff;P1INP=P1DIR|= //P1_0P0DIR&= 源程序代码(全程序描述:依次按下S1LED1#include<ioCC2540.h>#defineuintunsignedint#defineucharunsignedchar//定义控制LED灯的端口#defineLED1 //LED1P1.0口控#defineKEY1 //KEY1P0.0控//函数voidDelayms(uint); voidInitLed(void); void //按键初始化uchar //按键扫描程序延时函数voidDelayms(uint {uinti,j;for(j=587;j>0;j--}LED初始化函数voidInitLed(void){P1DIR| //P1_0定义为输LED1 //LED1灯熄}/****************************按键初始化函数voidInitKey(){P0SEL&= //设置P00为普通IOP0DIR& //按键在P00口,设置为输入模P0INP& //打开P00拉电阻,不影}/****************************按键检测函数ucharKeyScan(void){{{while(!KEY1);//松手检测return //有按键按}}return //无按键按下}/***************************主函数voidmain(void){ { //按键改变LED状}}实验2.6前言中断在MCU里面应用是非常广泛的,比如应用在时钟上的按键,我们可以发资源。也就是具有良好的实时性,本节将讲述CC2540的中断应用。实验现象:通过外部中断方式依次按下按键S1控制LED1的亮和2.7实验讲解:我们先来看看BlueTooth底板的KEY和LED部分原理图:如下图2.8CC2540的外部中断我们需要配置三个寄存器P0IENPICTLP0IFGIEN1。CC253xandCC2540User'sGuide.pdf)2-3CC2540P0按照表格寄存器内容,我们对LED1和按S1,也就P1.0P0.0口进行配置,当P1.0输出高电平时LED1被点亮,S1按下时P0.0产生外部中断从而控制LED1的亮灭。所以配置如下:P1DIR|=0x01;//P1_0P0IEN|= //P00PICTL|= IEN1|=0X20; //允许P0口中断;P0IFG= //初始化中断标志源程序代码(全程序描述:按键S1外部中断方式改变LED1状#include<ioCC2540.h>#defineuintunsignedint#defineucharunsignedchar//定义控制LED灯的端口#defineLED1 //定义LED1P1.0#defineKEY1 //中断//函数voidDelayms(uint); voidInitLed(void); voidKeyInit(); ucharKeyValue=0;//延时函voidDelayms(uint {uintI,j;for(j=587;j>0;j--}LED初始化程序void{P1DIR|0x01/P1_0义为LED1 //LED1灯熄}KEY初始化程序–外部中断方voidInitKey(){P0IEN|=//P00置为中断方PICTL|=沿触IEN1|=P0IFG=//初始化中断标志}EA=//开总中/****************************中断处理函数#pragmavector //格式:#pragmavector向量//紧接着是中断处理interruptvoid{ //去除抖 //改变LED1状态P0IFG //清中断标志P0IF //清中断标志}主函voidmain(void){ //等待外部中断}实验2.9前言实验现象:分别利用定时T1T3LED周期性闪烁实验讲解:我们先来看看BlueTooth底板的LED部分原理图:如下图图 LED电定时器T1(查询方式CC2540T1(16我们需要配置三个寄存器T1CTLT1STATIRCON。IO口配置请留意第一节内容。各寄存器功能如表2-4所示:(详细参考CC253xandCC2540User'sGuide.pdf)2-4CC25401Timer1Bit3:Bit200:01:810:3211:128Bit1:Bit0 01:自动重装0X0000- 比较计数0X0000-11:方Timer1Bit5: 14 13 12 11 10T1LED11S的周期闪烁。具体配置如下:P1DIR|= T1CTL=0x0d; T1STAT=0x21; //通道0,中断有效源程序代码(全程序描述:通过定时器T1查询方式控制LED1周期性闪#include<ioCC2540.h>#defineuintunsignedint#defineucharunsignedchar//定义控制LED灯的端口#defineLED1 //定义LED1为P10口控制//函数voidDelayms(uintxms); voidInitLed(void); void //初始化定时器//延时函voidDelayms(uint {uintI,j;for(j=587;j>0;j--}//初始化程序voidInitLed(void){P1DIR| //P1_0定义为输LED1 //LED1灯初始化熄}//定时器初始化void //系统不配置工作时钟时默认是2分频,即{T1CTL=0x0d; //128分频,自动重装0X0000-0XFFFFT1STAT=0x21; //通道0,中断有效}/***************************主函数voidmain(void){uchar { //查询方{ 1s周期性闪烁{LED1 //LED1闪烁}}}}T=1/(16M/128)*65536=0.5s,Ta=T*count=0.5*2=1S定时器T3(中断方式2-52-5CC25403Timer3Bit7:Bit5 001:2分 010:4分频011:100:16101:32110:64Bit4 T3Bit3 溢出中断掩码0:关溢出中 1:开Bit2 清计数 高电平有Bit1:Bit0:T300:自动重装0X00-01:DOWNT3CC00X0010:模计数(0X00T3CC011UP/DOWN0X00T3CC0 0Bit6:T3通道0中断掩 Bit5:Bit3T30Bit2:T3通道0模式选择 0:捕 1:比Bit1: 没有捕 上升沿捕10下降沿捕 边沿捕T30捕获/比较值寄存器 1Bit6:T3通道1中断掩 Bit5:Bit3T31Bit2:T3通道1模式选择 0:捕 1:比Bit1: 没有捕 上升沿捕10下降沿捕 边沿捕T31捕获/比较值寄存器在此对定时器3做一个简单介绍:倒计数到0x00。当使能中断时,在计数到0时将产生一个中断4TxCC0AT1定时器查询方式的区别就是此处T3定时器(8位),|=0x08//开溢出中断=//开总中断和T3中断//128分频&=//自动重装//启动65200/256=254EA=//开总中源程序代码(部分程序描述:利用定时器T3中断方式控制LED1状态周期性改变……voidInitT3(){T3CTL|=;//开溢出中断T3IE=//开总中断和T3中断//128分频T3CTL&=~0X03; //自动重装00->0xff65200/256=254(次)T3CTL|=0X10; EA //开总中}//主函数voidmain(void){ while(1){}中断函数#pragmavector=T3_VECTOR interruptvoid{IRCON=//清中断标志,也可由硬件自动完//254次中LED取反,闪烁一轮(约为0.5时间{count=}实验图 LED定时闪哈哈,你看不了闪烁吧。赶快把程序烧进去看看吧前言无论学习哪款MUC串口对于我们进行实验调试都是非常方便实用我们可以调试,许多MUC和PC机通信都是通过串口来进行的。下面一起来学习BlueTooth的串口实验。实验现象:实验将使用BlueTooth开发板实现3个功能。发送、收发、控制LED图 PL2303USB转串口电串口发送(oUART0对应的外部设备IO引脚关系为 UART1对应的外部设备IO引脚关系为 在CC2540中,USART0和USART1是串行通口,它们能够分别运行于异步USART模式或者同步SPI模式。两个USART的功能是一样的,可以通过设置在单独的IO引脚上。1、894LSBMSB6DMACC2540配置串口的一般步骤:1、配置IO,使用外部设备此处配置P0_2和P0_3用作串口2、配置相应串口的控制和状态寄存器。此处配置UART0的工作寄存器3、配置串口工作的波特率。此处配置为波特率为UTX0IF。各寄存器功能如下表所示:(详细参考CC253xandCC2540User's2-6CC2540UART控制和状态寄存1:使11:USART通用控制寄存器0:SPI1:SPIBit[4-波特率指数 BAUD_E连同BAUD_MBit[7- 起决定了UART的波特率中断标志中断标志IRCON2PERCFG= P0SEL= P2DIR&= //P0=串口发送函数请参考下面源程序:源程序代码(全#include<ioCC2540.h>#include<string.h>#defineuintunsignedint#defineucharunsigned//定义LED端口#defineLED1P1_0#defineLED2//函数voidDelay_ms(uint);voidvoidUard_String(char*Data,intchar //存放"oBlueTooth4.0\n"共19个字符延时函数voidDelay_ms(uintn){uintI,j;{}}void{P1DIR //P1_0IO方向输LED1 }串口初始化函数voidInitUART(void){PERCFG //位置1P0P0SEL //P0_2,P0_3用作串口(外部设备功能P2DIR& //P0先作为U0CSR| //设置为UART方U0GCR|=U0BAUD|= //波特率设为UTX0IF //UART0TX中断标志初始置位}串口发送字符串函数voidUard_String(char*Data,intlen){intj;{U0DBUF=*Data++;while(UTX0IF==0);UTX0IF=}}主函数voidmain(void){CLKCONCMD&=~0x40; while(CLKCONSTA&0x40); //等待晶振稳定为32MCLKCONCMD&=~0x47; //设置系统主时钟频率为32MHZ//将发送内容copy到Txdata;strcpy(Txdata,"oBlueTooth4.0\n");{`//串口发送数据Uard_String(Txdata,sizeof("oBlueTooth4.0\n")); //标志发送状态}}实验图 USB转串口连接方图2.14上位机接收到发来的 o串口接收和发送(send&寄存器配置请参考上方实1的表格。实验2较实1增加了串口接收功CLKCONCMD&= 置系统时钟源为32MHZwhile(CLKCONSTA& 待晶振稳CLKCONCMD&= 系统主时钟频率为PERCFG //位置1P0 //P0_2,P0_3,P0_4,P0_5用作串口,第二功能P2DIR&= //P0作为UART0先U0CSR|= //UARTU0GCR|= //U0GCR与U0BAUD配合U0BAUD|= 率设为UTX0IF //UART0TX断标志初始置位1(收发时候|=//允许接|=中断,接源程序代码(部分)程序描述:例以abc#方式发送,#为结束符,返回abc。波特率:115200bps……/***************************************************************串口初始化函数voidInitUart(){CLKCONCMD&= 置系统时钟源为32MHZwhile(CLKCONSTA& 待晶振稳CLKCONCMD&= 系统主时钟频率为PERCFG //位置1P0P0SEL //P0_2,P0_3,P0_4,P0_5用作串口,第二功能P2DIR&= //P0先作为UART0优先U0CSR|= //UARTU0GCR|= //U0GCR与U0BAUD配合U0BAUD|= 率设为UTX0IF //UART0TX断标志初始置位1(收发时候U0CSR| //允许接IEN0|= 总中断,接收}串口发送字符串函数voidUart_Send_String(char*Data,intlen){intj;{U0DBUF=while(UTX0IF==0); UTX0IF=0;}}/***************************主函数voidmain(void){ {if(RXTXflag //接收状{ if(temp!=0){ //’#’被定义为结束字Rxdata[datanumber++]=temp;{RXTXflag //进入发送状态 //关指示}temp=}}if(RXTXflag //发送状{LED2=U0CSR&=~0x40; Uart_Send_String(Rxdata,datanumber);//发送已记录的字符串。U0CSR|=0x40; RXTXflag //恢复到接收状datanumber=0; //指针归0LED2=0; //关发送指示}}}串口接收一个字数据从串口传至CC2540,进入中断,将接收到的数据赋值给变量temp.#pragmavector=URX0_VECTORinterruptvoid{URX0IF //清中断标temp=}实验 2.15发送:ILoveBlueTooth4.0!#接收到:ILoveBlueTooth4.0UART0-控制程序描述:依次发送L1#L2#指令分别控制LED1、LED2亮灭,波特率:……//主函数voidmain(void){ {if(RXTXflag== //接收状{if(temp!={if((temp!=’#’)&&(datanumber<3))//’#’被定义为结束字符,最//多能接收50个字Rxdata[datanumber++]=temp;{RXTXflag //进入发送状态}temp=}}if(RXTXflag== //检测接收到的数据{switch(Rxdata[1]-48)//很重要,ASICC码转成数字,判断L后面第一个数

{case1:LED1=~LED1; case2:}RXTXflag=datanumber= //指针归}}}实验 2.16L1# 控制(自带温度计前言温度传感器是我们学习MCU经常使用的传感器,在CC2540里就集成里片的温度传感器有人会想到如果发热怎么办?这个你得问问TI的工程师了。而实验功能:将到内部温度传感器信息通过串口发送到上位机实验讲解:CC2540的内部温度检测需要配置的寄存器比较多,包括温度和 CCON1,ADCCON3,ADCH,ADCL。各寄存器功能如下表所示:(详细参考2-7CC2540ADCBit7: 0:AD转换进行 1:AD转换完Bit6: 0: 1启动AD转换(需要Bit5: 00:外部触 01 10:T1通道0比较触 11:手动触Bit3: 1600:普通模 (13x打开 开启LFSR时钟一次 打开10:保留 11:Bit7:Bit6 01:AIN711AIN6-AIN7Bit5: 00:64dec,7位有 01:128dec,9位效10:256dec,10位有 11:512dec,12Bit3:Bit0设置序列AD否则置位后立即开始AD转换,转换完成后自动清0.0000:AIN00001:AIN10010:AIN20100:AIN40101:AIN50110:AIN61000:AIN0-AIN1差 1001:AIN2-AIN3分1010:AIN4-AIN5差 1011:AIN6-AIN7分1100:1101:保留1110:温度传感器11111/3Bit7:Bit6 01:AIN711AIN6-AIN7Bit5: 00:64dec,7位有 01:128dec,9位有10:256dec,10位有 11:512dec,12位有Bit3:Bit0AD后立即开始AD转换,转换完成后自动清0.0000: 0001: 0010:AIN20011:0100: 0101: 0110:AIN60111:1000:AIN0-AIN1差 1001:AIN2-AIN3差1010:AIN4-AIN5差 1011:AIN6-AIN7差1100: 111011111/3Bit0:1ADCBit0:1temperaturesensorADADCCON10x33;//TR0=0x01;ATEST=0x01;源程序代码(全程序描述:通过内部AD控制把温度信息通过#defineuintunsignedint#defineucharunsignedcharvoidmain(){ { //初始化ADC}}实验图2.17手摸着CC2540后温度变前言实验功能实验讲解系统进入低功耗模式后,维持MAC定时器(T2)的定时。其特性如下:有中断和DMA触发功能在PM2低功耗模式下运行系统电源管理(工作方式如下全部工作,数字处理模块正常工作。PM1(16M32M)关闭,低频晶振(32.768KRCOSC/XOSC)PM2:低频晶振(32.768KRCOSC/XOSC)工作,数字模块关闭,系统通过RESET,外部中断或者睡眠计数器溢出唤醒。2.18中断唤(CC253xandCC2540User's2-8CC2540 00全功能模式 SLEEPCMD|= PCON=0x01; //进入睡眠模式,通过中断打断PCON=0x00; //系统唤醒,通过中断打断源程序代码(全程序描述:LED2闪烁5次后进入睡眠状态,通#include<ioCC2540.h>#defineuintunsignedint#defineucharunsigned//定义控制LED灯和按键的端口#defineLED2 //定义LED2P11控#defineKEY1//函数void //延时函void //初始化P1voidSysPowerMode(ucharsel);//系统工作模延时函数voidDelayms(uint {uintI,j;for(j=587;j>0;j--}//初始化程序voidInitLed(void){P1DIR| //P1_1定义为输LED2 //LED2灯熄P0INP&= //设置P0口输入电路模式为上拉/下P0IEN| //P01设置为中断方PICTL|= 降沿触}系统工作模式选择函数*para1012*modePM0PM1PM2voidSysPowerMode(ucharmode){uchari,j;i=mode;{SLEEPCMD|= //设置系统睡眠模PCON 入睡眠模式通过中断打}{}

PCON 唤醒中断}/***************************主函数voidmain(void){ucharcount= IEN1|=0X20; //开P0口总中断P0IFG|=0x00; EA={{ //5次闪烁后进入睡眠状态//等待按键S1中断唤醒}}}中断处理函数-系统唤#pragmavector=P0INT_VECTORinterruptvoid{{P0IFG //清标志}P0IF=SysPowerMode(4);//正常工作模}实验12.19定时器唤醒CC2540睡眠定时器除了1之外还需要配置的寄存器如下:ST0,ST1,ST2也就是文初提及到24bit2-9所示:(详细CC253xandCC2540User'sGuide.pdf)2-9CC2540Bit7UINT32sleepTimer=(UINT32)ST1(UINT32)ST2((UINT32)sec ST2=(UINT8)(sleepTimer>>16);ST1=(UINT8)(sleepTimer>>8);ST0=(UINT8)sleepTimer;源程序代码(部分………系统工作模式选择函数*para1012*modePM0PM1PM2voidSysPowerMode(ucharmode){uchari,j;i=mode;{SLEEPCMD|= //设置系统睡眠PCON 睡眠模式过中断打}{PCON 唤醒通过中断}//初始化SleepTimer(设定后经过指定时间自行唤醒voidInit_SLEEP_TIMER(void){ST2=0X00;ST1=0X0F;ST0=EA //开中STIE=1;//SleepTimerinterruptSTIF0;//SleepTimerinterruptflag还没处理}设置睡眠时voidSet_ST_Period(uintsec){UINT32sleepTimer=0;sleepTimer|=ST0;sleepTimer|=(UINT32)ST1<<sleepTimer|=(UINT32)ST2<<sleepTimer+=((UINT32)sec*(UINT32)32768);//低频晶振PM2模式

=(UINT8)(sleepTimer>>=(UINT8)(sleepTimer>>ST0=(UINT8)}//主函数voidmain(void){uchar {for(i=0;i<6;i闪烁3{} }}//睡眠中断唤醒#pragmavector=ST_VECTORinterruptvoidST_ISR(void){STIF=0; }实验 2.20前言看门狗,眼名字。无论在普通的51,还是高级的ARM。都离不开他的身影。一个完整的系统总需要一个看门狗,在你程序跑飞的时候帮你一把,使系统重新进入工作状态。它无疑是世界上最忠诚的狗。不过可千万别忘了喂它。实验功能:演示打开看门狗后没有喂狗系统不断复位的情况。实验讲解:CC2540的看门狗很简单,只需要配置1个寄存器WDCTL。功能如表2-10(CC253xandCC2540User'sGuide.pdf)2-10CC2540WDCTLBit7:Bit40xA,0x5,Bit3:Bit2WDT00 01IDLE(未使用 看门狗模 11定时器模 001 010.251015.625毫 11 毫WDCTL= IDLEWDCTL|= WDCTL= WDCTL=源程序代码(全/**************************************/程序描述:打开看门狗后,得记得喂狗,不然系统就会不停地复位了。把喂狗注释掉观察LED1现象#include<ioCC2540.h>#defineuintunsignedint#defineucharunsignedchar//定义控制LED灯的端#defineLED1#defineLED2 //定义LED2为P11口控//函数voidDelayms(uintxms); voidInitLed(void); //延时函voidDelayms(uint {uinti,j;for(j=587;j>0;j--}//初始化程序voidInitLed(void){P1DIR|=0x03;//P1_0、P1_1义为输LED1 //LED1灯熄LED2 //LED2灯熄}void{WDCTL //这是必须的,打开IDLE才能设置看门WDCTL| //时间间隔一秒,看门狗模}void{WDCTL=WDCTL=}//主函数voidmain(void){ { //通过注释测试,观察LED1,系统在不停复位。 }}实验2.21第3BLE议栈演标题:实验内容。前言:简单介绍这个版块的应用。实验平台:硬件和软件平台。实验现象:提前让大家知道此程序实现的现象。实验步骤:简单明确的实验步骤,先操作再讲解。实验讲解:对实验过程、现象及代码进行解读。实验:记录程序到开发板上的示例BLE图 BLE栈架协议栈包括两个部分:控制器和主机。控制器和主机在标准蓝牙BR/EDR设备这两个部分通常是单独实现。任何配置文件和应用程序都是建立在GAP和GATT协议层上。PHY层:1Mbps自适应跳频 频移键控运行在免证的2.4GHz(scanning(initiating(API外部硬件控制接口,可以通过串口、SPI、USB来实现设备控制。接接触的主要是GAPGATT这两个层。协议栈工作原理介绍工程文件介绍 图 BLE可看到ProjectsSimpleBLECentralSimpleBLEPeripheralHIDEmuKbdProfile(即通用的协其中还有4SimpleBLEBroadcasterSimpleBLECentralObserver观察 ——扫描得到,但不能Peripheral从 ——可,在单个链路层中作为从Central主机 OSAL我们当初学习51LED令LED1一秒闪烁一次,LED2二秒闪烁一次。这样就有2个任务了。再进一nLED,n图3.3TexasInstruments\BLE-CC254x-\ble\SimpleBLEPeripheral\CC2540DBSampleApp.eww图3.4打开后在IAR左边可看到左边的工程 如图3.5所示:3.5任何程序都在main函数开始运行,BLE也不例外。打开览一下main函数代码:3.6* * Startof* * int{/*Initializehardware //初始化系统时钟//InitializeboardInitBoard(OB_COLD //初始化I/OLEDTimer/*InitialzetheHALdriver //初始化各硬件模/*InitializeNVsystem Flash存储/*Initializetheoperatingsystem 化操作系/*Enableinterrupts 全部中//Finalboard 始化按#ifdefined(POWER_SAVING/*StartOSALNoReturnfromhere执行操作系统,进去后不会返return}我们大概看了上面的代码后,可能感觉很多函数不认识。没关系,代码很有条理性,开始先执行初始化工作。包括硬件、GATT、GAP层、任务等的初始化。然osal_start_system();操作系统。进去后可不会回来了。在这里,我们重点了解2个函数:初始化操作系统运行操作系**怎么看?在函数名上单击右键——gotodefinitionof…,便可以进入函数。1、我们先来看osal_init_system();系统初始化函数,进入函数。发现里面有6个图3.7终于到尽头了。这一下子代码更不熟悉了。不过我们可以发现,函数好像能在taskID这个变量上找到一定的规律。请看下面程序注释。图 voidosalInitTasks(void{uint8taskID=//分配内存,返回指向缓冲区的tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16) //设置所分配的内存空间单元值为osal_memset(tasksEvents,0,(sizeof(uint16) 务优先级由高向低依次排列,高优先级对应taskID的值反而/*HalTask/*HCITask#ifdefined(OSAL_CBTIMER_NUM_TASKS/*CallbackTimerTasksosal_CbTimerInit(taskIDtaskID+=/*GAPTask/*ProfilesGAPRole_Init(taskID++ /*ApplicationSimpleBLEPeripheral_Init(taskID //应用初始化,重45.第9-41行:BLE中各层的任务添加,越底层优先级越高第44行:用户任务初始化,用户可根据要求定制需要的功能我们可以这样理解,函数对taskID个东西进行初始化,每初始化一个,taskID++。TI公司协议栈已完成的东西。至此,osal_init_system();大概了解完毕。2再来看第二个函数osal_start_system();运行操作系统。同gotodefinition的方法进入该函数。再进入osal_run_system()图 osal_start_system()函图 * *** ThisfunctionwillmakeonepassthroughtheOSALtaskEvents andcallthetask_event_processor()functionforthefirsttask isfoundwithatleastoneeventpending.Ifthereareno events(alltasks),thisfunctionputstheprocessorinto** ** 翻译:这个是任务系统轮询的主要函数。他会查找发生的事件然后调用相应的事件执行函数。如果没有事件登记要发生,那么就进入睡眠模式。这个函数是不会返回的。voidosal_run_system(void{uint8idx=#ifndef//这里是在扫描哪个事件被触发了,然后置相应的标志doif //Taskishighestprioritythatis{ 得到待处理的最高优先级任务索引号 }while(++idx< if(idx {uint16halIntState_t //进入临界区,保events //提取需要处理的任务中的事件tasksEvents[idx]= //清除本次任务的事HAL_EXIT_CRITICAL_SECTION(intState);//退出临界activeTaskID=events=(tasksArr[idx])(idx,events);//通过指针调用任务处理函关 //进入临界区Addbackunprocessedeventstothecurrenttask.保存未处理的tasksEvents[idx]|=HAL_EXIT_CRITICAL_SECTION(intState);//退出临界 #ifdefined(POWER_SAVING //Completepassthroughalltaskeventswithno{ //Puttheprocessor/systeminto 58./*Yieldincasecooperativeschedulingisbeingused.#ifdefined(configUSE_PREEMPTION)&&(configUSE_PREEMPTION== 65.66.我们来关注一下events=tasksEvents[idx];tasksEvents[idx]数组定义,如下图,发现恰好在刚刚osalInitTasks(void)函数上面。而且taskID一一对应。这就是初始化与调用的关系。taskID把任务联系起来了。图 关于协议栈的介绍先到这里,其他会在以后的实例中结合程序来介绍,这样会更直观。大家可以根据需要再熟悉一下函数里面的内容。游一下这个代码的海洋。我们可以总结出一个协议栈简单的工作流程,如3.12所示。始始束协议栈简图 BLE栈的工作流协议栈的串口实验前言串口作为一种最简单的协议栈和调试者接口,在BLE的学习和应用过程中具有非常重要的作用。所以,在进行蓝牙无线发送之前,我们需要先学习在协议栈里加入串口功能。WeBeeCC2540BLE协议栈(BLE-CC254x-3CC2540串口发实验现象 WEBEE”给电脑串口调试助手打印出来。整个例程很简单,两步就能实现串口的发送,步骤如下1、串口初2、串口发送打开BLE下的:Projects\ble\SimpleBLEPeripheral\CC2540DB里面的SimpleBLEPeripheral.eww工程。这次试验我们直接基于协议栈的SimpleBLEPeripheral工程来进行的。经过上节的讲解,我们对工程有初步的了解,下面主要在图3.14第一步:串口初始化workspaceNPInpi.c图 npi.c文{//configure = = =uartConfig.flowControlThreshold= = = = = //start//Note:AssumesnoissueopeningUART 21.第7uartConfig.baudRate是配置波特率为NPI_UART_BR,进入NPI_UART_BR,可看到具体的波特率3.16115200gotodefinitionofHAL_UART_BR_115200选择其它设置:3.17注意:2根线的串口通讯(TTL电平模式)连接务必关流控,不然是收3.18option——C/C++CompilerPreprocessor3.19化;我们将在simpleBLEPeripheral.c文件中的初始化函数voidSimpleBLEPeripheral_Init(uint8task_id)中调用这个函数。找到voidSimpleBLEPeripheral_Init(uint8task_id),在里面中添加3.20第二步:串口发送码后面加入一条上电提示oWorld的语句。如图3.21所示: 图3.21"3.223.23CC2540至此,可通过调用NPI_WriteTransport(uint8*,uint16)实现串口发送功能串口接实验现象模块返回串口接收到的数据给电脑串口调试助手打印出来。整个实验在协议栈(B-C254-1.3.)中进行。实验讲解整个例程分为以下步骤: =的回调函数。在SimpleBLEPeripheral.c中传入以下串口回调函数:图3.24串口回调函3.25staticvoidNpiSerialCallback(uint8port,uint8events{uint8numBytes=uint8ifevents& //串口有数{numBytes { 18. /*UARTEvents #define #define #define #define #define注意:staticvoidNpiSerialCallbackuint8portuint8events需要图3.26回调函 运行3.27提示:TI的例程是利用LCD来输出信息的,我们没有LCD所以可以利用UART来输出信息。 找到HAL\Target\CC2540EB\Drivers\hal_lcd.c文件打开,并 NPI_WriteTransport3.28HalLcdWriteString3.29hal_lcd.c#include3.30#include"npi3.313.32协议栈的按键实验前言BLE协议栈中提供的按键驱动是针对TI不同的硬件平台的,在SimpleBLECentral5向摇杆按键,SimpleBLEPeripheralKeyFob硬件平台的按实现平台:WeBeeCC2540模块及功能底板实验现象按下S1或S2按键,串口返回对应的按键号。这个实验在协议栈(BLE-CC254x-1.3.2)中进行。实验讲解网蜂的按键驱动对用于工程中的CC2540_MINIDK平台,工程是通过宏定义来SimpleBLECentral首先我们要清楚SimpleBLECentralCC2540_MINIDK硬件平台的,如果直接在预编译中直接添加CC2540_MINIDK,则会把CC2540_MINIDK平打开Projects\ble\SimpleBLECentral\CC2540DB里面的SimpleBLECentral工程,先在预编译中加入网蜂平台的宏定义WEBEE_BOARD。3.34WEBEE_BOARDCC2540_MINIDKhal_key.c文件中按键的配置和操作,这里我们直接在hal_key.c文件中搜索CC2540_MINIDK来进行快速修改。3.353.36#ifdefined(CC2540_MINIDK#ifdefined(CC2540_MINIDK)||3.371图 按键修改第23hal_key.c254行,voidHalKeyConfig(boolinterruptEnable,halKeyCBack_tcback)3.3934hal_key.c312行,voidHalKeyConfig(boolinterruptEnable,halKeyCBack_tcback)3.4043.4153.4263.437(3.4489、第九处为hal_key.c文件582行,HAL_ISR_FUNCTION(P0INT_VECTOR图 按键修改第910hal_key.c595行,HAL_ISR_FUNCTION(halKeyPort0Isr,P0INT_VECTOR)3.461011hal_key.c610行,HAL_ISR_FUNCTION(halKeyPort2Isr,P2INT_VECTOR)3.4711SimpleBLECentral工程中会传递到SimpleBLECentral_ProcessEvent(uint8task_id,uint16events)中去。simpleBLECentral.cSimpleBLECentral_ProcessEvent(uint8task_id,uint16events)SYS_EVENT_MSG事件中的,所以再进入simpleBLECentral_ProcessOSAg((osal_event_hdr_t*)pMsg)函数中来3.483.49在simpleBLECentral_ProcessOSA g((osal_event_hdr_t*)pMsg)函数中终于看到了按键处理函数 *)pMsg)->state,((keyChange_t*)pMsg)->keys图 staticvoidsimpleBLECentral_HandleKeys(uint8shift,uint8keys),因为我们只有两个按键,所以修改成:staticvoidsimpleBLECentral_HandleKeys(uint8shift,uint8keys{ //Intentionallyunreferencedif(keys&HAL_KEY_SW_1{ //S1 if(keys&HAL_KEY_SW_2{ //S2 13.3.51SimpleBLEPeripheral同SimpleBLECentral工程一样先在预编译中加入网蜂平台的宏定义WEBEE_BOARD,hal_key.c文件已经在上部分修改好了,接下来主要是在SimpleBLEPeripheral工程中按键任务传递的处理过程的修改。打开Projects\ble\SimpleBLECentral\CC2540DB里面的SimpleBLECentral工程,找到SimpleBLEPeripheral.c文件下的按键处理程序:添们的平台#ifdefined(CC2540_MINIDK)||(WEBEE_BOARD3.52simpleBLEPeripheral_HandleKeysuint8shiftuint8keys在SimpleBLEPeripheral_Init(uint8task_id)中按键任务图3.53按键任中,传递过程可以参照SimpleBLECentral工程中的讲解。接下来我们直接进行修改,就不过多分析;修改staticvoidsimpleBLEPeripheral_ProcessOSAg(osal_event_hdr_t*pMsg)图 g(osal_event_hdr_t*pMsgstaticvoidsimpleBLEPeripheral_HandleKeysuint8shiftuint8keys图 simpleBLEPeripheral_HandleKeys(uint8shift,uint8keys至此SimpleBLEPeripheral工程修改完成,编译并打开打开串口调试3.56蓝牙无线数据传输入前言想要理解整个协议栈是比较难的,在这里通过TI提供的例程快速进行蓝牙数据的传输,对BLE有一个简单的了解。实现平台:WeBeeCC2540模块及功能底3.57CC2540实验现象两个模块建立连接并进行简单的数据传输,整个过程可通过串口观察到模块的连接状况和数据的变化。这个实验在协议栈(B-C254-1..)中进行。实验讲解整个实验用到两个模块,一个主机和一个从机,重点为下面两个步骤:1、建立连2、数据传输测试部分代码简析在实现数据传输之前我们简单介绍一下SimpleBLECentral 的SimpleBLEPeripheral.eww,可以看到一下工程结构:图3.58接下来主要关注以下几个函数图 3.60taskArr图 图 图 事件定SimpleBLEPeripheral_Inituint8task_idGAPGATT进行配置,最SimpleBLEPeripheral_ProcessEvent(uint8task_iduint16events包含对传递进staticvoid gaprole_States_tnewState图 (5)staticvoidsimpleProfileChangeCB(uint8paramID——simpleProfile特征值改变时的回调函数(simpleProfile在后面会介绍图 simpleProfileChangeCB(uint8paramID建立连voidSimpleBLEPeripheral_Init(uint8task_id,这里我们进3.66CC2540_MINIDKGAPRole_SetParameter(GAPROLE_ADVERT_ENABLED,sizeof(uint8),&initial_advertising_enable)进行设置。功能,直接看按键HAL_KEY_SW_2处理程序:3.67Peripheral图 广播状态切ifgapProfileStateGAPROLE_CONNECTED {uint8uint8if(current_adv_enabled_status==FALSE{new_adv_enabled_status= {new_adv_enabled_status= GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED,sizeof(uint8图3.69图 广播状态切2、CentralscanningandSimpleBLECentral工程中,同样是在voidSimpleBLECentral_Init(uint8task_idGAP和GATTTI的板,是通过按键来实现uint8keys)if(keys&HAL_KEY_UP{Startorstop {if(!simpleBLEScanning{simpleBLEScanRes= { simpleBLECharHdl!=0simpleBLEProcedureInProgress==FALSE 29.if(keys&HAL_KEY_LEFT{Displaydiscovery if(!simpleBLEScanning&&simpleBLEScanRes>0{//Incrementindexofcurrentresult(withif(simpleBLES

温馨提示

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

评论

0/150

提交评论