按键的定义一般有两种,开关和摇杆。这里只讨论开关的定义。
#ifndef HAL_BOARD_CFG_H
#define HAL_BOARD_CFG_H
#include "hal_mcu.h"
#include "hal_defs.h"
#include "hal_types.h"
#define xHAL_PA_LNA
#define xHAL_PA_LNA_CC2590
#if !defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_BOARD_CC2530EB_REV13)
#define HAL_BOARD_CC2530EB_REV17
#endif
#define HAL_CPU_CLOCK_MHZ 32
#if !defined (OSC32K_CRYSTAL_INSTALLED) || (defined (OSC32K_CRYSTAL_INSTALLED) && (OSC32K_CRYSTAL_INSTALLED == TRUE))
#define OSC_32KHZ 0x00
#else
#define OSC_32KHZ 0x80
#endif
#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590)
#define HAL_NUM_LEDS 3
#elif defined (HAL_BOARD_CC2530EB_REV13) || defined (HAL_PA_LNA) || defined (HAL_PA_LNA_CC2590)
#define HAL_NUM_LEDS 1
#else
#error Unknown Board Indentifier
#endif
#define HAL_LED_Blink_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } )
#define LED1_BV BV(0)
#define LED1_SBIT P0_0
#define LED1_DDR P0DIR
#define LED1_POLARITY ACTIVE_HIGH
#define LED2_BV BV(0)
#define LED2_SBIT P2_0
#define LED2_DDR P2DIR
#define LED2_POLARITY ACTIVE_HIGH
#ifdef HAL_BOARD_CC2530EB_REV17
#define LED3_BV BV(4)
#define LED3_SBIT P1_4
#define LED3_DDR P1DIR
#define LED3_POLARITY ACTIVE_HIGH
#endif
#define ACTIVE_LOW !
#define ACTIVE_HIGH !!
#define PUSH1_BV BV(4)
#define PUSH1_SBIT P0_4
#ifdef HAL_BOARD_CC2530EB_REV17
#define PUSH1_POLARITY ACTIVE_HIGH
#elif defined (HAL_BOARD_CC2530EB_REV13)
#define PUSH1_POLARITY ACTIVE_LOW
#else
#error Unknown Board Indentifier
#endif
#define PUSH2_BV BV(0)
//#define PUSH2_SBIT P2_0
#define PUSH2_POLARITY ACTIVE_HIGH
// Flash is partitioned into 8 banks of 32 KB or 16 pages.
#define HAL_FLASH_PAGE_PER_BANK 16
// Flash is constructed of 128 pages of 2 KB.
#define HAL_FLASH_PAGE_SIZE 2048
#define HAL_FLASH_WORD_SIZE 4
// CODE banks get mapped into the XDATA range 8000-FFFF.
#define HAL_FLASH_PAGE_MAP 0x8000
// The last 16 bytes of the last available page are reserved for flash lock bits.
#if defined NON_BANKED
#define HAL_FLASH_LOCK_BITS 16
#define HAL_NV_PAGE_END 30
#else
#define HAL_FLASH_LOCK_BITS 16
#define HAL_NV_PAGE_END 126
#endif
// Re-defining Z_EXTADDR_LEN here so as not to include a Z-Stack .h file.
#define HAL_FLASH_IEEE_SIZE 8
#define HAL_FLASH_IEEE_PAGE (HAL_NV_PAGE_END+1)
#define HAL_FLASH_IEEE_OSET (HAL_FLASH_PAGE_SIZE - HAL_FLASH_LOCK_BITS - HAL_FLASH_IEEE_SIZE)
#define HAL_INFOP_IEEE_OSET 0xC
#define HAL_NV_PAGE_CNT 6
#define HAL_NV_PAGE_BEG (HAL_NV_PAGE_END-HAL_NV_PAGE_CNT+1)
// Used by DMA macros to shift 1 to create a mask for DMA registers.
#define HAL_NV_DMA_CH 0
#define HAL_DMA_CH_RX 3
#define HAL_DMA_CH_TX 4
#define HAL_NV_DMA_GET_DESC() HAL_DMA_GET_DESC0()
#define HAL_NV_DMA_SET_ADDR(a) HAL_DMA_SET_ADDR_DESC0((a))
#define PREFETCH_ENABLE() st( FCTL = 0x08; )
#define PREFETCH_DISABLE() st( FCTL = 0x04; )
#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590)
#define HAL_BOARD_INIT()
{
uint16 i;
SLEEPCMD &= ~OSC_PD;
while (!(SLEEPSTA & XOSC_STB));
asm("NOP");
for (i=0; i<504; i++) asm("NOP");
CLKConCMD = (CLKCONCMD_32MHZ | OSC_32KHZ);
while (CLKConSTA != (CLKCONCMD_32MHZ | OSC_32KHZ));
SLEEPCMD |= OSC_PD;
PREFETCH_ENABLE();
LED1_DDR |= LED1_BV;
LED2_DDR |= LED2_BV;
LED3_DDR |= LED3_BV;
}
#elif defined (HAL_BOARD_CC2530EB_REV13) || defined (HAL_PA_LNA) || defined (HAL_PA_LNA_CC2590)
#define HAL_BOARD_INIT()
{
uint16 i;
SLEEPCMD &= ~OSC_PD;
while (!(SLEEPSTA & XOSC_STB));
asm("NOP");
for (i=0; i<504; i++) asm("NOP");
CLKConCMD = (CLKCONCMD_32MHZ | OSC_32KHZ);
while (CLKConSTA != (CLKCONCMD_32MHZ | OSC_32KHZ));
SLEEPCMD |= OSC_PD;
PREFETACH_ENABLE();
LED1_DDR |= LED1_BV;
P0DIR |= BV(7);
}
#endif
#define HAL_DEBOUNCE(expr) { int i; for (i=0; i<500; i++) { if (!(expr)) i = 0; } }
#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT))
#define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT))
#define HAL_PUSH_BUTTON3() (0)
#define HAL_PUSH_BUTTON4() (0)
#define HAL_PUSH_BUTTON5() (0)
#define HAL_PUSH_BUTTON6() (0)
#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590)
#define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); )
#define HAL_TURN_OFF_LED2() st( LED2_SBIT = LED2_POLARITY (0); )
#define HAL_TURN_OFF_LED3() st( LED3_SBIT = LED3_POLARITY (0); )
#define HAL_TURN_OFF_LED4() HAL_TURN_OFF_LED1()
#define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); )
#define HAL_TURN_ON_LED2() st( LED2_SBIT = LED2_POLARITY (1); )
#define HAL_TURN_ON_LED3() st( LED3_SBIT = LED3_POLARITY (1); )
#define HAL_TURN_ON_LED4() HAL_TURN_ON_LED1()
#define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} )
#define HAL_TOGGLE_LED2() st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} )
#define HAL_TOGGLE_LED3() st( if (LED3_SBIT) { LED3_SBIT = 0; } else { LED3_SBIT = 1;} )
#define HAL_TOGGLE_LED4() HAL_TOGGLE_LED1()
#define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT))
#define HAL_STATE_LED2() (LED2_POLARITY (LED2_SBIT))
#define HAL_STATE_LED3() (LED3_POLARITY (LED3_SBIT))
#define HAL_STATE_LED4() HAL_STATE_LED1()
#elif defined (HAL_BOARD_CC2530EB_REV13) || defined (HAL_PA_LNA) || defined (HAL_PA_LNA_CC2590)
#define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); )
#define HAL_TURN_OFF_LED2() HAL_TURN_OFF_LED1()
#define HAL_TURN_OFF_LED3() HAL_TURN_OFF_LED1()
#define HAL_TURN_OFF_LED4() HAL_TURN_OFF_LED1()
#define HAL_TURN_ON_LED1() st( LED1_SBIT = LED1_POLARITY (1); )
#define HAL_TURN_ON_LED2() HAL_TURN_ON_LED1()
#define HAL_TURN_ON_LED3() HAL_TURN_ON_LED1()
#define HAL_TURN_ON_LED4() HAL_TURN_ON_LED1()
#define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} )
#define HAL_TOGGLE_LED2() HAL_TOGGLE_LED1()
#define HAL_TOGGLE_LED3() HAL_TOGGLE_LED1()
#define HAL_TOGGLE_LED4() HAL_TOGGLE_LED1()
#define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBIT))
#define HAL_STATE_LED2() HAL_STATE_LED1()
#define HAL_STATE_LED3() HAL_STATE_LED1()
#define HAL_STATE_LED4() HAL_STATE_LED1()
#endif
#define XNV_SPI_BEGIN() st(P1_3 = 0;)
#define XNV_SPI_TX(x) st(U1CSR &= ~0x02; U1DBUF = (x);)
#define XNV_SPI_RX() U1DBUF
#define XNV_SPI_WAIT_RXRDY() st(while (!(U1CSR & 0x02));)
#define XNV_SPI_END() st(P1_3 = 1;)
// The TI reference design uses UART1 Alt. 2 in SPI mode.
#define XNV_SPI_INIT()
st(
U1CSR = 0;
U1GCR = 11;
U1BAUD = 216;
U1GCR |= BV(5);
PERCFG |= 0x02;
P1SEL |= 0xE0;
P1SEL &= ~0x0E;
P1 |= 0x0E;
P1_1 = 0;
P1DIR |= 0x0E;
P2SEL &= ~0x20;
U1CSR |= 0x40;
P1_1 = 1;
)
#ifndef HAL_TIMER
#define HAL_TIMER FALSE
#endif
#ifndef HAL_ADC
#define HAL_ADC TRUE
#endif
#ifndef HAL_DMA
#define HAL_DMA TRUE
#endif
#ifndef HAL_FLASH
#define HAL_FLASH TRUE
#endif
#ifndef HAL_AES
#define HAL_AES TRUE
#endif
#ifndef HAL_AES_DMA
#define HAL_AES_DMA TRUE
#endif
#ifndef HAL_LCD
#define HAL_LCD TRUE
#endif
#ifndef HAL_LED
#define HAL_LED TRUE
#endif
#if (!defined Blink_LEDS) && (HAL_LED == TRUE)
#define Blink_LEDS
#endif
#ifndef HAL_KEY
#define HAL_KEY TRUE
#endif
#ifndef HAL_UART
#if (defined ZAPP_P1) || (defined ZAPP_P2) || (defined ZTOOL_P1) || (defined ZTOOL_P2)
#define HAL_UART TRUE
#else
#define HAL_UART FALSE
#endif
#endif
#if HAL_UART
// Always prefer to use DMA over ISR.
#if HAL_DMA
#ifndef HAL_UART_DMA
#if (defined ZAPP_P1) || (defined ZTOOL_P1)
#define HAL_UART_DMA 1
#elif (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_DMA 2
#else
#define HAL_UART_DMA 1
#endif
#endif
#define HAL_UART_ISR 0
#else
#ifndef HAL_UART_ISR
#if (defined ZAPP_P1) || (defined ZTOOL_P1)
#define HAL_UART_ISR 1
#elif (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_ISR 2
#else
#define HAL_UART_ISR 1
#endif
#endif
#define HAL_UART_DMA 0
#endif
// Used to set P2 priority - USART0 over USART1 if both are defined.
#if ((HAL_UART_DMA == 1) || (HAL_UART_ISR == 1))
#define HAL_UART_PRIPO 0x00
#else
#define HAL_UART_PRIPO 0x40
#endif
#else
#define HAL_UART_DMA 0
#define HAL_UART_ISR 0
#endif
#endif
hal_key.h
#ifndef HAL_KEY_H
#define HAL_KEY_H
#ifdef __cplusplus
extern "C"
{
#endif
#include "hal_board.h"
#define HAL_KEY_INTERRUPT_DISABLE 0x00
#define HAL_KEY_INTERRUPT_ENABLE 0x01
#define HAL_KEY_STATE_NORMAL 0x00
#define HAL_KEY_STATE_SHIFT 0x01
#define HAL_KEY_SW_1 0x01 // Joystick up
#define HAL_KEY_SW_2 0x02 // Joystick right
#define HAL_KEY_SW_5 0x04 // Joystick center
#define HAL_KEY_SW_4 0x08 // Joystick left
#define HAL_KEY_SW_3 0x10 // Joystick down
#define HAL_KEY_SW_6 0x20 // Button S1 if available
#define HAL_KEY_SW_7 0x40 // Button S2 if available
#define HAL_KEY_UP 0x01 // Joystick up
#define HAL_KEY_RIGHT 0x02 // Joystick right
#define HAL_KEY_CENTER 0x04 // Joystick center
#define HAL_KEY_LEFT 0x08 // Joystick left
#define HAL_KEY_DOWN 0x10 // Joystick down
typedef void (*halKeyCBack_t) (uint8 keys, uint8 state);
extern bool Hal_KeyIntEnable;
extern void HalKeyInit( void );
extern void HalKeyConfig( bool interruptEnable, const halKeyCBack_t cback);
extern uint8 HalKeyRead( void);
extern void HalKeyEnterSleep ( void );
extern uint8 HalKeyExitSleep ( void );
extern void HalKeyPoll ( void );
extern bool HalKeyPressed( void );
#ifdef __cplusplus
}
#endif
#endif
hal_key.c
#include "hal_mcu.h"
#include "hal_defs.h"
#include "hal_types.h"
#include "hal_drivers.h"
#include "hal_adc.h"
#include "hal_key.h"
#include "osal.h"
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
#define HAL_KEY_RISING_EDGE 0
#define HAL_KEY_FALLING_EDGE 1
#define HAL_KEY_DEBOUNCE_VALUE 25
#define HAL_KEY_POLLING_VALUE 100
#define HAL_KEY_CPU_PORT_0_IF P0IF
#define HAL_KEY_CPU_PORT_2_IF P2IF
#define HAL_KEY_SW_6_PORT P0
#define HAL_KEY_SW_6_BIT BV(4)
#define HAL_KEY_SW_6_SEL P0SEL
#define HAL_KEY_SW_6_DIR P0DIR
#define HAL_KEY_SW_6_EDGEBIT BV(0)
#define HAL_KEY_SW_6_EDGE HAL_KEY_FALLING_EDGE
#define HAL_KEY_SW_6_IEN IEN1
#define HAL_KEY_SW_6_IENBIT BV(5)
#define HAL_KEY_SW_6_ICTL P0IEN
#define HAL_KEY_SW_6_ICTLBIT BV(1)
#define HAL_KEY_SW_6_PXIFG P0IFG
#define HAL_KEY_JOY_MOVE_PORT 0//P2
#define HAL_KEY_JOY_MOVE_BIT 0//BV(0)
#define HAL_KEY_JOY_MOVE_SEL 0//P2SEL
#define HAL_KEY_JOY_MOVE_DIR 0//P2DIR
#define HAL_KEY_JOY_MOVE_EDGEBIT BV(3)
#define HAL_KEY_JOY_MOVE_EDGE HAL_KEY_FALLING_EDGE
#define HAL_KEY_JOY_MOVE_IEN IEN2
#define HAL_KEY_JOY_MOVE_IENBIT BV(1)
#define HAL_KEY_JOY_MOVE_ICTL P2IEN
#define HAL_KEY_JOY_MOVE_ICTLBIT BV(0)
#define HAL_KEY_JOY_MOVE_PXIFG P2IFG
#define HAL_KEY_JOY_CHN HAL_ADC_CHANNEL_6
static uint8 halKeySavedKeys;
static halKeyCBack_t pHalKeyProcessFunction;
static uint8 HalKeyConfigured;
bool Hal_KeyIntEnable;
void halProcessKeyInterrupt(void);
uint8 halGetJoyKeyInput(void);
void HalKeyInit( void )
{
halKeySavedKeys = 0;
HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT);
HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT);
//HAL_KEY_JOY_MOVE_SEL &= ~(HAL_KEY_JOY_MOVE_BIT);
//HAL_KEY_JOY_MOVE_DIR &= ~(HAL_KEY_JOY_MOVE_BIT);
pHalKeyProcessFunction = NULL;
HalKeyConfigured = FALSE;
}
void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback)
{
Hal_KeyIntEnable = interruptEnable;
pHalKeyProcessFunction = cback;
if (Hal_KeyIntEnable)
{
PICTL &= ~(HAL_KEY_SW_6_EDGEBIT);
#if (HAL_KEY_SW_6_EDGE == HAL_KEY_FALLING_EDGE)
PICTL |= HAL_KEY_SW_6_EDGEBIT;
#endif
HAL_KEY_SW_6_ICTL |= HAL_KEY_SW_6_ICTLBIT;
HAL_KEY_SW_6_IEN |= HAL_KEY_SW_6_IENBIT;
HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT);
HAL_KEY_JOY_MOVE_ICTL &= ~(HAL_KEY_JOY_MOVE_EDGEBIT);
#if (HAL_KEY_JOY_MOVE_EDGE == HAL_KEY_FALLING_EDGE)
HAL_KEY_JOY_MOVE_ICTL |= HAL_KEY_JOY_MOVE_EDGEBIT;
#endif
HAL_KEY_JOY_MOVE_ICTL |= HAL_KEY_JOY_MOVE_ICTLBIT;
HAL_KEY_JOY_MOVE_IEN |= HAL_KEY_JOY_MOVE_IENBIT;
HAL_KEY_JOY_MOVE_PXIFG = ~(HAL_KEY_JOY_MOVE_BIT);
if (HalKeyConfigured == TRUE)
{
osal_stop_timerEx( Hal_TaskID, HAL_KEY_EVENT);
}
}
else
{
HAL_KEY_SW_6_ICTL &= ~(HAL_KEY_SW_6_ICTLBIT);
HAL_KEY_SW_6_IEN &= ~(HAL_KEY_SW_6_IENBIT);
osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE);
}
HalKeyConfigured = TRUE;
}
uint8 HalKeyRead ( void )
{
uint8 keys = 0;
#ifdef HAL_BOARD_CC2530EB_REV17
if ( (HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT))
#elif defined (HAL_BOARD_CC2530EB_REV13)
if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT))
#endif
{
keys |= HAL_KEY_SW_6;
}
if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT))
{
//keys |= halGetJoyKeyInput();
}
return keys;
}
void HalKeyPoll (void)
{
uint8 keys = 0;
if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT))
{
keys |= HAL_KEY_SW_6;
}
if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT))
{
//keys = halGetJoyKeyInput();
}
if (!Hal_KeyIntEnable)
{
if (keys == halKeySavedKeys)
{
return;
}
halKeySavedKeys = keys;
}
else
{
}
if (keys && (pHalKeyProcessFunction))
{
(pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
}
}
uint8 halGetJoyKeyInput(void)
{
uint8 adc;
uint8 ksave0 = 0;
uint8 ksave1;
do
{
ksave1 = ksave0;
adc = HalAdcRead (HAL_KEY_JOY_CHN, HAL_ADC_RESOLUTION_8);
if ((adc >= 2) && (adc <= 38))
{
ksave0 |= HAL_KEY_UP;
}
else if ((adc >= 74) && (adc <= 88))
{
ksave0 |= HAL_KEY_RIGHT;
}
else if ((adc >= 60) && (adc <= 73))
{
ksave0 |= HAL_KEY_LEFT;
}
else if ((adc >= 39) && (adc <= 59))
{
ksave0 |= HAL_KEY_DOWN;
}
else if ((adc >= 89) && (adc <= 100))
{
ksave0 |= HAL_KEY_CENTER;
}
} while (ksave0 != ksave1);
return ksave0;
}
void halProcessKeyInterrupt (void)
{
bool valid=FALSE;
if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
{
HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT);
valid = TRUE;
}
if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT)
{
HAL_KEY_JOY_MOVE_PXIFG = ~(HAL_KEY_JOY_MOVE_BIT);
valid = TRUE;
}
if (valid)
{
osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);
}
}
void HalKeyEnterSleep ( void )
{
}
uint8 HalKeyExitSleep ( void )
{
return ( HalKeyRead () );
}
HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
{
if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
{
halProcessKeyInterrupt();
}
HAL_KEY_SW_6_PXIFG = 0;
HAL_KEY_CPU_PORT_0_IF = 0;
}
HAL_ISR_FUNCTION( halKeyPort2Isr, P2INT_VECTOR )
{
if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT)
{
halProcessKeyInterrupt();
}
HAL_KEY_JOY_MOVE_PXIFG = 0;
HAL_KEY_CPU_PORT_2_IF = 0;
}
#else
void HalKeyInit(void){}
void HalKeyConfig(bool interruptEnable, halKeyCBack_t cback){}
uint8 HalKeyRead(void){ return 0;}
void HalKeyPoll(void){}
#endif



