📄 stm8_tsl_rc_iodriver.c
字号:
* If the hardware cell is used, the responsability of the I/O configuration is
* given to the user layer.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_IO_Init(void)
{
// LOADREF pin
((GPIO_TypeDef *)(LOADREF_PORT_ADDR))->CR1 |= LOADREF_BIT;
((GPIO_TypeDef *)(LOADREF_PORT_ADDR))->DDR |= LOADREF_BIT;
((GPIO_TypeDef *)(LOADREF_PORT_ADDR))->ODR &= (u8)(~LOADREF_BIT);
// Single-Channel and Multi-channels pins
#if GPIOA_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOA_BaseAddress))->CR1 |= GPIOA_ELECTRODES_MASK;
#endif
#if GPIOB_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOB_BaseAddress))->CR1 |= GPIOB_ELECTRODES_MASK;
#endif
#if GPIOC_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOC_BaseAddress))->CR1 |= GPIOC_ELECTRODES_MASK;
#endif
#if GPIOD_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOD_BaseAddress))->CR1 |= GPIOD_ELECTRODES_MASK;
#endif
#if GPIOE_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOE_BaseAddress))->CR1 |= GPIOE_ELECTRODES_MASK;
#endif
#if GPIOF_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOF_BaseAddress))->CR1 |= GPIOF_ELECTRODES_MASK;
#endif
#if GPIOG_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOG_BaseAddress))->CR1 |= GPIOG_ELECTRODES_MASK;
#endif
#if GPIOH_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOH_BaseAddress))->CR1 |= GPIOH_ELECTRODES_MASK;
#endif
#if GPIOI_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOI_BaseAddress))->CR1 |= GPIOI_ELECTRODES_MASK;
#endif
TSL_IO_Clamp();
/* Init Timer used to measure VIH/VIL */
TIMACQ->PSCR = 0;
TIMACQ->CR1 = 0x01;
}
/**
******************************************************************************
* @brief Put All Sensing I/Os in ouput mode at 0.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_IO_Clamp(void)
{
// LOADREF pin
((GPIO_TypeDef *)(LOADREF_PORT_ADDR))->ODR &= (u8)(~LOADREF_BIT);
// Single-Channel and Multi-channels pins
#if GPIOA_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOA_BaseAddress))->ODR &= (u8)(~GPIOA_ELECTRODES_MASK);
((GPIO_TypeDef *)(GPIOA_BaseAddress))->DDR |= GPIOA_ELECTRODES_MASK;
#endif
#if GPIOB_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOB_BaseAddress))->ODR &= (u8)(~GPIOB_ELECTRODES_MASK);
((GPIO_TypeDef *)(GPIOB_BaseAddress))->DDR |= GPIOB_ELECTRODES_MASK;
#endif
#if GPIOC_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOC_BaseAddress))->ODR &= (u8)(~GPIOC_ELECTRODES_MASK);
((GPIO_TypeDef *)(GPIOC_BaseAddress))->DDR |= GPIOC_ELECTRODES_MASK;
#endif
#if GPIOD_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOD_BaseAddress))->ODR &= (u8)(~GPIOD_ELECTRODES_MASK);
((GPIO_TypeDef *)(GPIOD_BaseAddress))->DDR |= GPIOD_ELECTRODES_MASK;
#endif
#if GPIOE_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOE_BaseAddress))->ODR &= (u8)(~GPIOE_ELECTRODES_MASK);
((GPIO_TypeDef *)(GPIOE_BaseAddress))->DDR |= GPIOE_ELECTRODES_MASK;
#endif
#if GPIOF_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOF_BaseAddress))->ODR &= (u8)(~GPIOF_ELECTRODES_MASK);
((GPIO_TypeDef *)(GPIOF_BaseAddress))->DDR |= GPIOF_ELECTRODES_MASK;
#endif
#if GPIOG_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOG_BaseAddress))->ODR &= (u8)(~GPIOG_ELECTRODES_MASK);
((GPIO_TypeDef *)(GPIOG_BaseAddress))->DDR |= GPIOG_ELECTRODES_MASK;
#endif
#if GPIOH_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOH_BaseAddress))->ODR &= (u8)(~GPIOH_ELECTRODES_MASK);
((GPIO_TypeDef *)(GPIOH_BaseAddress))->DDR |= GPIOH_ELECTRODES_MASK;
#endif
#if GPIOI_ELECTRODES_MASK > 0
((GPIO_TypeDef *)(GPIOI_BaseAddress))->ODR &= (u8)(~GPIOI_ELECTRODES_MASK);
((GPIO_TypeDef *)(GPIOI_BaseAddress))->DDR |= GPIOI_ELECTRODES_MASK;
#endif
}
/**
******************************************************************************
* @brief Local sub function to restart timer for acquisition.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_IO_SW_Burst_Start_Timer(void)
{
TIMACQ->EGR |= 0x01;
}
/**
******************************************************************************
* @brief Local sub function to get timer count for acquisition.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_IO_SW_Burst_Stop_Timer(void)
{
#asm
ld a, _TIMACQ_CNTR
ld _CounterStop, a
ld a, _TIMACQ_CNTR + 1
ld _CounterStop + 1, a
#endasm
}
/**
******************************************************************************
* @brief Handles RC charge / discharge timing measurement.
* @param[in] AcqNumber Number of times the acquisition is done.
* @param[in] AdjustmentLevel Used to adjust the measured level.
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_IO_Acquisition(u8 AcqNumber, u8 AdjustmentLevel)
{
u16 MaxMeasurement, MinMeasurement, CumulatedMeasurement, Measurement;
u8 MeasRejected, RejectionCounter;
u8 AcqLoopIndex;
u32 tmpval;
AcquisitionBitMask = sTouchIO.AcqMask;
MinMeasurement = 0;
MaxMeasurement = 0;
FinalMeasurementValue = 0;
RejectionCounter = 0;
/* Whole acquisition synchronisation */
/* The IT_Sync_Flag.start must be set to 1 inside an IT or it will loop forever */
#ifdef IT_SYNC
if (IT_Sync_Flags.one_acquisition_sync_enable)
{
IT_Sync_Flags.start = 0;
while (IT_Sync_Flags.start == 0);
}
#endif
for ( AcqLoopIndex = 0; AcqLoopIndex < AcqNumber; AcqLoopIndex++ )
{
/* single measurement synchronisation */
/* The IT_Sync_Flag.start must be set to 1 inside an IT or it will loop forever */
#ifdef IT_SYNC
if (IT_Sync_Flags.one_measure_sync_enable)
{
IT_Sync_Flags.start = 0;
while (IT_Sync_Flags.start == 0);
}
#endif
do
{
MeasRejected = 0;
CumulatedMeasurement = 0;
for ( SamplingShifter = SAMPLING_SHIFTER_LOOP_START;
SamplingShifter < (SAMPLING_SHIFTER_NB_LOOPS + SAMPLING_SHIFTER_LOOP_START);
SamplingShifter++ )
{
/* VIH measurement */
disableInterrupts();
sTouchIO.PORT_ADDR->ODR &= (u8)(~sTouchIO.DriveMask);
sTouchIO.PORT_ADDR->DDR |= sTouchIO.DriveMask;
sTouchIO.PORT_ADDR->CR1 &= (u8)(~sTouchIO.DriveMask);
((GPIO_TypeDef *) (LOADREF_PORT_ADDR))->ODR |= LOADREF_BIT;
enableInterrupts();
/* Single charge Aquisition synchronisation */
/* The IT_Sync_Flag.start must be set to 1 inside an IT or it will loop forever */
#ifdef IT_SYNC
if (IT_Sync_Flags.one_charge_sync_enable)
{
IT_Sync_Flags.start = 0;
while (IT_Sync_Flags.start == 0);
}
#endif
#ifdef SPREAD_SPECTRUM
TSL_IO_SW_Spread_Spectrum();
#endif
disableInterrupts();
TSL_IO_SW_Burst_Start_Timer();
sTouchIO.PORT_ADDR->DDR &= (u8)(~sTouchIO.DriveMask);
TSL_IO_SW_Burst_TestSyncShift();
TSL_IO_SW_Burst_Wait_Vih();
TSL_IO_SW_Burst_Stop_Timer();
Measurement = CounterStop;
/* VIL measurement */
sTouchIO.PORT_ADDR->ODR |= sTouchIO.DriveMask;
sTouchIO.PORT_ADDR->DDR |= sTouchIO.DriveMask;
sTouchIO.PORT_ADDR->CR1 |= sTouchIO.DriveMask;
((GPIO_TypeDef *) (LOADREF_PORT_ADDR))->ODR &= (u8)(~LOADREF_BIT);
enableInterrupts();
/* Single charge Aquisition synchronization */
/* The IT_Sync_Flag.start must be set to 1 inside an IT or it will loop forever */
#ifdef IT_SYNC
if (IT_Sync_Flags.one_charge_sync_enable)
{
IT_Sync_Flags.start = 0;
while (IT_Sync_Flags.start == 0);
}
#endif
#ifdef SPREAD_SPECTRUM
TSL_IO_SW_Spread_Spectrum();
#endif
disableInterrupts();
TSL_IO_SW_Burst_Start_Timer();
sTouchIO.PORT_ADDR->CR1 &= (u8)(~sTouchIO.DriveMask);
sTouchIO.PORT_ADDR->DDR &= (u8)(~sTouchIO.DriveMask);
TSL_IO_SW_Burst_TestSyncShift();
TSL_IO_SW_Burst_Wait_Vil();
TSL_IO_SW_Burst_Stop_Timer();
Measurement += CounterStop;
CumulatedMeasurement += Measurement;
/* Calculation of the min/max limits */
if (SamplingShifter == SAMPLING_SHIFTER_LOOP_START)
{
tmpval = (u32)((u32)Measurement * MAX_MEAS_COEFF);
MaxMeasurement = (u16)((u16)(tmpval >> 8) + NB_CYCLES_VIHVIL_LOOP);
tmpval = (u32)((u32)Measurement * MIN_MEAS_COEFF);
MinMeasurement = (u16)((u16)(tmpval >> 8) - NB_CYCLES_VIHVIL_LOOP);
}
else /* Compare measurement with min/max limit */
{
if ((Measurement < MinMeasurement) || (Measurement > MaxMeasurement))
{
MeasRejected++;
RejectionCounter++;
break; // Out from 'for SamplingShifter' loop !!!
}
}
} /* for SamplingShifter... */
}
while (MeasRejected && (RejectionCounter <= MAX_REJECTED_MEASUREMENTS));
if (MeasRejected == 0)
{
FinalMeasurementValue += CumulatedMeasurement;
}
else // RejectionCounter > MAX_REJECTED_MEASUREMENTS
{
break; // Out from 'for AcqLoopIndex' loop !!!
}
} /* for AcqLoopIndex... */
TSL_IO_Clamp(); // To avoid consumption
enableInterrupts();
*sTouchIO.RejectedNb = RejectionCounter;
if (RejectionCounter <= MAX_REJECTED_MEASUREMENTS)
{
FinalMeasurementValue = (u32)(FinalMeasurementValue >> 3); /* Division by SAMPLING_SHIFTER_NB_LOOPS */
while ( AdjustmentLevel-- )
{
FinalMeasurementValue = (u32)(FinalMeasurementValue >> 1);
}
*sTouchIO.Measurement = (u16)FinalMeasurementValue;
}
else // Too many rejected measures...
{
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 0
if (sTouchIO.Type == SCKEY_TYPE)
{
#endif
pKeyStruct->Setting.b.NOISE = 1; /* Warning: Application layer must reset this flag */
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 0
}
else // MCKEY_TYPE
{
pMCKeyStruct->Setting.b.NOISE = 1; /* Warning: Application layer must reset this flag */
}
#endif
}
}
/*********************** (c) 2009 STMicroelectronics **************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -