【BLE-CC2640】CC2640之按键
来源:互联网 发布:mac有安卓模拟器吗 编辑:程序博客网 时间:2024/05/21 10:39
本篇博文最后修改时间:2016年09月15日,14:07。
一、简介
本文简介如何在simpleBLEperipheral工程中使用协议栈自带的按键驱动。
二、实验平台
协议栈版本: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
五、基础知识
1、协议栈的按键驱动是否能直接拿来使用?
答:可以,但是不好用。不好用在于按键反应过慢、无按键消抖、按键按下及松开会执行两次按键操作。需要如下文中做些驱动修改。
2、按键代码的执行流程是如何的?
答:
1)应用层simpleBLEperipheral.c中调用按键初始化函数Board_initKeys,并传入应用层的按键处理函数入口。
2)当硬件检测到按键时,会上报键值至board_key.c中的Board_keyCallback按键回调函数。并开启一个定时器来消抖。
3)消抖时间到,则执行board_key.c中的Board_keyChangeHandler函数。并将键值传给应用的按键处理函数(初始化时注册时传入的函数)。
六、硬件原理图
由上面的两张图可知:
1、按键按下为低电平。
2、
B_BTN_SELECT——DIO_11
B_BTN_LEFT——DIO_15
B_BTN_RIGHT——DIO_18
B_BTN_UP——DIO_19
B_BTN_DOWN——DIO_12
注:SFM16是拨码开关。
七、实验步骤
1、工程中添加协议栈的按键驱动(驱动路径在“……\ble_cc26xx_2_01_00_44423\Projects\ble\common\cc26xx”)
2、修改按键驱动与驱动头文件
1)修改按键的边沿触发方式(board_key.c中的Board_initKeys函数中)
// PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_SELECT | PIN_IRQ_NEGEDGE);// PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_UP | PIN_IRQ_NEGEDGE);// PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_DOWN | PIN_IRQ_NEGEDGE);// PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_LEFT | PIN_IRQ_NEGEDGE);// PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_RIGHT | PIN_IRQ_NEGEDGE); //修改成双沿中断触发,以避免睡眠之后中断不灵 PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_SELECT | PIN_IRQ_BOTHEDGES); PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_UP | PIN_IRQ_BOTHEDGES); PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_DOWN | PIN_IRQ_BOTHEDGES); PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_LEFT | PIN_IRQ_BOTHEDGES); PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_KEY_RIGHT | PIN_IRQ_BOTHEDGES);此处为阿莫建议修改的,香瓜未验证,且先修改。
2)修改消抖后的按键函数(board_key.c中的Board_keyChangeHandler函数)
static void Board_keyChangeHandler(UArg a0){ keysPressed = 0; //判断是否有注册 if (appKeyChangeHandler != NULL) { //消抖 if ( PIN_getInputValue(Board_KEY_SELECT) == 0 ) { keysPressed |= KEY_SELECT; } if ( PIN_getInputValue(Board_KEY_UP) == 0 ) { keysPressed |= KEY_UP; } if ( PIN_getInputValue(Board_KEY_DOWN) == 0 ) { keysPressed |= KEY_DOWN; } if ( PIN_getInputValue(Board_KEY_LEFT) == 0 ) { keysPressed |= KEY_LEFT; } if ( PIN_getInputValue(Board_KEY_RIGHT) == 0 ) { keysPressed |= KEY_RIGHT; } //调用按键应用层处理函数 (*appKeyChangeHandler)(keysPressed); }}协议栈默认没有再判断一次按键电平,达不到消抖的作用。因此做上述修改,增加消抖部分的代码。
3)修改消抖时长(board_key.h中)
// Debounce timeout in milliseconds#define KEY_DEBOUNCE_TIMEOUT 20//200按键消抖一般是20ms,协议栈默认用的200ms会有明显延时。
3、应用层调用(simpleBLEperipheral.c中)
1)确保添加了头文件
#include "board_key.h"该工程默认是添加的,检查一下即可。
2)写一个应用层的按键处理函数
static void GUA_HandleKeys(uint8 keys) { //SELECT键 if ( keys & KEY_SELECT ) { GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE); //LED1反转一次 } //UP键 if ( keys & KEY_UP ) { GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE); //LED1反转一次 } //DOWN键 if ( keys & KEY_DOWN ) { GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE); //LED1反转一次 } //LEFT键 if ( keys & KEY_LEFT ) { GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE); //LED1反转一次 } //RIGHT键 if ( keys & KEY_RIGHT ) { GUA_Led_Set(HAL_LED_1, HAL_LED_MODE_TOGGLE); //LED1反转一次 } }
3)写一个应用层的按键处理函数的声明
//GUAstatic void GUA_HandleKeys(uint8 keys);
4)初始化按键(SimpleBLEPeripheral_init函数中)
//初始化按键 Board_initKeys(GUA_HandleKeys);
八、注意事项
暂无
九、实验结果
仿真、设置断点,可以发现按键按下、松开都会进入GUA_HandleKeys函数,但按键按下时有固定键值、而松开时键值是0,因此不会造成按键按下、松开执行两次处理代码。
实测为分别按5个按键,都能将LED1的电平取反一次。
因此,实验成功。
- 【BLE-CC2640】CC2640之按键
- 【BLE-CC2640】CC2640之自定义按键
- 【BLE-CC2640】CC2640之LED
- 【BLE-CC2640】CC2640之串口
- 【BLE-CC2640】CC2640之RTC
- 【BLE-CC2640】CC2640之OLED
- 【BLE-CC2640】CC2640之bootloader
- 【BLE-CC2640】CC2640之SNV
- [BLE]CC2640之ANCS
- 【BLE-CC2640】CC2640之快速入门
- 【BLE-CC2640】CC2640之添加自定义服务
- 【BLE-CC2640】CC2640之自定义周期事件
- 【BLE-CC2640】CC2640之配对与绑定
- 【BLE-CC2640】CC2640之修改发射功率
- 【BLE-CC2640】CC2640之广播MAC
- 【BLE-CC2640】CC2640之连接时广播
- 【BLE-CC2640】CC2640之使用自定义128bit的UUID
- 【BLE-CC2640】CC2640之数据加密与解密
- android 应用自动升级安装并打开新版本应用
- java SSM 框架 多数据源 代码生成器
- 关于 iOS自定义转场动画
- String 转 java.sql.Timestamp 异常详解
- Linux学习目录
- 【BLE-CC2640】CC2640之按键
- Android的位深
- 点击控件 让ListView或者ScrollView 返回到顶部
- 下载的谷歌卫星地图如何发布地图服务的两种方法
- Apache服务器入门
- 安卓调用系统摄像头拍照并保存到本地
- hibernate 反向工程
- 证书位置
- TextView 因为特殊字符(半角圆角等问题)在折行的时候各种不爽 ,不规则折行