【BLE-CC2640】CC2640之自定义按键

本篇博文最后修改时间:2017年06月02日,17:47。


一、简介

本文简介如何在simpleBLEperipheral工程中使用香瓜自己写的按键驱动。

注:香瓜为了方便按键测试,本文使用开发板上DOWN键对应的DIO_12来举例,也可自行更换IO口。


二、实验平台

协议栈版本:ble_cc26xx_2_01_00_44423

编译软件:IAR Embedded Workbench for ARM Version 7.40

硬件平台:CC26xxDK开发板

仿真器:XDS100V3(香瓜)


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
香瓜单片机之Linux群:512598061
香瓜单片机之职场交流群:450154342
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
1)《CC2640之按键》:http://blog.youkuaiyun.com/feilusia/article/details/52221525

2、在进行本文步骤前,请先 实现以下博文:
1)《CC2640之LED》:http://blog.youkuaiyun.com/feilusia/article/details/52217925


五、基础知识

1、自定义驱动与协议栈驱动有什么区别?

答:结果上没有区别,而自定义驱动更方便移植、更方便修改IO口或新增按键。


2、自定义按键驱动是否与协议栈驱动存在冲突?

答:不冲突,前提是不要两个驱动都用同一个IO口。


六、实验步骤

1、编写并添加自定义的按键驱动

1)写一个按键驱动GUA_Key.c(存放在“……\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application\GUA”路径下)

//******************************************************************************        
//name:         GUA_Key.c        
//introduce:    香瓜自定义的按键驱动   
//author:       甜甜的大香瓜      
//email:        897503845@qq.com   
//QQ group      香瓜BLE之CC2640(557278427) 
//changetime:   2016.08.16 
//******************************************************************************
#include <stdbool.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/family/arm/m3/Hwi.h>
#include <ti/sysbios/knl/Semaphore.h>
#include <ti/sysbios/knl/Queue.h>
#include <ti/drivers/pin/PINCC26XX.h>

#ifdef USE_ICALL
#include <ICall.h>
#endif
   
#include <inc/hw_ints.h>
#include "bcomdef.h"
#include "util.h"
#include "Board.h"

#include "GUA_Key.h"

/*********************宏定义************************/
#define GUA_KEY_IO                    IOID_12                   

/*********************内部函数************************/
static void GUA_keyChangeHandler(UArg a0);
static void GUA_keyCallback(PIN_Handle hPin, PIN_Id pinId);
/*********************内部变量************************/
//键值
static uint8_t GUA_keysPressed;

//按键消抖时钟
static Clock_Struct GUA_keyChangeClock;

//对应应用层回调函数的函数指针
GUA_keysPressedCB_t GUA_appKeyChangeHandler = NULL;

//IO配置需要的数组
PIN_Config GUA_keyPinsCfg[] =
{
    GUA_KEY_IO  | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,
    PIN_TERMINATE
};

//IO状态结构体
PIN_State  GUA_keyPins;

//IO句柄结构体
PIN_Handle GUA_hKeyPins;

//******************************************************************************          
//name:             GUA_initKeys         
//introduce:        香瓜按键驱动的初始化函数        
//parameter:        GUA_appKeyCB:应用层的按键处理函数                
//return:           none       
//author:           甜甜的大香瓜               
//email:            897503845@qq.com   
//QQ group          香瓜BLE之CC2640(557278427)                
//changetime:       2016.08.16                   
//****************************************************************************** 
void GUA_initKeys(GUA_keysPressedCB_t GUA_appKeyCB)
{
  //初始化按键的IO
  GUA_hKeyPins = PIN_open(&GUA_keyPins, GUA_keyPinsCfg);
  
  //注册回调函数
  PIN_registerIntCb(GUA_hKeyPins, GUA_keyCallback);

  //修改成双沿中断触发,以避免睡眠之后中断不灵  
  PIN_setConfig(GUA_hKeyPins, PIN_BM_IRQ, GUA_KEY_IO  | PIN_IRQ_BOTHEDGES);

  //低功耗下的配置
#ifdef POWER_SAVING
  PIN_setConfig(GUA_hKeyPins, PINCC26XX_BM_WAKEUP, GUA_KEY_IO | PINCC26XX_WAKEUP_NEGEDGE);
#endif
  
  //初始化按键定时事件
  Util_constructClock(&GUA_keyChangeClock, GUA_keyChangeHandler,
                      GUA_KEY_DEBOUNCE_TIMEOUT, 0, false, 0);

  //保存应用层的函数指针
  GUA_appKeyChangeHandler = GUA_appKeyCB;
}

//******************************************************************************          
//name:             GUA_keyCallback         
//introduce:        香瓜按键驱动的回调函数       
//parameter:        hPin:按键句柄
//                  pinId:按键ID
//return:           none       
//author:           甜甜的大香瓜               
//email:            897503845@qq.com   
//QQ group          香瓜BLE之CC2640(557278427)                
//changetime:       2016.08.16                   
//****************************************************************************** 
static void GUA_keyCallback(PIN_Handle hPin, PIN_Id pinId)
{
  //清除键值
  GUA_keysPressed = 0;

  //判断按键是否按下
  if ( PIN_getInputValue(GUA_KEY_IO) == 0 )
  {
    //保存键值
    GUA_keysPressed |= GUA_KEY_VALUE;
  }

  //启动定时器进行消抖
  Util_startClock(&GUA_keyChangeClock);
}

//******************************************************************************          
//name:             GUA_keyChangeHandler         
//introduce:        香瓜按键驱动的消抖处理函数       
//parameter:        hPin:按键句柄
//                  pinId:按键ID
//return:           none       
//author:           甜甜的大香瓜               
//email:            897503845@qq.com   
//QQ group          香瓜BLE之CC2640(557278427)                
//changetime:       2016.08.16                   
//****************************************************************************** 
static void GUA_keyChangeHandler(UArg a0)
{
  //清除键值
  GUA_keysPressed = 0; 
  
  //判断是否有注册
  if (GUA_appKeyChangeHandler != NULL)
  {
    //消抖
    if ( PIN_getInputValue(GUA_KEY_IO) == 0 )
    {
      GUA_keysPressed |= GUA_KEY_VALUE;
    } 
    
    //调用按键应用层处理函数
    (*GUA_appKeyChangeHandler)(GUA_keysPressed);
  }
}

2)写一个按键驱动头文件GUA_Key.h(存放在“……\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application\GUA”路径下)

//******************************************************************************        
//name:         GUA_Key.h        
//introduce:    香瓜自定义的按键驱动头文件    
//author:       甜甜的大香瓜      
//email:        897503845@qq.com   
//QQ group      香瓜BLE之CC2640(557278427) 
//changetime:   2016.08.16 
//******************************************************************************
#ifndef _GUA_KEY_H_
#define _GUA_KEY_H_

/*********************宏定义************************/
#define GUA_KEY_VALUE                   0x0001
#define GUA_KEY_DEBOUNCE_TIMEOUT        20

/*********************外部函数************************/
typedef void (*GUA_keysPressedCB_t)(uint8 GUA_keysPressed);
void GUA_initKeys(GUA_keysPressedCB_t GUA_appKeyCB);

#endif

3)工程中添加GUA_Key.c和GUA_Key.h



4)在IAR设置中添加按键驱动源文件路径

$PROJ_DIR$/../../../Source/Application/GUA  

2、应用层调用(simpleBLEperipheral.c中)

1)添加头文件

//GUA
#include "GUA_Key.h"    
//GUA 

2)写一个应用层的按键处理函数

//******************************************************************************          
//name:             GUA_HandleKeys         
//introduce:        应用层按键处理函数        
//parameter:        GUA_keys:键值                
//return:           none       
//author:           甜甜的大香瓜               
//email:            897503845@qq.com   
//QQ group          香瓜BLE之CC2640(557278427)                
//changetime:       2016.08.16                   
//****************************************************************************** 
static void GUA_HandleKeys(uint8 GUA_keys)    
{    
  //香瓜按键  
  if ( GUA_keys & GUA_KEY_VALUE )   
  {      
    GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE);        //LED1反转一次   
  }    
}    

3)写一个应用层的按键处理函数的声明

static void GUA_HandleKeys(uint8 GUA_keys);

4)初始化按键(SimpleBLEPeripheral_init函数中)

  //初始化按键  
  GUA_initKeys(GUA_HandleKeys); 

七、注意事项

暂无


八、实验结果

仿真、设置断点,可以发现按键按下、松开都会进入GUA_HandleKeys函数,但按键按下时有固定键值、而松开时键值是0,因此不会造成按键按下、松开执行两次处理代码。

实测多次按下DOWN按键,都能将LED1的电平取反一次。

因此,实验成功。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜甜的大香瓜

谢谢你的支持^_^

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值