mirror of
https://github.com/oopuuu/zTC1.git
synced 2025-12-17 15:38:14 +08:00
163 lines
5.5 KiB
C
163 lines
5.5 KiB
C
/**
|
|
******************************************************************************
|
|
* @file paltform_adc.c
|
|
* @author William Xu
|
|
* @version V1.0.0
|
|
* @date 05-May-2014
|
|
* @brief This file provide ADC driver functions.
|
|
******************************************************************************
|
|
* UNPUBLISHED PROPRIETARY SOURCE CODE
|
|
* Copyright (c) 2016 MXCHIP Inc.
|
|
*
|
|
* The contents of this file may not be disclosed to third parties, copied or
|
|
* duplicated in any form, in whole or in part, without the prior written
|
|
* permission of MXCHIP Corporation.
|
|
******************************************************************************
|
|
*/
|
|
|
|
#include "platform.h"
|
|
#include "platform_peripheral.h"
|
|
#include "stm32f2xx.h"
|
|
#include "platform_logging.h"
|
|
|
|
/******************************************************
|
|
* Constants
|
|
******************************************************/
|
|
|
|
/******************************************************
|
|
* Enumerations
|
|
******************************************************/
|
|
|
|
/******************************************************
|
|
* Type Definitions
|
|
******************************************************/
|
|
|
|
/******************************************************
|
|
* Structures
|
|
******************************************************/
|
|
|
|
/******************************************************
|
|
* Variables Definitions
|
|
******************************************************/
|
|
static const uint16_t adc_sampling_cycle[] =
|
|
{
|
|
[ADC_SampleTime_3Cycles ] = 3,
|
|
[ADC_SampleTime_15Cycles ] = 15,
|
|
[ADC_SampleTime_28Cycles ] = 28,
|
|
[ADC_SampleTime_56Cycles ] = 56,
|
|
[ADC_SampleTime_84Cycles ] = 84,
|
|
[ADC_SampleTime_112Cycles] = 112,
|
|
[ADC_SampleTime_144Cycles] = 144,
|
|
[ADC_SampleTime_480Cycles] = 480,
|
|
};
|
|
|
|
/******************************************************
|
|
* Function Declarations
|
|
******************************************************/
|
|
|
|
|
|
/******************************************************
|
|
* Function Definitions
|
|
******************************************************/
|
|
|
|
|
|
OSStatus platform_adc_init( const platform_adc_t* adc, uint32_t sample_cycle )
|
|
{
|
|
GPIO_InitTypeDef gpio_init_structure;
|
|
ADC_InitTypeDef adc_init_structure;
|
|
ADC_CommonInitTypeDef adc_common_init_structure;
|
|
uint8_t a;
|
|
OSStatus err = kNoErr;
|
|
|
|
platform_mcu_powersave_disable();
|
|
|
|
require_action_quiet( adc != NULL, exit, err = kParamErr);
|
|
|
|
/* Enable peripheral clock for this port */
|
|
err = platform_gpio_enable_clock( adc->pin );
|
|
require_noerr(err, exit);
|
|
|
|
/* Initialize the associated GPIO */
|
|
gpio_init_structure.GPIO_Pin = (uint32_t)( 1 << adc->pin->pin_number );;
|
|
gpio_init_structure.GPIO_Speed = (GPIOSpeed_TypeDef) 0;
|
|
gpio_init_structure.GPIO_Mode = GPIO_Mode_AN;
|
|
gpio_init_structure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
|
gpio_init_structure.GPIO_OType = GPIO_OType_OD;
|
|
GPIO_Init( adc->pin->port, &gpio_init_structure );
|
|
|
|
RCC_APB2PeriphClockCmd( adc->adc_peripheral_clock, ENABLE );
|
|
|
|
/* Initialize the ADC */
|
|
ADC_StructInit( &adc_init_structure );
|
|
adc_init_structure.ADC_Resolution = ADC_Resolution_12b;
|
|
adc_init_structure.ADC_ScanConvMode = DISABLE;
|
|
adc_init_structure.ADC_ContinuousConvMode = DISABLE;
|
|
adc_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
|
|
adc_init_structure.ADC_DataAlign = ADC_DataAlign_Right;
|
|
adc_init_structure.ADC_NbrOfConversion = 1;
|
|
ADC_Init( adc->port, &adc_init_structure );
|
|
|
|
ADC_CommonStructInit( &adc_common_init_structure );
|
|
adc_common_init_structure.ADC_Mode = ADC_Mode_Independent;
|
|
adc_common_init_structure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
|
|
adc_common_init_structure.ADC_Prescaler = ADC_Prescaler_Div2;
|
|
adc_common_init_structure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
|
|
ADC_CommonInit( &adc_common_init_structure );
|
|
|
|
ADC_Cmd( adc->port, ENABLE );
|
|
|
|
/* Find the closest supported sampling time by the MCU */
|
|
for ( a = 0; ( a < sizeof( adc_sampling_cycle ) / sizeof(uint16_t) ) && adc_sampling_cycle[a] < sample_cycle; a++ )
|
|
{
|
|
}
|
|
|
|
/* Initialize the ADC channel */
|
|
ADC_RegularChannelConfig( adc->port, adc->channel, adc->rank, a );
|
|
|
|
exit:
|
|
platform_mcu_powersave_enable();
|
|
return err;
|
|
}
|
|
|
|
OSStatus platform_adc_take_sample( const platform_adc_t* adc, uint16_t* output )
|
|
{
|
|
OSStatus err = kNoErr;
|
|
|
|
platform_mcu_powersave_disable();
|
|
|
|
require_action_quiet( adc != NULL, exit, err = kParamErr);
|
|
|
|
/* Start conversion */
|
|
ADC_SoftwareStartConv( adc->port );
|
|
|
|
/* Wait until end of conversion */
|
|
while ( ADC_GetFlagStatus( adc->port, ADC_FLAG_EOC ) == RESET )
|
|
{
|
|
}
|
|
|
|
/* Read ADC conversion result */
|
|
*output = ADC_GetConversionValue( adc->port );
|
|
|
|
exit:
|
|
platform_mcu_powersave_enable();
|
|
return err;
|
|
}
|
|
|
|
OSStatus platform_adc_take_sample_stream( const platform_adc_t* adc, void* buffer, uint16_t buffer_length )
|
|
{
|
|
UNUSED_PARAMETER(adc);
|
|
UNUSED_PARAMETER(buffer);
|
|
UNUSED_PARAMETER(buffer_length);
|
|
platform_log("unimplemented");
|
|
return kNotPreparedErr;
|
|
}
|
|
|
|
OSStatus platform_adc_deinit( const platform_adc_t* adc )
|
|
{
|
|
UNUSED_PARAMETER(adc);
|
|
platform_log("unimplemented");
|
|
return kNotPreparedErr;
|
|
}
|
|
|
|
|