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

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

时间:07-18 来源:本站整理 点击:

  

  本系列教程将结合TI推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程。教程共分为六部分,本文为第二部分:
      

  第二部分知识点:

  第六节 独立按键之查询方式

  第七节 独立按键之中断方式

  第八节 CC254x内部温度传感器温度采集

  第九节 五向按键

  第十节 蜂鸣器
 

  有关TI 的CC254x芯片介绍,可点击下面链接查看:

  主流蓝牙BLE控制芯片详解(1):TI CC2540
 

  同系列资料推荐:
 

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

  有关本文的工具下载,大家可以到以下这个地址:

  朱兆祺ForARM

  第六节 独立按键之查询方式

  在MT254xboard上有一个独立按键KEY1,如图 ,独立按键和复位键在整个班子的左上角。按键通过P0.0口和CPU连接,在没有按键时为高电平,按下后为低电平。下面我们通过LCD来显示独立按键的状态。

  其对应的原理图如下:

  我们先用查询的方式读取按键的状态。因为按键接入在P0.0口,所以我们读取P0.0口的电平即可知道按键的状态。

  uint8 KeyValue(void) // 读取按键状态

  {

  if((P0&0X01) == 0X00 ) // 按下为低电平

  {

  return KEY_DOWN;

  }

  else

  {

  return KEY_UP;

  }

  }

  这里我们在while循环中不断的读取按键状态,并且判断是否改变,如果改变则改变LCD的显示。

  int main(void)

  {

  uint8 OldKeyValue = 0;

  uint8 NewKeyValue = 0;

  SysStartXOSC();

  LCD12864_Init();

  LCD12864_DisStr(1, " Key Test");

  // 按键初始化

  P0SEL &= ~0X01; // 设置为 IO功能

  P0DIR &= ~0X01; // 设置为输入功能

  while(1)

  {

  NewKeyValue = KeyValue(); // 读取按键状态

  if(OldKeyValue != NewKeyValue) // 按键状态改变

  {

  OldKeyValue = NewKeyValue; // 保存当前按键状态

  if(OldKeyValue == KEY_DOWN)

  {

  LCD12864_DisStr(3, " Key Down ");

  }

  else

  {

  LCD12864_DisStr(3, " Key Up ");

  }

  }

  }

  return 0;

  }

  运行程序,效果如图所示:

  第七节 独立按键之中断方式

  复制Key工程,重命名为KeyInterrupt。刚刚我们用查询的方式读取按键的状态。但是这种方式在实际的工程中没有实际的应用价值,下面我们采用外部中断的方式来读取按键的状态,每当按键按下时就会触发一次外部中断。为了P0.0口能够触发中断,我们需要进行如下配置:

  P0IEN |= 0X01; // P00 设置为中断方式

  PICTL &=~ 0X01; // 下降沿触发

  IEN1 |= 0X20; // 允许P0口中断

  P0IFG = 0x00; // 清除中断标志位

  EA = 1; // 开总中断

  然后就需要编写中断服务函数了。这里注意一点,在IAR中的中断函数有点特殊,格式为:

  #pragma vector = 中断向量

  __interrupt 函数

  所以我们的中断函数为:

  #pragma vector = P0INT_VECTOR

  __interrupt void P0_ISR(void)

  {

  if(0x01&P0IFG)

  {

  NewKeyValue = KEY_DOWN; // 记录按键按下

  }

  P0IFG = 0; //清中断标志

  P0IF = 0; //清中断标志

  }

  在中断中我们记录按键按下,等待应用程序处理。而在主函数中我们需要处理按键按下事件,主函数中我们对按键计数并且通过LCD显示。

  int main(void)

  {

  char LCDBuf[21]={0}; // 显存

  int KeyCnt = 0;

  SysStartXOSC();

  LCD12864_Init();

  LCD12864_DisStr(1, " Key Test");

  P0SEL &= ~0X01; // 设置为IO功能

  P0DIR &= ~0X01; // 设置为输入功能

  P0IEN |= 0X01; // P0.0 设置为中断方式

  PICTL |= 0X01; // 下降沿触发

  IEN1 |= 0X20; // 允许P0口中断

  P0IFG = 0x00; // 清除中断标志位

  EA = 1; // 开总中断

  sprintf(LCDBuf, " Key Count : %d", KeyCnt++); // 按键计数

  LCD12864_DisStr(3, LCDBuf);

  while(1)

  {

  if(KEY_DOWN == NewKeyValue) // 按键按下

  {

  SoftWaitUs(25000); // 延时防抖

  if((P0&0X01) == 0X00) // 再次确认按键是否按下

  {

  sprintf(LCDBuf, " Key Count : %d", KeyCnt++); // 按键计数

  LCD12864_DisStr(3, LCDBuf);

  }

  else

  {

  NewKeyValue = KEY_UP; // 按键松开

  }

  }

  }

  return 0;

  }

  每按一次按键计数加1,效果如图所示:


 

  第八节 CC254x内部温度

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

网站地图

Top