This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

【CC2541 评测】CC2541 迷你开发套件使用心得分享+使用IAR 评测和源码分析+by 北方.

Other Parts Discussed in Thread: CC2541

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