LED驱动成功了,很简单,但是KEY中断使用不了,轮询key可以用,但是按下去会响应两次。各位大神给个思路。谢谢。
/********************************** (C) COPYRIGHT *******************************
* File Name          : KEY.c
* Author             : WCH
* Version            : V1.0
* Date               : 2014/05/12
* Description        : 
*******************************************************************************/



/******************************************************************************/
/* 头文件包含 */
#include "CH57x_common.h"
#include "HAL.h"


/**************************************************************************************************
 *                                        GLOBAL VARIABLES
 **************************************************************************************************/

uint8 Hal_KeyIntEnable;           /* interrupt enable/disable flag */

// Registered keys task ID, initialized to NOT USED.
static uint8 registeredKeysTaskID = TASK_NO_TASK;
static uint8 halKeySavedKeys;     /* 保留按键最后的状态,用于查询是否有键值变化 */
static uint8 KeyConfigFlag;		    /* 按键是否配置标志位 */


/**************************************************************************************************
 *                                        FUNCTIONS - Local
 **************************************************************************************************/
static halKeyCBack_t pHalKeyProcessFunction;	    /* callback function */


/**************************************************************************************************
 * @fn      HAL_KeyInit
 *
 * @brief   Initilize Key Service
 *
 * @param   none
 *
 * @return  None
 **************************************************************************************************/
void HAL_KeyInit( void )
{
  /* Initialize previous key to 0 */
  halKeySavedKeys = 0;
  /* Initialize callback function */
  pHalKeyProcessFunction  = NULL;
  /* Start with key is not configured */
  KeyConfigFlag = FALSE;
  KEY1_DIR;
  KEY1_PU;
	KEY2_DIR;
  KEY2_PU;
	KEY3_DIR;
  KEY3_PU;
	KEY4_DIR;
  KEY4_PU;
	KEY5_DIR;
  KEY5_PU;
	KEY6_DIR;
  KEY6_PU;
	KEY7_DIR;
  KEY7_PU;
	KEY8_DIR;
  KEY8_PU;
	KEY9_DIR;
  KEY9_PU;
	KEY10_DIR;
  KEY10_PU;
	KEY11_DIR;
  KEY11_PU;
	KEY12_DIR;
  KEY12_PU;
  HalKeyConfig( HAL_KEY_INTERRUPT_ENABLE, HalKeyCallback );
}

void HAL_KEY_RegisterForKeys( tmosTaskID id )
{
	registeredKeysTaskID = id;
}

/**************************************************************************************************
 * @fn      HalKeyConfig
 *
 * @brief   Configure the Key serivce
 *
 * @param   interruptEnable - TRUE/FALSE, enable/disable interrupt
 *          cback - pointer to the CallBack function
 *
 * @return  None
 **************************************************************************************************/
void HalKeyConfig (uint8 interruptEnable, halKeyCBack_t cback)
{
  /* Enable/Disable Interrupt or */
  Hal_KeyIntEnable = interruptEnable;
  /* Register the callback fucntion */
  pHalKeyProcessFunction = cback;
  /* Determine if interrupt is enable or not */
  if (Hal_KeyIntEnable){
    /* Do this only after the hal_key is configured - to work with sleep stuff */
    if (KeyConfigFlag == TRUE){
      tmos_stop_task( halTaskID, HAL_KEY_EVENT );  /* Cancel polling if active */
    }
  }
  else{    /* Interrupts NOT enabled */
    tmos_start_task( halTaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE);    /* Kick off polling */
  }
  /* Key now is configured */
  KeyConfigFlag = TRUE;
}

/*********************************************************************
 * @fn      OnBoard_SendKeys
 *
 * @brief   Send "Key Pressed" message to application.
 *
 * @param   keys  - keys that were pressed
 *          state - shifted
 *
 * @return  status
 *********************************************************************/
uint8 OnBoard_SendKeys( uint8 keys, uint8 state )
{
  keyChange_t *msgPtr;

  if ( registeredKeysTaskID != TASK_NO_TASK ){
    // Send the address to the task
    msgPtr = (keyChange_t *)tmos_msg_allocate( sizeof(keyChange_t) );
    if ( msgPtr ){
      msgPtr->hdr.event = KEY_CHANGE;
      msgPtr->state = state;
      msgPtr->keys = keys;
      tmos_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );
    }
    return ( SUCCESS );
  }
  else{
    return ( FAILURE );
  }
}

