背景

手头有块CC2540开发板,TI比较老的片子,已经过渡到了CC2541,2540很早以前有做过项目,抽空把之前调试学习的重新整理下
如有异议,欢迎留言指正

概述

CC2540 2.4GHz低功耗的蓝牙片上方案,单模芯片,8051的CPU内核(外设寄存器配置和STC51单片机相似),256/128K FLASH和8kB RAM,BLE4.0可适用于小数据低功耗的通讯应用

特性:

  • 内核32Mhz 接收电流 19.6mA,发送电流(-6dBm)24mA
  • 3uS唤醒工作模式下功耗为235uA
  • 外部中断唤醒低功耗模式电流消耗0.4uA
  • 8051 CPU内核
  • 8Kb SRAM,可选的128Kb/256Kb 可编程Flash
  • 两路串口,8通道的12位ADC
  • 电压范围2V~3.6V
  • 21个通用IO口,19个IO支持4mA,其他两个IO支持20mA
  • 支持硬件AES

架构图

  • 可选的时钟源片外的高速32Mhz 低速32.768kHz
  • 可选的时钟源内的高速RC和低速32kHz
  • 硬件PIN脚与watcDog看门狗共同引入到RESET模块来实现复位
  • 射频模块通过Radio Arbiter仲裁器挂载到总线上
  • 休眠时钟与电源管理控制器进行关联
  • 下载器通过通过DEBUG接口实现对内核的调试

PIN脚图

开发工具

  • IAR For 8051 编译环境安装,下载地址
  • SDK协议栈安装,下载地址
  • CC Debugger下载器,用于程序下载调试


例程

  • 打开SDK安装目录,在BLE-CC254x-1.5.1.1\Project\ble文件目录下是官方提供的应用例程,选择SimpleBLEPeripheral作为第一个蓝牙应用测试用例
主函数main入口

main入口位于SimpleBLEPeripheral_Main.c文件中

int main(void)
{/* Initialize hardware */HAL_BOARD_INIT();//配置内核时钟16Mhz和低速32kHz低速时钟// Initialize board I/OInitBoard( OB_COLD );//初始化Demo板载IO外设(关闭LED)/* Initialze the HAL driver */HalDriverInit();//初始化驱动/* Initialize NV system */osal_snv_init();//NV系统初始化,初始化Flash/* Initialize LL *//* Initialize the operating system */osal_init_system();//初始化OSAL任务系统/* Enable interrupts */HAL_ENABLE_INTERRUPTS();//使能中断// Final board initializationInitBoard( OB_READY );//初始化按键#if defined ( POWER_SAVING )//低功耗,需要使能宏osal_pwrmgr_device( PWRMGR_BATTERY );#endif/* Start OSAL */osal_start_system(); // 进入任务return 0;
}
蓝牙参数修改

BLE参数配置位于simpleBLEPeripheral.c

  • 修改广播间隔,单位0.625ms,即广播周期为100ms
// What is the advertising interval when device is discoverable (units of 625us, 160=100ms)
#define DEFAULT_ADVERTISING_INTERVAL          160
  • 修改连接间隔
// Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL     80
// Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL     80
  • 断连的超时检测
// Slave latency to use if automatic parameter update request is enabled
#define DEFAULT_DESIRED_SLAVE_LATENCY         0
// Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_CONN_TIMEOUT          1000
  • 修改广播名称,可在数据结构scanRspData修改,也可以手动在advertData手动修改广播报文数据
// GAP - SCAN RSP data (max size = 31 bytes)
static uint8 scanRspData[] =
{// complete name0x14,   // length of this data 长度GAP_ADTYPE_LOCAL_NAME_COMPLETE,0x53,   // 'S'0x69,   // 'i'0x6d,   // 'm'0x70,   // 'p'0x6c,   // 'l'0x65,   // 'e'0x42,   // 'B'0x4c,   // 'L'0x45,   // 'E'0x50,   // 'P'0x65,   // 'e'0x72,   // 'r'0x69,   // 'i'0x70,   // 'p'0x68,   // 'h'0x65,   // 'e'0x72,   // 'r'0x61,   // 'a'0x6c,   // 'l'// connection interval range0x05,   // length of this dataGAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),   // 100msHI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),   // 1sHI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),// Tx power level0x02,   // length of this dataGAP_ADTYPE_POWER_LEVEL,0       // 0dBm
};
应用

主任务位于OSAL_SimpleBLEPeripheral.c中,基于OSAL模型进行任务调度

任务表单:被周期性循环执行,task0~task10属于蓝牙协议栈的处理,部分已经被封装到ble静态库中,任务10是Ble的对外供开发可修改的应用任务处理,可以对事件触发进行处理,开发中也可以自定义增加事件任务

// The order in this table must be identical to the task initialization calls below in osalInitTask.
const pTaskEventHandlerFn tasksArr[] =
{LL_ProcessEvent,                                                  // task 0Hal_ProcessEvent,                                                 // task 1HCI_ProcessEvent,                                                 // task 2
#if defined ( OSAL_CBTIMER_NUM_TASKS )OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent ),           // task 3
#endifL2CAP_ProcessEvent,                                               // task 4GAP_ProcessEvent,                                                 // task 5SM_ProcessEvent,                                                  // task 6GATT_ProcessEvent,                                                // task 7GAPRole_ProcessEvent,                                             // task 8GAPBondMgr_ProcessEvent,                                          // task 9GATTServApp_ProcessEvent,                                         // task 10SimpleBLEPeripheral_ProcessEvent                                  // task 11
};

程序烧录
打开nRF Connect手机APP,进行扫描可搜索到广播名称为SimpleBLEPeripheral,点击连接可查看支持的服务

总结

OSAL属于模拟的任务系统,不存在真正的高优先级任务对低优先级的抢占中的PSP压栈,所以自定义的任务中如果存在较长时间的堵塞则会影响蓝牙协议栈的正常运行

CC2540蓝牙开发一BLE例程相关推荐

  1. iOS蓝牙开发---CoreBluetooth[BLE 4.0] 初级篇[内附Demo地址]

    一.蓝牙基础知识 (一)常见简称 1.MFI  make for ipad ,iphone, itouch 专们为苹果设备制作的设备,开发使用ExternalAccessory 框架(认证流程貌似挺复 ...

  2. android低耗能蓝牙开发,Android BLE低功耗蓝牙开发

    最近做了一个智能硬件开发(针灸仪)的项目,有一部分涉及到低功耗蓝牙的开发,就是通过蓝牙和设备进行数据的交互,比如控制改设备的LED的开关,设备的开关机,设置设备的时间和温度等,下面就项目中遇到的坑一一 ...

  3. 使用C#进行蓝牙开发-接收BLE广播

    使用BluetoothLEAdvertisementWatcher类来接收附近的蓝牙广播,这个是UWP的类,关于如何在WPF或者命令行程序中使用这个类,随便一搜就有了,很简单,.NET6之后简单设置一 ...

  4. Android蓝牙开发 — 经典蓝牙BLE蓝牙

    一,前期基础知识储备 1)蓝牙是一种支持设备之间短距离通信的无线电技术(其他还包括红外,WIFI): 支持移动电话.笔记本电脑.无线耳机等设备之间进行信息的交换: Android支持的蓝牙协议栈:Bl ...

  5. android pin码 经典蓝牙_Android蓝牙开发—经典蓝牙详细开发流程

    Android蓝牙开发-经典蓝牙详细开发流程 发布时间:2018-07-16 13:41, 浏览次数:637 , 标签: Android Android蓝牙开发前,首先要区分是经典蓝牙开发还是BLE( ...

  6. CC2540蓝牙协议栈开发简介

    本系列教程将结合TI推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程.教程共分为六部分,本文为第三部分: 第三部分知识点: 第十一节 串口通信 ...

  7. java 蓝牙4.0_《蓝牙4.0 BLE开发完全手册---物联网开发技术实战

    图书目录: 第1章 蓝牙4.0 BLE简介 1.1 无线网络数据传输协议对比 1.2 短距离无线网络的分类 1.2.1 什么是蓝牙4.0 BLE 1.2.2 蓝牙4.0 BLE的特点 1.3 蓝牙4. ...

  8. iOS开发 之 可穿戴设备 蓝牙4.0 BLE 开发

    1 前言 当前有越来越多的可穿戴设备使用了蓝牙4.0 BLE(Bluetooth Low Energy).对于iOS开发而言,Apple之前专门推出CoreBluetooth的Framework来支持 ...

  9. Android ble covana,Android BLE低功耗蓝牙开发

    最近做了一个智能硬件开发(针灸仪)的项目,有一部分涉及到低功耗蓝牙的开发,就是通过蓝牙和设备进行数据的交互,比如控制改设备的LED的开关,设备的开关机,设置设备的时间和温度等,下面就项目中遇到的坑一一 ...

  10. Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别

    找到一篇介紹BT与BLE使用差别的文章, 写的很清晰,看完基本明白了 ----------------------------------------------------------------- ...

最新文章

  1. 对称加密算法之DES介绍
  2. 二、SpringMVC的常用注解——1-@Controller
  3. CoreLocation MKMapView
  4. 架构师成长之路:如何提升技术掌控力?
  5. 网络爬虫--12.【XPath实战】获取百度贴吧中的图片
  6. round - 精确的几位小数
  7. PyTorch 学习笔记(一):让PyTorch读取你的数据集
  8. @ARGV:perl命令行参数
  9. ASM磁盘的添加与删除
  10. list类型的extend与append方法
  11. 微服务实战(六):选择微服务部署策略 - DockOne.io
  12. win7 ie11版本安装报此更新不适用于计算机问题
  13. 企业管理小故事【有问题4个管理小法则】
  14. 蓝牙耳机连接笔记本电脑音量直接爆棚
  15. dc是什么游戏的简称_游戏缩写简称
  16. 多智能体协同控制(从零开始)(一)
  17. 台达PLC与单片机的通讯
  18. 如何阅读一个前向推理框架?以NCNN为例
  19. HPE BL460c 配置536 FLB网卡VMware Esxi 6.0开启FCOE功能方法
  20. (个人笔记-无用勿喷)Windows软件包的安装与卸载

热门文章

  1. python爬取文件内容_python爬取各类文档方法归类汇总
  2. html网页如何将文字排版,网页中的文字怎么去进行排版
  3. oracle去空格和换行,ORACLE 中去回车、空格、TAB的函数
  4. Markdown基本语法(摘录)
  5. linux 儒略日时间计算,C/C++ 儒略日计算以及恒星时计算
  6. 快速了解Spyder
  7. 【知识地图】开发测试全栈 (未完待续)
  8. python垃圾分类游戏_垃圾分类就要来了?教你使用Python轻松完成垃圾分类
  9. Python RPM包制作
  10. MacBook 右键查询英文查词无法翻译成中文