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文件