CC26XX定时器以及按键中断

来源:互联网 发布:淘宝秋水兰熙旗舰店 编辑:程序博客网 时间:2024/06/05 12:00

一.按键中断

/****************************************************************************** @file       board_key.c @brief This file contains the interface to the SRF06EB Key Service. Group: CMCU, SCS Target Device: CC2640R2 ******************************************************************************  Copyright (c) 2014-2017, Texas Instruments Incorporated All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: *  Redistributions of source code must retain the above copyright    notice, this list of conditions and the following disclaimer. *  Redistributions in binary form must reproduce the above copyright    notice, this list of conditions and the following disclaimer in the    documentation and/or other materials provided with the distribution. *  Neither the name of Texas Instruments Incorporated nor the names of    its contributors may be used to endorse or promote products derived    from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************************************************************** Release Name: simplelink_cc2640r2_sdk_1_40_00_45 Release Date: 2017-07-20 17:16:59 *****************************************************************************//********************************************************************* * INCLUDES */#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 "util.h"#include "board_key.h"#include "board.h"/********************************************************************* * TYPEDEFS *//********************************************************************* * LOCAL FUNCTIONS */static void Board_keyChangeHandler(UArg a0);static void Board_keyCallback(PIN_Handle hPin, PIN_Id pinId);/******************************************************************************* * EXTERNAL VARIABLES *//********************************************************************* * LOCAL VARIABLES */// Value of keys Pressedstatic uint8_t keysPressed;// Key debounce clockstatic Clock_Struct keyChangeClock;// Pointer to application callbackkeysPressedCB_t appKeyChangeHandler = NULL;// Memory for the GPIO module to construct a HwiHwi_Struct callbackHwiKeys;// PIN configuration structure to set all KEY pins as inputs with pullups enabledPIN_Config keyPinsCfg[] ={#if defined(CC2650_LAUNCHXL) || defined(CC2640R2_LAUNCHXL) || defined(CC1350_LAUNCHXL)    Board_BTN1          | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,    Board_BTN2          | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,#elif defined(CC2650DK_7ID)  || defined(CC1350DK_7XD)    Board_KEY_SELECT    | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,    Board_KEY_UP        | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,    Board_KEY_DOWN      | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,    Board_KEY_LEFT      | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,    Board_KEY_RIGHT     | PIN_GPIO_OUTPUT_DIS  | PIN_INPUT_EN  |  PIN_PULLUP,#endif    PIN_TERMINATE};PIN_State  keyPins;PIN_Handle hKeyPins;/********************************************************************* * PUBLIC FUNCTIONS *//********************************************************************* * @fn      Board_initKeys * * @brief   Enable interrupts for keys on GPIOs. * * @param   appKeyCB - application key pressed callback * * @return  none */void Board_initKeys(keysPressedCB_t appKeyCB){  // Initialize KEY pins. Enable int after callback registered  hKeyPins = PIN_open(&keyPins, keyPinsCfg);  PIN_registerIntCb(hKeyPins, Board_keyCallback);#if defined(CC2650_LAUNCHXL) || defined(CC2640R2_LAUNCHXL) || defined(CC1350_LAUNCHXL)  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_BTN1        | PIN_IRQ_NEGEDGE);  PIN_setConfig(hKeyPins, PIN_BM_IRQ, Board_BTN2        | PIN_IRQ_NEGEDGE);#elif defined(CC2650DK_7ID)  || defined(CC1350DK_7XD)  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);#endif#ifdef POWER_SAVING  //Enable wakeup#if defined(CC2650_LAUNCHXL) || defined(CC2640R2_LAUNCHXL) || defined(CC1350_LAUNCHXL)  PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_BTN1        | PINCC26XX_WAKEUP_NEGEDGE);  PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_BTN2        | PINCC26XX_WAKEUP_NEGEDGE);#elif defined(CC2650DK_7ID)  || defined(CC1350DK_7XD)  PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_SELECT | PINCC26XX_WAKEUP_NEGEDGE);  PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_UP | PINCC26XX_WAKEUP_NEGEDGE);  PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_DOWN | PINCC26XX_WAKEUP_NEGEDGE);  PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_LEFT | PINCC26XX_WAKEUP_NEGEDGE);  PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_RIGHT | PINCC26XX_WAKEUP_NEGEDGE);#endif#endif //POWER_SAVING  // Setup keycallback for keys  Util_constructClock(&keyChangeClock, Board_keyChangeHandler,                      KEY_DEBOUNCE_TIMEOUT, 0, false, 0);  // Set the application callback  appKeyChangeHandler = appKeyCB;}/********************************************************************* * @fn      Board_keyCallback * * @brief   Interrupt handler for Keys * * @param   none * * @return  none */static void Board_keyCallback(PIN_Handle hPin, PIN_Id pinId){  keysPressed = 0;#if defined(CC2650_LAUNCHXL) || defined(CC2640R2_LAUNCHXL) || defined(CC1350_LAUNCHXL)  if ( PIN_getInputValue(Board_BTN1) == 0 )  {    keysPressed |= KEY_LEFT;  }  if ( PIN_getInputValue(Board_BTN2) == 0 )  {    keysPressed |= KEY_RIGHT;  }#elif defined(CC2650DK_7ID)  || defined(CC1350DK_7XD)  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;  }#endif  Util_startClock(&keyChangeClock);}/********************************************************************* * @fn      Board_keyChangeHandler * * @brief   Handler for key change * * @param   UArg a0 - ignored * * @return  none */static void Board_keyChangeHandler(UArg a0){  if (appKeyChangeHandler != NULL)  {    // Notify the application    (*appKeyChangeHandler)(keysPressed);  }}/******************************************************************************************************************************************/

1.首先设置PIN属性keyPinsCfg:设置了输入使能,以及上拉

2.Board_initKeys中PIN_setConfig设置了下降沿触发。

#define PIN_IRQ_DIS         (PIN_GEN|(0x0<<16)) ///< (*) Disable IRQ on pin#define PIN_IRQ_NEGEDGE     (PIN_GEN|(0x5<<16)) ///< Enable IRQ on negative edge#define PIN_IRQ_POSEDGE     (PIN_GEN|(0x6<<16)) ///< Enable IRQ on positive edge#define PIN_IRQ_BOTHEDGES   (PIN_GEN|(0x7<<16)) ///< Enable IRQ on both edges
3.Util_constructClock设置了回调函数。

4.  PIN_registerIntCb(hKeyPins, Board_keyCallback);设置驱动层回调

5.应用回调:

  appKeyChangeHandler = appKeyCB;

*6.如果开启了低功耗,需要设置为:

  PIN_setConfig(hKeyPins, PINCC26XX_BM_WAKEUP, Board_KEY_RIGHT | PINCC26XX_WAKEUP_NEGEDGE);

二.定时器

定时器使用前必须由Util_constructClock()函数创建,其运行模式由该函数的参数指定。

1.三个选项介绍:

定时器周期

  1. #define SBP_PERIODIC_EVT_PERIOD1              500  
定时器事件的优先级

  1. // Internal Events for RTOS application  
  2. #define SBP_STATE_CHANGE_EVT                  0x0001  

一个定时器的数据结构

  1. static Clock_Struct periodicClock;  


2.具体操作

  1. //初始化定时器  
  2. Util_constructClock(&GUA_periodicClock, SimpleBLEPeripheral_clockHandler,  
  3.                     SBP_GUA_PERIODIC_EVT_PERIOD, 0, false, SBP_GUA_PERIODIC_EVT);  
  4.   
  5. //启动定时器  
  6. Util_startClock(&GUA_periodicClock);    


void Util_stopClock(Clock_Struct *pClock)  {    Clock_Handle handle = Clock_handle(pClock);        // Stop clock instance    Clock_stop(handle);  }  


原创粉丝点击