背景
手头有块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脚图
开发工具
例程
- 打开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/O
InitBoard( 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 initialization
InitBoard( 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 name
0x14, // 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 range
0x05, // length of this data
GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), // 100ms
HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),
LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), // 1s
HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),
// Tx power level
0x02, // length of this data
GAP_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 0
Hal_ProcessEvent, // task 1
HCI_ProcessEvent, // task 2
#if defined ( OSAL_CBTIMER_NUM_TASKS )
OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent ), // task 3
#endif
L2CAP_ProcessEvent, // task 4
GAP_ProcessEvent, // task 5
SM_ProcessEvent, // task 6
GATT_ProcessEvent, // task 7
GAPRole_ProcessEvent, // task 8
GAPBondMgr_ProcessEvent, // task 9
GATTServApp_ProcessEvent, // task 10
SimpleBLEPeripheral_ProcessEvent // task 11
};
程序烧录
打开nRF Connect手机APP,进行扫描可搜索到广播名称为SimpleBLEPeripheral,点击连接可查看支持的服务
总结
OSAL属于模拟的任务系统,不存在真正的高优先级任务对低优先级的抢*的PSP压栈,所以自定义的任务中如果存在较长时间的堵塞则会影响蓝牙协议栈的正常运行