1 使用simple Link的库,同时提供了丰富的源码。只是只提供了IAR的代码,所以需要先安装和使用IAR for 8051.
IAR的产品相对和KEIl相比更新周期比较长,因此遇到的兼容问题少一些,不过也有一个问题,就是厂家器件库的更新慢一些。keil用PackInstaller。不过因为CC2541是一个比较生命周期长的产品,所以用老一些版本的IAR同样可以。就开发的角度,使用正版会获得更多的支持,因此开发阶段还是要支持正版的。毕竟TI已经提供了免费的开发栈了,这个是花费更多时间,而且会有助于通过蓝牙认证的。如果,希望了解工程结构,那么用试用版也是完全可以的,30天的使用版就可以的。
导入工程项目空间
其中有很多对应的范例,选择keyfob demo,这里就列出了全部的代码。
2 源码分析
2.1 蓝牙基础库
根据蓝牙4.1的协议,固化了PROFILES,以及对应的HAL硬件层的定义。其中加速度传感器的定义如下:
在前面的评测中,加速度的service写入1则启动x轴的传感器数据读取,写入0则关闭,
2.2 开发板的资源访问
开发板使用的传感器硬件是BMA250,还有BUZZ,都在APP部分中应用,
如buzz的硬件定义是GPIO的定义
void buzzerInit(void) { #if defined ( CC2540_MINIDK ) // Buzzer connected at P1_6 // We will use Timer 3 Channel 0 at alternate location 2 // Channel 0 will toggle on compare with 0 and counter will // count in up/down mode to T3CC0. PERCFG |= 0x20; // Timer 3 Alternate location 2 P1DIR |= 0x40; // P1_6 = output P1SEL |= 0x40; // Peripheral function on P1_6 T3CTL &= ~0x10; // Stop timer 3 (if it was running) T3CTL |= 0x04; // Clear timer 3 T3CTL &= ~0x08; // Disable Timer 3 overflow interrupts T3CTL |= 0x03; // Timer 3 mode = 3 - Up/Down T3CCTL0 &= ~0x40; // Disable channel 0 interrupts T3CCTL0 |= 0x04; // Ch0 mode = compare T3CCTL0 |= 0x10; // Ch0 output compare mode = toggle on compare #endif }
2.3 用户程序
主程序是启动了TI的实时操作系统,这样避免了常见的8051中的完全用loop轮询的访问方式,只要启动相应的任务就可以快速定义项目。
对应于蓝牙协议栈等,都可以隔离,直接访问API,自定义对应的UUID和services等。
int main(void) { /* Initialize hardware */ HAL_BOARD_INIT(); // Initialize board I/O InitBoard( OB_COLD ); /* Initialze the HAL driver */ HalDriverInit(); /* Initialize NV system */ osal_snv_init(); /* Initialize LL */ /* Initialize the operating system */ osal_init_system(); /* 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(); // No Return from here return 0; }
启动时钟后进入节能模式。
对应于线程的设定和主要的参数以及device Name等都是在keyfobdemo.c中定义,这个也是嵌入用户代码的位置。
对于理解蓝牙协议的运用方式,可以直接快速开发,进一步的了解可以仔细阅读提供的软件开发导则,里面有很多API和详细的参数说明。
3 在完成后,可以直接编译,就可以生成可执行文件HEX。
这次build中止,主要是因为在编译的过程中,代码超过了测试版的4k限制。使用30天测试版就可以顺利完成编译的过程。在output目录下生成hex文件