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

📄 bsp.c

📁 最新版IAR FOR ARM(EWARM)5.11中的代码例子
💻 C
字号:
/*********************************************************************
 *
 *  IAR PowerPac - RTOS
 *
 *  (c) Copyright IAR Systems 2006.  All rights reserved.
 *
**********************************************************************
----------------------------------------------------------------------
File    : LED.c (for STR75x and IAR compiler)
Purpose : LED interface for IAR ST Giveaway demo board
--------  END-OF-HEADER  ---------------------------------------------
*/

#define BSP_C

#include <ST\iostr750.h>
#include <assert.h>
#include "BSP.h"

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/

/****** Assign LEDs to Ports ****************************************/

// IAR ST Giveaway demo board
#define _PORT2_ALL_LED_MASK 0xFFFF

#define _PORT1_LED_COMM_BIT  9

#define _BUT_MAX_SCAN_PER   200
#define _BUT_MIN_SCAN_PER   10

#define _PC0_OFFSET         (((unsigned int)&GPIO_P0C0 - (unsigned int)&GPIO_P0C0)/sizeof(unsigned int))
#define _PC1_OFFSET         (((unsigned int)&GPIO_P0C2 - (unsigned int)&GPIO_P0C0)/sizeof(unsigned int))
#define _PC2_OFFSET         (((unsigned int)&GPIO_P0C2 - (unsigned int)&GPIO_P0C0)/sizeof(unsigned int))
#define _PD_OFFSET          (((unsigned int)&GPIO_P0D  - (unsigned int)&GPIO_P0C0)/sizeof(unsigned int))

#define _PORT0_BUT1_BIT     29
#define _PORT0_BUT2_BIT     31

typedef struct _ButtonCtrl_t
{
  volatile unsigned long * pButBaseReg;
           unsigned int ButBit;
} ButtonCtrl_t, *pButtonCtrl_t;

typedef struct _ButtonsPairCtrl_t
{
  ButtonCtrl_t Ba;
  ButtonCtrl_t Bb;
} ButtonsPairCtrl_t, *pButtonsPairCtrl_t;

const ButtonsPairCtrl_t ButtonsCtrl[_CAP_BUTTONS_NUMB] =
{
  {
    .Ba=
    {
      .pButBaseReg = &GPIO_P0C0,   // CAP_BUTT_1
      .ButBit = _PORT0_BUT1_BIT,
    },
    .Bb=
    {
      .pButBaseReg = &GPIO_P0C0,   // CAP_BUTT_2
      .ButBit = _PORT0_BUT2_BIT,
    }
  }
};

/*********************************************************************
*
*       Global functions
*
**********************************************************************
*/

