本篇博文最后修改时间:2017年06月02日,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
香瓜单片机之职场交流群:450154342
五、基础知识
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)写一个应用层的按键处理函数的声明
//GUA
static void GUA_HandleKeys(uint8 keys);
4)初始化按键(SimpleBLEPeripheral_init函数中)
//初始化按键
Board_initKeys(GUA_HandleKeys);
八、注意事项
暂无
九、实验结果
仿真、设置断点,可以发现按键按下、松开都会进入GUA_HandleKeys函数,但按键按下时有固定键值、而松开时键值是0,因此不会造成按键按下、松开执行两次处理代码。
实测为分别按5个按键,都能将LED1的电平取反一次。
因此,实验成功。