前言
前面做的项目,都使用的是蓝牙比较基础的功能,并没有对蓝牙应用的便捷性进行深入的挖掘,现在项目告一段落,希望腾出时间专门看看官方的例程和买来的开发板的例程,做一些技术储备,以备项目升级。
今天记录一下对于HALKEY服务的学习,它在很多例程里面都有用到,所以有必要深入理解下KEY服务的工作机制。
这里用到的开发板是Ghostyu的cc2540NewSmartRF开发板,该开发板只需要修改部分驱动,就能够演示官方的示例工程,同时开发板也有很多示例工程可以去学习,另外资料也比较丰富,呵呵,算不算是我帮打广告。
此外,使用的TI BLE协议栈版本是1.3.2。
KEY服务API
KEY服务一共有7个API。分别是:
- HalKeyInit()
- HalKeyConfig()
- HalKeyRead()
- HalKeyEnterSleep()
- HalKeyExitSleep()
- HalKeyPoll()
- HalKeyPressed()
其中,HalKeyInit()、HalKeyConfig()、HalKeyRead()、HalKeyPoll()是我们需要关注的。
1.五向按键的硬件原理
五向按键的五个方向:上、下、左、右、垂直向下。原理是只要五向按键有按压动作,在JOY_MOVE引脚会产生中断,此时再去采集JOY_LEVEL的电压,根据电压范围来判断当前的五向按键的方向。原理还是很简单的,电路倒是有点复杂。
此外,开发板还有一个单独的按键S1。
2.KEY服务API源码分析
因为我使用的是开发板的例程,五向按键部分的电路和官方是不一样的,因此使用开发板提供的修改文件hal_key.c。
2.1 HalKeyInit()
/**************************************************************************************************
* @fn HalKeyInit
*
* @brief Initilize Key Service
*
* @param none
*
* @return None
**************************************************************************************************/
void HalKeyInit( void )
{
#if (HAL_KEY == TRUE)
/* Initialize previous key to 0 */
halKeySavedKeys = HAL_KEY_CODE_NOKEY;
/* The advanced remote doesn't have the same 8X8 row/column matrix as in other
* products. Instead, a 3X16 row/column matrix is used, with the rows continuing
* to be utilized by GPIOs, but the columns are generated via a 16 bit
* shift register. Controls for the shift register are, however, utilized with
* GPIOs.
*
* Another difference is that the GPIOs utilized for the rows are split between
* P0 and P1.
*/
//ghostyu from EM
HAL_KEY_SW_