📄 bsp.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 + -