本篇博文最后修改时间: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
香瓜单片机之职场交流群:450154342
五、基础知识
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的电平取反一次。
因此,实验成功。