/*********************************************************************
*
*       BSP_Init()
*/
void BSP_Init(void)
{
  // Enable GPIO, TIM1 and PWM clk and release reset of these modules
  MRCC_PCLKEN |= ((1UL << 24) |  // GPIO
                  (1UL <<  3) |  // TIM1
                  (1UL <<  5));  // PWM
  MRCC_PSWRES &=~((1UL << 24) |  // GPIO
                  (1UL <<  3) |  // TIM1
                  (1UL <<  5));  // PWM
  // Set all pins LEDs' and buttons to GPIO
  GPIO_P0M &= ~((1UL << _PORT0_BUT1_BIT) | (1UL << _PORT0_BUT2_BIT));
  GPIO_P2M &= ~_PORT2_ALL_LED_MASK;
  GPIO_P0D |= (1UL << _PORT0_BUT1_BIT) | (1UL << _PORT0_BUT2_BIT);
  // Switch off LEDs and initialize buttons' state
#if BOARD_REV == 0
  GPIO_P2D &= ~_PORT2_ALL_LED_MASK;
#else
  GPIO_P2D |= _PORT2_ALL_LED_MASK;
#endif
  // Set LED-Port and Buttons to output
  GPIO_P0C0 |=  (1UL << _PORT0_BUT1_BIT) | (1UL << _PORT0_BUT2_BIT);
  GPIO_P0C1 &=~((1UL << _PORT0_BUT1_BIT) | (1UL << _PORT0_BUT2_BIT));
  GPIO_P0C2 |=  (1UL << _PORT0_BUT1_BIT) | (1UL << _PORT0_BUT2_BIT);

  GPIO_P2C0 |= _PORT2_ALL_LED_MASK;
  GPIO_P2C1 &=~_PORT2_ALL_LED_MASK;
  GPIO_P2C2 |= _PORT2_ALL_LED_MASK;
#ifdef _LED_INTENSITY_CTRL
  // Init PWM Ch 1
  GPIO_P1C0 |=  1UL << _PORT1_LED_COMM_BIT;
  GPIO_P1C1 |=  1UL << _PORT1_LED_COMM_BIT;
  GPIO_P1C2 |=  1UL << _PORT1_LED_COMM_BIT;
  PWM_CR = 1;             // Stop and reset PWM
  PWM_DTR = 0;            // Main Output disabled
  PWM_RER = 0;            // disable al interrupts
  PWM_SCR_bit.SME = 0;    // Slave mode disabled
  PWM_PSC = 0;            // set PWM prescaler /1
  PWM_ARR = 0xFF;         // 8 bit PWM
  PWM_OCR1 = 0xFF;
  PWM_OMR1 = (1UL << 0) | // Preload register on TIM_OCR1 enabled
             (6UL << 1) | // PWM mode
             (1UL << 4) | // OC1 signal is output on the corresponding channel.
#if BOARD_REV == 0
             (0UL << 5);  // OC1 active high
#else
             (1UL << 5);  // OC1 active low
#endif  //  BOARD_REV == 0
  PWM_CR_bit.CNT_EN = 1;  // enable counter
  PWM_DTR_bit.MOE   = 1;  // Main Output Enable
#else
  GPIO_P1M  &= ~(1UL << _PORT1_LED_COMM_BIT);
  GPIO_P1C0 |=   1UL << _PORT1_LED_COMM_BIT;
  GPIO_P1C1 &= ~(1UL << _PORT1_LED_COMM_BIT);
  GPIO_P1C2 |=   1UL << _PORT1_LED_COMM_BIT;
#if BOARD_REV == 0
  GPIO_P1D  |=   1UL << _PORT1_LED_COMM_BIT;
#else
  GPIO_P1D  &= ~(1UL << _PORT1_LED_COMM_BIT);
#endif // BOARD_REV == 0
#endif // _LED_INTENSITY_CTRL

  // Init capacitive BUTTONS
  // Init TIM1
  TIM1_CR = 2;            // Stop and reset timer 1
  TIM1_SCR_bit.SME   = 0; // Slave mode disabled
  TIM1_IMCR_bit.IC1S = 0; // Timer input 1 (TI1) is selected.
  TIM1_IMCR_bit.IC2S = 0; // Timer input 2 (TI2) is selected.
  TIM1_IMCR_bit.IC1P = 1; // falling edge
  TIM1_IMCR_bit.IC2P = 1; // falling edge
  TIM1_IMCR_bit.IC1E = 1; // capture 1 enabled
  TIM1_IMCR_bit.IC2E = 1; // capture 2 enabled
  TIM1_OMR1 = 0;          // disable compares
  TIM1_RER = 0;           // disable request
  TIM1_PSC = 0;           // set prescaler to high resolution
  TIM1_ARR = 0xFFFF;      // maximum counting
}

/*********************************************************************
*
*       BSP_IntensityLED()
*/
void BSP_IntensityLED(unsigned int Intensity)
{
#ifdef _LED_INTENSITY_CTRL
  assert((Intensity <= _LED_INTENSITY_MAX));
  // Calculate true mach value (The LEDs' driver invert PWM output)
  PWM_OCR1 = Intensity;
#else
  if(Intensity)
  {
  #if BOARD_REV == 0
    GPIO_P1D |=   1UL << _PORT1_LED_COMM_BIT;
  #else
    GPIO_P1D &= ~(1UL << _PORT1_LED_COMM_BIT);
  #endif // BOARD_REV == 0
  }
  else
  {
  #if BOARD_REV == 0
    GPIO_P1D &= ~(1UL << PORT1_LED_COMM_BIT);
  #else
    GPIO_P1D |=   1UL << PORT1_LED_COMM_BIT;
  #endif // BOARD_REV == 0
  }
#endif // _LED_INTENSITY_CTRL
}

/*********************************************************************
*
*       LED switching routines
*/

void BSP_SetLED(unsigned int Mask)
{
  #if BOARD_REV == 0
    GPIO_P2D |=  Mask & _PORT2_ALL_LED_MASK;
  #else
    GPIO_P2D &=~(Mask & _PORT2_ALL_LED_MASK);
  #endif // BOARD_REV == 0
}