/*********************************************************************
 * @fn      OnBoard_KeyCallback
 *
 * @brief   Callback service for keys
 *
 * @param   keys  - keys that were pressed
 *          state - shifted
 *
 * @return  void
 *********************************************************************/
void HalKeyCallback ( uint8 keys, uint8 state )
{
  (void)state;
  if ( OnBoard_SendKeys( keys, state ) != SUCCESS ){
    // Process SW1 here
    if ( keys & HAL_KEY_SW_1 ){  // Switch 1
			
		}
    // Process SW2 here
    if ( keys & HAL_KEY_SW_2 ){  // Switch 2
			
    }
    // Process SW3 here
    if ( keys & HAL_KEY_SW_3 ){  // Switch 3
			
    }
    // Process SW4 here
    if ( keys & HAL_KEY_SW_4 ){  // Switch 4
		
    }
		 // Process SW5 here
    if ( keys & HAL_KEY_SW_5 )  // Switch 5
    {
	
    }
    // Process SW6 here
    if ( keys & HAL_KEY_SW_6 )  // Switch 6
    {

    }
    if ( keys & HAL_KEY_SW_7 )  // Switch 7
    {
    }
    if ( keys & HAL_KEY_SW_8 )  // Switch 8
    {
	
    }
     if ( keys & HAL_KEY_SW_9 )  // Switch 9
    {
    }
     if ( keys & HAL_KEY_SW_10 )  // Switch 9
    {
    }
     if ( keys & HAL_KEY_SW_11 )  // Switch 9
    {
    }
     if ( keys & HAL_KEY_SW_12 )  // Switch 9
    {
    }
  }
}


/**************************************************************************************************
 * @fn      HalKeyRead
 *
 * @brief   Read the current value of a key
 *
 * @param   None
 *
 * @return  keys - current keys status
 **************************************************************************************************/
uint8 HalKeyRead ( void )
{
  uint8 keys = 0;

  if (HAL_PUSH_BUTTON1()){ //读按键1
    keys |= HAL_KEY_SW_1;
  }
  if (HAL_PUSH_BUTTON2()){ //读按键1
    keys |= HAL_KEY_SW_2;
  }
  if (HAL_PUSH_BUTTON3()){ //读按键1
    keys |= HAL_KEY_SW_3;
  }
  if (HAL_PUSH_BUTTON4()){ //读按键1
    keys |= HAL_KEY_SW_4;
  }
	if (HAL_PUSH_BUTTON5()){ //读按键1
    keys |= HAL_KEY_SW_5;
  }
	if (HAL_PUSH_BUTTON6()){ //读按键1
    keys |= HAL_KEY_SW_6;
  }
	if (HAL_PUSH_BUTTON7()){ //读按键1
    keys |= HAL_KEY_SW_7;
  }
	if (HAL_PUSH_BUTTON8()){ //读按键1
    keys |= HAL_KEY_SW_8;
  }
	if (HAL_PUSH_BUTTON9()){ //读按键1
    keys |= HAL_KEY_SW_9;
  }
	if (HAL_PUSH_BUTTON10()){ //读按键1
    keys |= HAL_KEY_SW_10;
  }
	if (HAL_PUSH_BUTTON11()){ //读按键1
    keys |= HAL_KEY_SW_11;
  }
	if (HAL_PUSH_BUTTON12()){ //读按键1
    keys |= HAL_KEY_SW_12;
  }
  return keys;
}


/**************************************************************************************************
 * @fn      HAL_KeyPoll
 *
 * @brief   Called by hal_driver to poll the keys
 *
 * @param   None
 *
 * @return  None
 **************************************************************************************************/
void HAL_KeyPoll (void)
{
  uint8 keys = 0;

  if( HAL_PUSH_BUTTON1() ){
    keys |= HAL_KEY_SW_1;
  }
  if( HAL_PUSH_BUTTON2() ){
    keys |= HAL_KEY_SW_2;
  }
  if( HAL_PUSH_BUTTON3() ){
    keys |= HAL_KEY_SW_3;
  }
  if( HAL_PUSH_BUTTON4() ){
    keys |= HAL_KEY_SW_4;
  }
	  if( HAL_PUSH_BUTTON5() ){
    keys |= HAL_KEY_SW_5;
  }
  if( HAL_PUSH_BUTTON6() ){
    keys |= HAL_KEY_SW_6;
  }
  if( HAL_PUSH_BUTTON7() ){
    keys |= HAL_KEY_SW_7;
  }
  if( HAL_PUSH_BUTTON8() ){
    keys |= HAL_KEY_SW_8;
  }
	  if( HAL_PUSH_BUTTON9() ){
    keys |= HAL_KEY_SW_9;
  }
  if( HAL_PUSH_BUTTON10() ){
    keys |= HAL_KEY_SW_10;
  }
  if( HAL_PUSH_BUTTON11() ){
    keys |= HAL_KEY_SW_11;
  }
  if( HAL_PUSH_BUTTON12() ){
    keys |= HAL_KEY_SW_12;
  }
  if (!Hal_KeyIntEnable){	             /* 中断未使能 */
    if(keys == halKeySavedKeys){         /* Exit - since no keys have changed */
      return;
		}
		halKeySavedKeys = keys;	       /* Store the current keys for comparation next time */
  }
  /* Invoke Callback if new keys were depressed */
  if (keys && (pHalKeyProcessFunction)){
    (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
  }
}


/******************************** endfile @ key ******************************/

KEY.H

/********************************** (C) COPYRIGHT *******************************
* File Name          : KEY.h
* Author             : WCH
* Version            : V1.0
* Date               : 2016/04/12
* Description        : 
*******************************************************************************/



/******************************************************************************/
#ifndef __KEY_H
#define __KEY_H

#ifdef __cplusplus
extern "C"
{
#endif

	


/**************************************************************************************************
 *                                              MACROS
 **************************************************************************************************/
#define KEY_CHANGE                	 0xC0    // Key message

#define HAL_KEY_RISING_EDGE   		   0
#define HAL_KEY_FALLING_EDGE  		   1

#define HAL_KEY_DEBOUNCE_VALUE  	   25
#define HAL_KEY_POLLING_VALUE   	   100

/* Interrupt option - Enable or disable */
#define HAL_KEY_INTERRUPT_DISABLE    0x00
#define HAL_KEY_INTERRUPT_ENABLE     0x01

/* Key state - shift or nornal */
#define HAL_KEY_STATE_NORMAL         0x00
#define HAL_KEY_STATE_SHIFT          0x01

/* Switches (keys) */
#define HAL_KEY_SW_1 0x0001  
#define HAL_KEY_SW_2 0x0002  
#define HAL_KEY_SW_3 0x0004  
#define HAL_KEY_SW_4 0x0008  
#define HAL_KEY_SW_5 0x0010  

#define HAL_KEY_SW_6 0x0020  
#define HAL_KEY_SW_7 0x0040  
#define HAL_KEY_SW_8 0x0080  
#define HAL_KEY_SW_9 0x0100
#define HAL_KEY_SW_10 0x0200
#define HAL_KEY_SW_11 0x0400
#define HAL_KEY_SW_12 0x0800
  
 /* 按键定义 */

/* 1 - KEY */
  #define KEY1_BV           BV(23)   //引脚定义
  #define KEY2_BV           GPIO_Pin_1    
	#define KEY3_BV 					GPIO_Pin_2    
  #define KEY4_BV           GPIO_Pin_3    
	#define KEY5_BV           GPIO_Pin_4    
  #define KEY6_BV           GPIO_Pin_5    
  #define KEY7_BV 					GPIO_Pin_6    
	#define KEY8_BV           GPIO_Pin_7    
  #define KEY9_BV           GPIO_Pin_8    
  #define KEY10_BV          GPIO_Pin_9    
	#define KEY11_BV          GPIO_Pin_10    
	#define KEY12_BV          GPIO_Pin_11   
  
	#define KEY1_PU        	(R32_PB_PU |= KEY1_BV)   //上拉电阻使能
  #define KEY2_PU        	(R32_PB_PU |= KEY2_BV)
  #define KEY3_PU        	(R32_PB_PU |= KEY3_BV)
  #define KEY4_PU        	(R32_PB_PU |= KEY4_BV)
	#define KEY5_PU        	(R32_PB_PU |= KEY5_BV)
  #define KEY6_PU        	(R32_PB_PU |= KEY6_BV)
  #define KEY7_PU        	(R32_PB_PU |= KEY7_BV)
  #define KEY8_PU        	(R32_PB_PU |= KEY8_BV)
	#define KEY9_PU        	(R32_PB_PU |= KEY9_BV)
  #define KEY10_PU        (R32_PB_PU |= KEY10_BV)
  #define KEY11_PU        (R32_PB_PU |= KEY11_BV)
  #define KEY12_PU        (R32_PB_PU |= KEY12_BV)

  #define KEY1_DIR       	(R32_PB_DIR &= ~KEY1_BV)  //设置成输入模式
	#define KEY2_DIR       	(R32_PB_DIR &= ~KEY2_BV)
	#define KEY3_DIR       	(R32_PB_DIR &= ~KEY3_BV)
	#define KEY4_DIR       	(R32_PB_DIR &= ~KEY4_BV)
	#define KEY5_DIR       	(R32_PB_DIR &= ~KEY5_BV)
	#define KEY6_DIR       	(R32_PB_DIR &= ~KEY6_BV)
	#define KEY7_DIR       	(R32_PB_DIR &= ~KEY7_BV)
	#define KEY8_DIR       	(R32_PB_DIR &= ~KEY8_BV)
	#define KEY9_DIR       	(R32_PB_DIR &= ~KEY9_BV)
	#define KEY10_DIR       (R32_PB_DIR &= ~KEY10_BV)
	#define KEY11_DIR       (R32_PB_DIR &= ~KEY11_BV)
	#define KEY12_DIR       (R32_PB_DIR &= ~KEY12_BV)

  #define KEY1_IN        	(ACTIVE_LOW(R32_PB_PIN&KEY1_BV))  //没有按键按下时1111(由于上拉了),如第第一个按下,1110 然后&上第一个按键的键码0001 结果变成0000 后再取反变成1111
	#define KEY2_IN        	(ACTIVE_LOW(R32_PB_PIN&KEY2_BV))
	#define KEY3_IN        	(ACTIVE_LOW(R32_PB_PIN&KEY3_BV))
	#define KEY4_IN        	(ACTIVE_LOW(R32_PB_PIN&KEY4_BV))
	#define KEY5_IN        	(ACTIVE_LOW(R32_PB_PIN&KEY5_BV))
	#define KEY6_IN        	(ACTIVE_LOW(R32_PB_PIN&KEY6_BV))
	#define KEY7_IN        	(ACTIVE_LOW(R32_PB_PIN&KEY7_BV))
	#define KEY8_IN        	(ACTIVE_LOW(R32_PB_PIN&KEY8_BV))
	#define KEY9_IN        	(ACTIVE_LOW(R32_PB_PIN&KEY9_BV))
	#define KEY10_IN        (ACTIVE_LOW(R32_PB_PIN&KEY10_BV))
	#define KEY11_IN        (ACTIVE_LOW(R32_PB_PIN&KEY11_BV))
	#define KEY12_IN        (ACTIVE_LOW(R32_PB_PIN&KEY12_BV))

#define HAL_PUSH_BUTTON1()        ( KEY1_IN ) //添加自定义按键
#define HAL_PUSH_BUTTON2()        ( KEY2_IN  )
#define HAL_PUSH_BUTTON3()        ( KEY3_IN ) 
#define HAL_PUSH_BUTTON4()        ( KEY4_IN ) 
#define HAL_PUSH_BUTTON5()        ( KEY5_IN ) //添加自定义按键
#define HAL_PUSH_BUTTON6()        ( KEY6_IN  )
#define HAL_PUSH_BUTTON7()        ( KEY7_IN ) 
#define HAL_PUSH_BUTTON8()        ( KEY8_IN ) 
#define HAL_PUSH_BUTTON9()        ( KEY9_IN ) //添加自定义按键
#define HAL_PUSH_BUTTON10()       ( KEY10_IN  )
#define HAL_PUSH_BUTTON11()       ( KEY11_IN ) 
#define HAL_PUSH_BUTTON12()       ( KEY12_IN ) 






/**************************************************************************************************
 * TYPEDEFS
 **************************************************************************************************/
typedef void (*halKeyCBack_t) (uint8 keys, uint8 state);

typedef struct
{
  tmos_event_hdr_t hdr;
  uint8  state; // shift
  uint8  keys;  // keys
} keyChange_t;

/**************************************************************************************************
 *                                             GLOBAL VARIABLES
 **************************************************************************************************/
extern uint8 Hal_KeyIntEnable;

/*********************************************************************
 * FUNCTIONS
 */

/*
 * Initialize the Key Service
 */
void HAL_KeyInit( void );

/*
 * This is for internal used by hal_driver
 */
void HAL_KeyPoll( void );

/*
 * Register the Key Service
 */
void HAL_KEY_RegisterForKeys( tmosTaskID id );

/*
 * Configure the Key Service
 */
void HalKeyConfig( uint8 interruptEnable, const halKeyCBack_t cback);

/*
 * Read the Key callback
 */
void HalKeyCallback ( uint8 keys, uint8 state );

/*
 * Read the Key status
 */
uint8 HalKeyRead( void);


/**************************************************************************************************
**************************************************************************************************/

#ifdef __cplusplus
}
#endif

#endif


peripheral.C

这个只是相关key的代码

	HAL_KEY_RegisterForKeys(Peripheral_TaskID);
	
	
	
	/*********************************************************************
 * @fn      Peripheral_ProcessTMOSMsg
 *
 * @brief   Process an incoming task message.
 *
 * @param   pMsg - message to process
 *
 * @return  none
 */
static void Peripheral_ProcessTMOSMsg( tmos_event_hdr_t *pMsg )
{
  switch ( pMsg->event ){
		  case KEY_CHANGE:
			PRINT("KEY changed \n");
      Peripheral_HandleKeys( ((keyChange_t *)pMsg)->state, 
                                      ((keyChange_t *)pMsg)->keys );
      break;
 
    case GATT_MSG_EVENT:
      // Process GATT message
      Peripheral_ProcessGATTMsg( (gattMsgEvent_t *)pMsg );
      break;
		default:
			break;
  }
}
	
	
	
/*********************************************************************
 * @fn      simpleBLEPeripheral_HandleKeys
 *
 * @brief   Handles all key events for this device.
 *
 * @param   shift - true if in shift/alt.
 * @param   keys - bit field for key events. Valid entries:
 *                 HAL_KEY_SW_2
 *                 HAL_KEY_SW_1
 *
 * @return  none
 */
static void Peripheral_HandleKeys( uint8 shift, uint16 keys )
{
  uint8 char1 = 1;
  uint8 char2 = 2;
  uint8 char3 = 3;
  uint8 char4 = 4;
  uint8 char5 = 5;
  uint8 char6 = 6;
  uint8 char7 = 7;
  uint8 char8 = 8;
  uint8 char9 = 9;
  uint8 char10 = 16;  //假如此处的值为10,那么手机端显示0A,10进制的10是16进制的0A,10进制的16是16进制的10
  uint8 char11 = 17; //同上
  uint8 char12 = 18; //同上
  uint8 char21 = 153; //同上
   if ( keys & HAL_KEY_SW_1  )
  {
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char1);
     button_values = 1;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);
  }
  
   if ( keys & HAL_KEY_SW_2 )
  {
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char2);
     button_values = 2;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
 if  ( keys & HAL_KEY_SW_3 )
  {
    
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char3); 
     button_values = 3;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);
  }
 if ( keys & HAL_KEY_SW_4 )
  {
    
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char4);
     button_values = 4;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
 if  ( keys & HAL_KEY_SW_5  )
  {
    
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char5);
     button_values = 5;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
 if ( keys & HAL_KEY_SW_6  )
  {
    
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char6);
     button_values = 6;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
 if ( keys & HAL_KEY_SW_7  )
  {
   
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char7);
     button_values = 7;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
 if  ( keys & HAL_KEY_SW_8 )
  {
    
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char8);
     button_values = 8;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
 if  ( keys & HAL_KEY_SW_9 )
 {
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char9);
     button_values = 9;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
  if  ( keys & HAL_KEY_SW_10)
  {
    
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char10);
     button_values = 16;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
 if  ( keys & HAL_KEY_SW_11 )
  {
    
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char11);
     button_values = 17;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
 if  ( keys & HAL_KEY_SW_12  )
  {
     SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char12);
     button_values = 18;
     HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);

  }
  if (keys == 0x00){
   SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof(uint8), &char21);
   } 
   
}	
	
	
	
	





1、贴出工程,最好能单独可以实现编译。

2、贴出板子的按键管脚、LOG等信息。越详细越好。

3、贴出复现步骤,哪个PIN脚短按&长按等信息。

--end


主要是demo里的逻辑只有轮询key,但是我要使用中断来处理KEY按键按下的逻辑。希望有个简单的中断key的demo提供借鉴一下,相关的中断寄存器有几个,但是又不知道那几个有用。



1、如果是通过GPIO中断方式,可以在main中自己写一个KEY_IO函数。

附件是带IO中断的单独例子。

icon_rar.gifCH573_IO_ZPF.zip

2、如果添加BLE功能,则需要注意,中断处理函数时间<1ms。否则会出现丢失数据。注意丢失数据,不一定会出现BLE断开。

3、建议在TMOS框架下,使用轮询IO口的方式,同时优化按键抖动等应用。如果非要中断,那么通过中断标志位,去外部处理IO数据。当然耗费的时间和轮询按键时间,反而增多,具体需要根据应用更多考量。

--end



只有登录才能回复,可以选择微信账号登录