⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hal.h

📁 SmartRF04EB+CC2431EM的测试代码
💻 H
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************
*                                                                             *
*        **********                                                           *
*       ************                                                          *
*      ***        ***                                                         *
*     ***    ++    ***                                                        *
*     ***   +  +   ***                      CHIPCON                           *
*     ***   +                                                                 *
*     ***   +  +   ***                                                        *
*     ***    ++    ***                                                        *
*      ***        ***                                                         *
*       ************                                                          *
*        **********                                                           *
*                                                                             *
*******************************************************************************

Filename:     hal.h
Target:       cc2430
Author:       cuiqingwei [modify]
Revised:      1/3-2007
Revision:     1.1

Description:
Hardware Abstraction Layer, Utility Library.

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

#ifndef HAL_H
#define HAL_H

#include "ioCC2430.h"
#include <stdbool.h>

/******************************************************************************
*******************              Chip revisions             *******************
******************************************************************************/
#define REV_A   0x00
#define REV_B   0x01
#define REV_C   0x02
#define REV_D   0x03
#define REV_E   0x04


/******************************************************************************
*******************              Commonly used types        *******************
******************************************************************************/
// Data
typedef unsigned char       byte;
typedef unsigned short      word;
typedef unsigned long       dword;

// Unsigned numbers
typedef unsigned char       uint8;
typedef unsigned short      uint16;
typedef unsigned long       uint32;

// Signed numbers
typedef signed char         int8;
typedef signed short        int16;
typedef signed long         int32;

// Common values
#ifndef FALSE
   #define FALSE 0
#endif

#ifndef TRUE
   #define TRUE 1
#endif

#ifndef NULL
   #define NULL 0
#endif

#ifndef HIGH
   #define HIGH 1
#endif

#ifndef LOW
   #define LOW 0
#endif


/******************************************************************************
*******************        Bit, byte and word macros        *******************
******************************************************************************/

// bit mask
#define BM( b )       ( 0x01 << ( b ))

#define HIBYTE(a)     (byte) ((word)(a) >> 8 )
#define LOBYTE(a)     (byte)  (word)(a)

#define SET_WORD(regH, regL, WORD) \
   do{                             \
      (regH) = HIBYTE( WORD );     \
      (regL) = LOBYTE( WORD );     \
   }while(0)

#define GET_WORD(regH, regL, WORD) \
   do{                             \
      WORD = (word)regH << 8;      \
      WORD |= regL;                \
   }while(0)
/*
 *  This macro is for use by other macros to form a fully valid C statement.
 *  Without this, the if/else conditionals could show unexpected behavior.
 *
 *  For example, use...
 *    #define SET_REGS()  st( ioreg1 = 0; ioreg2 = 0; )
 *  instead of ...
 *    #define SET_REGS()  { ioreg1 = 0; ioreg2 = 0; }
 *  or
 *    #define  SET_REGS()    ioreg1 = 0; ioreg2 = 0;
 *  The last macro would not behave as expected in the if/else construct.
 *  The second to last macro will cause a compiler error in certain uses
 *  of if/else construct
 *
 *  It is not necessary, or recommended, to use this macro where there is
 *  already a valid C statement.  For example, the following is redundant...
 *    #define CALL_FUNC()   st(  func();  )
 *  This should simply be...
 *    #define CALL_FUNC()   func()
 *
 * (The while condition below evaluates false without generating a
 *  constant-controlling-loop type of warning on most compilers.)
 */
