微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(1)

由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(1)

时间:07-13 来源:互联网 点击:

P1.1和P1.0两个IO口,为了不影响其他引脚的使用,我们这里巧妙使用与或控制其功能。比如:P1 = (P1 & 0XFC) | 0X01; P1与上1111 1100,这样不影响其他引脚的基础上,清除了P1.0和P1.1的输出,再或上0X01,这样将P1.0设置为高电平,根据原理图,高电平是点亮LED2.

  第四节 控制LED

  上一节点亮了单个LED灯,我们这堂课接着控制LED灯。这堂课我们要完成的是LED闪烁10次,蜂鸣器响1s钟。这里我们先使用延时函数进行。

  我们的程序一定要做到结构清晰,可移植性强,阅读性高。程序设计不仅仅是实现了功能,如果那样的代码,那只有你自己可以看懂,是一手垃圾。真正的漂亮代码具有阅读性高、可移植性强、代码规范性好。

  delay.h:

  #ifndef __DELAY_H__

  #define __DELAY_H__

  extern void Delay1ms(unsigned int uiDelay);

  #endif

  /* end file */ 

  延时函数的执行程序delay.c:

  #include "delay.h"

  void Delay1ms(unsigned int uiDelay)

  {

  unsigned int i;

  for ( ; uiDelay > 0; uiDelay--)

  {

  /* 大约延时1ms */

  for (i = 0; i <320; i++);

  }

  }

  /* end file */

  主函数其实也很简单:

  int main(void)

  {

  /* 控制LED灯闪烁 */

  unsigned char i;

  /* 驱动无源蜂鸣器 */

  unsigned int j;

  /* 将P1.0、P1.1设置为IO口 */

  P1SEL &= ~0x03;

  /* 将P1.0、P1.1设置为IO口的输出 */

  P1DIR |= 0x03;

  /* 将P2.0设置为IO口 */

  P2SEL &= ~0x01;

  /* 将P2.0设置为IO口输出 */

  P2DIR |= 0x01;

  /* 主循环 */

  while(1)

  {

  /* LED1,LED2闪烁10次 */

  for (i = 0; i <10; i++)

  {

  /* P1.0----LED2,P1.1----LED1 */

  /* P1.0,P1.1输出高电平,即点亮LED2,LED1 */

  /* FC : 1111 1100*/

  P1 = (P1 & 0xFC) | 0x03;

  Delay1ms(1000);

  /* P1.0,P1.1输出低电平,即熄灭LED2,LED1 */

  /* FC : 1111 1100*/

  P1 = (P1 & 0xFC) & (~0x03);

  Delay1ms(1000);

  }

  /* 给出500HZ的方波驱动 */

  for(j = 0; j <1000; j++)

  {

  /* P2.0----蜂鸣器 */

  P2 = (P2 & 0xFE) & (~0x01);

  Delay1ms(1);

  P2 = (P2 & 0xFE) | 0x01;

  Delay1ms(1);

  }

  }

  }

  /* end file */

  这里需要注意的是,MT254X蓝牙4.0开发板使用的无源蜂鸣器,那么我们需要产生一个方波来驱动。如这代码:

  /* 给出500HZ的方波驱动 */

  for(j = 0; j <1000; j++)

  {

  /* P2.0----蜂鸣器 */

  P2 = (P2 & 0xFE) & (~0x01);

  Delay1ms(1);

  P2 = (P2 & 0xFE) | 0x01;

  Delay1ms(1);

  }

  

  如果是有缘蜂鸣器,则没有那么麻烦,直接给出低电平驱动。为什么是低电平,我们看下原理图:

  使用的PNP三极管,并且使用续流二极管保护蜂鸣器。

  第五节 LCD12864显示

  上一节我们成功控制了LED和蜂鸣器,这一节我们马不停蹄接着LCD12864的控制。

  为了系统能够稳定的工作,首先我们将系统时钟切换到32M的外部晶振,为了自由配置所需要的时钟,主要借助于CLKCONCMD.OSC选择系统主时钟,而借助于CLKCONCMD.OSC32K则用于选择芯片32K时钟源!而低功耗模式设置时,需要借助于SLEEPCMD寄存器,在《CC253x- CC2540-41Applications User‘s Guide.pdf>中并没有说明SLEEPCMD第二位功能,如下所示:

  但是参考cc2430芯片的说明书可以发现,对应的SLEEP寄存器则有说明,如下所示,这个是TI有意隐藏芯片细节,当SLEEPCMD.OSC_PD为0时,32MHz晶振与16MHz RC振荡器都会起振:

  对于SLEEPSTA寄存器中BIT6/BIT5说明在cc2530说明书中也并没有说明,可以参考cc2430说明书中内容,其中第6位 XOSC_STB表明外部高速32M晶振是否上电并稳定起振,当稳定时该位为1;同样对于第5位HFRC_STB则表明内部16MHz高速RC振荡器是否起振,并是否稳定,当16MHz RC振荡器稳定时该位为1。

  void SysStartXOSC(void)

  {

  SLEEPCMD &= ~0x04; // 启动所有晶振

  while (!(SLEEPSTA & 0x40)); // 等待晶振稳定

  CLKCONCMD = (CLKCONCMD & 0x80) | 0x49; // 使用16M晶振作为主时钟

  while ((CLKCONSTA & ~0x80) != 0x49 ); // 等待主时钟切换到16M晶振

  CLKCONCMD = (CLKCONCMD & ~0x80) ; // 使用外部32K晶振作为休眠时钟

while ( (CLKCONSTA & 0x80) != 0 )

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top