void BSP_ClrLED(unsigned int Mask)
{
  #if BOARD_REV == 0
    GPIO_P2D &=~(Mask & _PORT2_ALL_LED_MASK);
  #else
    GPIO_P2D |=  Mask & _PORT2_ALL_LED_MASK;
  #endif // BOARD_REV == 0
}

void BSP_ToggleLED(unsigned int Mask)
{
  GPIO_P2D ^=  Mask & _PORT2_ALL_LED_MASK;
}

/*********************************************************************
*
*       Buttons routines
*/
ButtonError_t BSP_GetButton(unsigned int Id, unsigned int * pCount)
{
volatile unsigned int To = _BUT_MAX_SCAN_PER;
unsigned int MasterMask, SlaveMask;
unsigned short Hold, Temp;
volatile unsigned long *pMasterReg, *pSlaveReg;

  assert(Id <= _CAP_BUTTONS_NUMB);
  if(Id & 1)
  {
    pMasterReg = ButtonsCtrl[Id>>1].Ba.pButBaseReg;
    MasterMask = 1UL << ButtonsCtrl[Id>>1].Ba.ButBit;
    pSlaveReg  = ButtonsCtrl[Id>>1].Bb.pButBaseReg;
    SlaveMask  = 1UL << ButtonsCtrl[Id>>1].Bb.ButBit;
  }
  else
  {
    pMasterReg = ButtonsCtrl[Id>>1].Bb.pButBaseReg;
    MasterMask = 1UL << ButtonsCtrl[Id>>1].Bb.ButBit;
    pSlaveReg  = ButtonsCtrl[Id>>1].Ba.pButBaseReg;
    SlaveMask  = 1UL << ButtonsCtrl[Id>>1].Ba.ButBit;
  }

  TIM1_ISR = 0;  // clear captures flags
  // Button scan algorithm
  // 1. Starting state Ba-o1 (Port Ba Output H), Bb-o1
  // 2. Set Ba i (input)
  *(pSlaveReg + _PC2_OFFSET) &= ~SlaveMask;
  // 3. Set Bb o0
  TIM1_CR_bit.CNT_EN = 1; // enable Timer
  *(pMasterReg + _PD_OFFSET) &= ~MasterMask;
  // 4. wait and counting until Ba state get 0
  while((TIM1_ISR & ((1UL << 2) | (1UL << 3))) != ((1UL << 2) | (1UL << 3)))
  {
    if(!To)
    {
      break;
    }
    --To;
  }
  if(Id & 1)
  {
    Temp = TIM1_ICR2;
    Hold = Temp - TIM1_ICR1;
  }
  else
  {
    Temp = TIM1_ICR1;
    Hold = Temp - TIM1_ICR2;
  }

  // 5. Ba o0
  *(pSlaveReg + _PD_OFFSET) &= ~SlaveMask;
  *(pSlaveReg + _PC2_OFFSET)|=  SlaveMask;
  TIM1_IMCR ^= ((1UL << 3) | (1UL << 5)); // change captures polarity
  TIM1_ISR = 0;   // clear captures flags
  // 6. Set Ba i
  *(pSlaveReg + _PC2_OFFSET)&=~SlaveMask;
  // 7. Set Bb o1
  *(pMasterReg + _PD_OFFSET)|= MasterMask;
  // 8. wait and counting until Ba state get 1
  while((TIM1_ISR & ((1UL << 2) | (1UL << 3))) != ((1UL << 2) | (1UL << 3)))
  {
    if(!To)
    {
      break;
    }
    --To;
  }
  if(Id & 1)
  {
    Temp = TIM1_ICR2;
    Hold += Temp - TIM1_ICR1;
  }
  else
  {
    Temp = TIM1_ICR1;
    Hold += Temp - TIM1_ICR2;
  }
  TIM1_CR_bit.CNT_EN = 0; // Disable Timer
  TIM1_IMCR ^= ((1UL << 3) | (1UL << 5));     // change captures polarity
  // 9. Set Ba o1
  *(pSlaveReg + _PD_OFFSET)   |= SlaveMask;
  *(pSlaveReg + _PC2_OFFSET ) |= SlaveMask;
  if(Hold < 2)
  {
    return(BUTT_TO_ERROR);
  }

  if(To == _BUT_MAX_SCAN_PER)
  {
    return(BUTT_SHORT_ERROR);
  }

  *pCount = Hold;
  return(BUTT_OK);
}


/****** EOF *********************************************************/

⌨️ 快捷键说明

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