#define st(x)      do { x } while (__LINE__ == -1)
/******************************************************************************
*******************             Port functions/macros       *******************
*******************************************************************************

Macros for simplifying access to I/O pin setup and usage.

MCU pin configuration:
---------------------------------------------
| Peripheral I/O signal  |  Alt1   |   Alt2 |
---------------------------------------------
| Timer1 channel0        |  P0.2   |   P1.2 |
| Timer1 channel1        |  P0.3   |   P1.1 |
| Timer1 channel2        |  P0.4   |   P1.0 |
| Timer3 channel0        |  P1.3   |   P1.6 |
| Timer3 channel1        |  P1.4   |   P1.7 |
| Timer4 channel0        |  P1.0   |   P2.0 |
| Timer4 channel1        |  P1.1   |   P2.3 |
| USART0 TXD/MOSI        |  P0.3   |   P1.5 |
| USART0 RXD/MISO        |  P0.2   |   P1.4 |
| USART0 RTS/SCK         |  P0.5   |   P1.3 |
| USART0 CTS/SS_N        |  P0.4   |   P1.2 |
| USART1 TXD/MOSI        |  P0.4   |   P1.6 |
| USART1 RXD/MISO        |  P0.5   |   P1.7 |
| USART1 RTS/SCK         |  P0.3   |   P1.5 |
| USART1 CTS/SS_N        |  P0.2   |   P1.4 |
---------------------------------------------

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


// Macros for configuring IO peripheral location:
// Example usage:
//   IO_PER_LOC_TIMER1_AT_PORT0_PIN234();
//   IO_PER_LOC_TIMER4_AT_PORT2_PIN03();
//   IO_PER_LOC_USART1_AT_PORT0_PIN2345();

#define IO_PER_LOC_TIMER1_AT_PORT0_PIN234()  do { PERCFG = (PERCFG&~0x40)|0x00; } while (0)
#define IO_PER_LOC_TIMER1_AT_PORT1_PIN012()  do { PERCFG = (PERCFG&~0x40)|0x40; } while (0)

#define IO_PER_LOC_TIMER3_AT_PORT1_PIN34()   do { PERCFG = (PERCFG&~0x20)|0x00; } while (0)
#define IO_PER_LOC_TIMER3_AT_PORT1_PIN67()   do { PERCFG = (PERCFG&~0x20)|0x20; } while (0)

#define IO_PER_LOC_TIMER4_AT_PORT1_PIN01()   do { PERCFG = (PERCFG&~0x10)|0x00; } while (0)
#define IO_PER_LOC_TIMER4_AT_PORT2_PIN03()   do { PERCFG = (PERCFG&~0x10)|0x10; } while (0)

#define IO_PER_LOC_USART1_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x02)|0x00; } while (0)
#define IO_PER_LOC_USART1_AT_PORT1_PIN4567() do { PERCFG = (PERCFG&~0x02)|0x02; } while (0)

#define IO_PER_LOC_USART0_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x01)|0x00; } while (0)
#define IO_PER_LOC_USART0_AT_PORT1_PIN2345() do { PERCFG = (PERCFG&~0x01)|0x01; } while (0)



// Macros for configuring IO direction:
// Example usage:
//   IO_DIR_PORT_PIN(0, 3, IO_IN);    // Set P0_3 to input
//   IO_DIR_PORT_PIN(2, 1, IO_OUT);   // Set P2_1 to output

#define IO_DIR_PORT_PIN(port, pin, dir)  \
   do {                                  \
      if (dir == IO_OUT)                 \
         P##port##DIR |= BM( pin );      \
      else                               \
         P##port##DIR &= ~BM( pin );     \
   }while(0)

// Where port={0,1,2}, pin={0,..,7} and dir is one of:
#define IO_IN   0
#define IO_OUT  1

// Macros for configuring IO input mode:
// Example usage:
//   IO_IMODE_PORT_PIN(0, 0, IO_IMODE_PUD);
//   IO_IMODE_PORT_PIN(2, 0, IO_IMODE_TRI);
//   IO_IMODE_PORT_PIN(1, 3, IO_IMODE_PUD);

#define IO_IMODE_PORT_PIN(port, pin, imode) \
   do {                                     \
      if (imode == IO_IMODE_TRI)            \
         P##port##INP |= BM( pin );         \
      else                                  \
         P##port##INP &= ~BM( pin );        \
   } while (0)

// where imode is one of:
#define IO_IMODE_PUD  0 // Pull-up/pull-down
#define IO_IMODE_TRI  1 // Tristate

// Macro for configuring IO drive mode:
// Example usage:
//   IIO_PUD_PORT(0, IO_PULLUP);
//   IIO_PUD_PORT(1, IO_PULLDOWN);
//   IIO_PUD_PORT(2, IO_PULLUP);

#define IO_PUD_PORT(port, pud)        \
   do {                               \
      if (pud == IO_PULLDOWN)         \
         P2INP |= BM( port + 5 );     \
      else                            \
         P2INP &= ~BM( port + 5 );    \
   } while (0)

#define IO_PULLUP          0
#define IO_PULLDOWN        1

// Macros for function select (General purpose I/O / Peripheral function):
// Example usage:
//   IO_FUNC_PORT0_PIN0(0, 0, IO_FUNC_PERIPH);
//   IO_FUNC_PORT0_PIN1(0, 1, IO_FUNC_GIO);
//   IO_FUNC_PORT2_PIN3(2, 3, IO_FUNC_PERIPH);

#define IO_FUNC_PORT_PIN(port, pin, func)  \
   do {                                    \
      if((port == 2) && (pin == 3)){       \
         if (func) {                       \
            P2SEL |= 0x02;                 \
         } else {                          \
            P2SEL &= ~0x02;                \
         }                                 \
      }                                    \
      else if((port == 2) && (pin == 4)){  \
         if (func) {                       \
            P2SEL |= 0x04;                 \
         } else {                          \
            P2SEL &= ~0x04;                \
         }                                 \
      }                                    \
      else{                                \
         if (func) {                       \
            P##port##SEL |= BM( pin );     \
         } else {                          \
            P##port##SEL &= ~BM( pin );    \
        }                                  \
      }                                    \
   } while (0)

// where func is one of:
#define IO_FUNC_GIO     0 // General purpose I/O
#define IO_FUNC_PERIPH  1 // Peripheral function

// Macros for configuring the ADC input:
// Example usage:
//   IO_ADC_PORT0_PIN(0, IO_ADC_EN);
//   IO_ADC_PORT0_PIN(4, IO_ADC_DIS);
//   IO_ADC_PORT0_PIN(6, IO_ADC_EN);

#define IO_ADC_PORT0_PIN(pin, adcEn)  \
  do {                                \
    if (adcEn)                        \
      ADCCFG |= BM( pin );            \
    else                              \
      ADCCFG &= ~BM( pin );           \
  }while (0)

// where adcEn is one of:
#define IO_ADC_EN           1 // ADC input enabled
#define IO_ADC_DIS          0 // ADC input disab


/******************************************************************************
*******************       Interrupt functions/macros        *******************
*******************************************************************************

Macros which simplify access to interrupt enables, interrupt flags and
interrupt priorities. Increases code legibility.

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -