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

    xiaoxiao2026-08-11  14

    本篇博文最后修改时间: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.csdn.net/feilusia/article/details/52221525 2、在进行本文步骤前,请先 实现以下博文: 1)《CC2640之LED》:http://blog.csdn.net/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的电平取反一次。

    因此,实验成功。

    转载请注明原文地址: https://ju.6miu.com/read-1311062.html
    最新回复(0)