786 lines
25 KiB
C
786 lines
25 KiB
C
/**
|
|
******************************************************************************
|
|
* @file HAL_adc.c
|
|
* @author AE Team
|
|
* @version V1.0.0
|
|
* @date 28/7/2017
|
|
* @brief This file provides all the ADC firmware functions.
|
|
******************************************************************************
|
|
* @copy
|
|
*
|
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
* TIME. AS A RESULT, MindMotion SHALL NOT BE HELD LIABLE FOR ANY
|
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
*
|
|
* <h2><center>© COPYRIGHT 2017 MindMotion</center></h2>
|
|
*/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "HAL_adc.h"
|
|
#include "HAL_rcc.h"
|
|
|
|
/** @addtogroup StdPeriph_Driver
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup ADC
|
|
* @brief ADC driver modules
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup ADC_Private_TypesDefinitions
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup ADC_Private_Defines
|
|
* @{
|
|
*/
|
|
|
|
|
|
/* ADCR register Mask */
|
|
#define ADCR_CLEAR_Mask ((uint32_t)0xFFFFF183)
|
|
|
|
/* ADCFG register Mask */
|
|
#define ADCFG_CLEAR_Mask ((uint32_t)0xFFFFFF8F)
|
|
|
|
/* ADC ADEN mask */
|
|
#define ADCFG_ADEN_Set ((uint32_t)0x00000001)
|
|
#define ADCFG_ADEN_Reset ((uint32_t)0xFFFFFFFE)
|
|
|
|
/* ADC DMA mask */
|
|
#define ADCR_DMA_Set ((uint32_t)0x00000008)
|
|
#define ADCR_DMA_Reset ((uint32_t)0xFFFFFFF7)
|
|
|
|
/* ADC Software start mask */
|
|
#define ADCR_SWSTART_Set ((uint32_t)0x00000100)
|
|
#define ADCR_SWSTART_Reset ((uint32_t)0xFFFFFEFF)
|
|
|
|
/* ADC EXTTRIG mask */
|
|
#define ADCR_EXTTRIG_Set ((uint32_t)0x00000004)
|
|
#define ADCR_EXTTRIG_Reset ((uint32_t)0xFFFFFFFB)
|
|
|
|
/*seletec channle enable */
|
|
#define CHEN0_ENABLE ((uint32_t)0x00000001)
|
|
#define CHEN1_ENABLE ((uint32_t)0x00000002)
|
|
#define CHEN2_ENABLE ((uint32_t)0x00000004)
|
|
#define CHEN3_ENABLE ((uint32_t)0x00000008)
|
|
#define CHEN4_ENABLE ((uint32_t)0x00000010)
|
|
#define CHEN5_ENABLE ((uint32_t)0x00000020)
|
|
#define CHEN6_ENABLE ((uint32_t)0x00000040)
|
|
#define CHEN7_ENABLE ((uint32_t)0x00000080)
|
|
#define CHEN8_ENABLE ((uint32_t)0x00000100)
|
|
#define CHALL_ENABLE ((uint32_t)0x000001ff)
|
|
|
|
#define CHEN_DISABLE ((uint32_t)0xFFFFFE00)
|
|
|
|
/* ADC EXTSEL mask */
|
|
#define ADCR_EXTSEL_Reset ((uint32_t)0xFFFFFF8F)
|
|
|
|
/* ADC Analog watchdog enable mode mask */
|
|
#define ADCFG_AWDMode_Reset ((uint32_t)0xFFFFFFFD)
|
|
|
|
/* ADC AWDCH mask */
|
|
#define ADCR_AWDCH_Reset ((uint32_t)0xFFFF0FFF)
|
|
|
|
/* ADC TSPD mask */
|
|
#define ADCHS_TSVREFE_Set ((uint32_t)0x00000100)
|
|
#define ADCHS_TSVREFE_Reset ((uint32_t)0xFFFFFEFF)
|
|
|
|
/* ADC1 DATA register base address */
|
|
#define ADDATA_ADDRESS ((uint32_t)0x40012400)
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup ADC_Private_Macros
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup ADC_Private_Variables
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup ADC_Private_FunctionPrototypes
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup ADC_Private_Functions
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Deinitializes the ADCx peripheral registers to their default
|
|
* reset values.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @retval : None
|
|
*/
|
|
void ADC_DeInit(ADC_TypeDef* ADCx)
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
switch (*(uint32_t*)&ADCx)
|
|
{
|
|
case ADC1_BASE:
|
|
/* Enable ADC1 reset state */
|
|
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE);
|
|
/* Release ADC1 from reset state */
|
|
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE);
|
|
break;
|
|
|
|
case ADC2_BASE:
|
|
/* Enable ADC2 reset state */
|
|
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE);
|
|
/* Release ADC2 from reset state */
|
|
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Initializes the ADCx peripheral according to the specified parameters
|
|
* in the ADC_InitStruct.
|
|
* @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral.
|
|
* @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure that
|
|
* contains the configuration information for the specified
|
|
* ADC peripheral.
|
|
* @retval : None
|
|
*/
|
|
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)
|
|
{
|
|
uint32_t tmpreg1 = 0;
|
|
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_MODE(ADC_InitStruct->ADC_Mode));
|
|
assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode));
|
|
assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode));
|
|
assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv));
|
|
assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign));
|
|
assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfChannel));
|
|
/*---------------------------- ADCx ADCFG Configuration -----------------*/
|
|
/* Get the ADCx ADCFG value */
|
|
tmpreg1 = ADCx->ADCFG;
|
|
/* Clear ADCPRE bits */
|
|
tmpreg1 &= ADCFG_CLEAR_Mask;
|
|
/* Configure ADCx: AD convertion prescare*/
|
|
/* Set ADCPRE bit according to ADC_PRESCARE value */
|
|
tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_PRESCARE)|ADC_InitStruct->ADC_Resolution;
|
|
/* Write to ADCx ADCFG */
|
|
ADCx->ADCFG = tmpreg1;
|
|
|
|
/*---------------------------- ADCx ADCR Configuration -----------------*/
|
|
/* Get the ADCx ADCR value */
|
|
tmpreg1 = ADCx->ADCR;
|
|
/* Clear ALIGN , ADMD, and TRGEN and TRGSEL bits */
|
|
tmpreg1 &= ADCR_CLEAR_Mask;
|
|
/* Configure ADCx: external trigger event and AD conversion mode and ALIGN*/
|
|
/* Set ALIGN bit according to ADC_DataAlign value */
|
|
/* Set TRGEN bits according to ADC_ContinuousConvMode value */
|
|
/* Set TRGSEL bits according to ADC_ExternalTrigConv value */
|
|
|
|
tmpreg1 |= ((uint32_t)ADC_InitStruct->ADC_DataAlign) | ADC_InitStruct->ADC_ExternalTrigConv |
|
|
((uint32_t)ADC_InitStruct->ADC_Mode) ;
|
|
|
|
/* Write to ADCx ADCR */
|
|
ADCx->ADCR = tmpreg1;
|
|
|
|
}
|
|
|
|
/**
|
|
* @brief Fills each ADC_InitStruct member with its default value.
|
|
* @param ADC_InitStruct : pointer to an ADC_InitTypeDef structure
|
|
* which will be initialized.
|
|
* @retval : None
|
|
*/
|
|
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct)
|
|
{
|
|
/* Initialize the ADC_Resolution values */
|
|
ADC_InitStruct->ADC_Resolution = ADC_Resolution_12b;
|
|
/* Initialize the ADC_PRESCARE values */
|
|
ADC_InitStruct->ADC_PRESCARE = ADC_PCLK2_PRESCARE_2;
|
|
/* Initialize the ADC_Mode member */
|
|
ADC_InitStruct->ADC_Mode = ADC_Mode_Single;
|
|
/* Initialize the ADC_ContinuousConvMode member */
|
|
ADC_InitStruct->ADC_ContinuousConvMode = DISABLE;
|
|
/* Initialize the ADC_ExternalTrigConv member */
|
|
ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
|
|
/* Initialize the ADC_DataAlign member */
|
|
ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right;
|
|
/* Initialize the ADC_NbrOfChannel member */
|
|
|
|
}
|
|
|
|
/**
|
|
* @brief Enables or disables the specified ADC peripheral.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param NewState: new state of the ADCx peripheral. This parameter
|
|
* can be: ENABLE or DISABLE.
|
|
* @retval : None
|
|
*/
|
|
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState)
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_FUNCTIONAL_STATE(NewState));
|
|
if (NewState != DISABLE)
|
|
{
|
|
/* Set the ADEN bit */
|
|
ADCx->ADCFG |= ADCFG_ADEN_Set;
|
|
}
|
|
else
|
|
{
|
|
/* Disable the selected ADC peripheral */
|
|
ADCx->ADCFG &= ADCFG_ADEN_Reset;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Enables or disables the specified ADC DMA request.
|
|
* @param ADCx: where x can be 1 or 2 to select the ADC peripheral.
|
|
* @param NewState: new state of the selected ADC DMA transfer.
|
|
* This parameter can be: ENABLE or DISABLE.
|
|
* @retval : None
|
|
*/
|
|
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState)
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_DMA_PERIPH(ADCx));
|
|
assert_param(IS_FUNCTIONAL_STATE(NewState));
|
|
if (NewState != DISABLE)
|
|
{
|
|
/* Enable the selected ADC DMA request */
|
|
ADCx->ADCR |= ADCR_DMA_Set;
|
|
}
|
|
else
|
|
{
|
|
/* Disable the selected ADC DMA request */
|
|
ADCx->ADCR &= ADCR_DMA_Reset;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Enables or disables the specified ADC interrupts.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param ADC_IT: specifies the ADC interrupt sources to be enabled
|
|
* or disabled.
|
|
* This parameter can be any combination of the following values:
|
|
* @arg ADC_IT_EOC: End of conversion interrupt mask
|
|
* @arg ADC_IT_AWD: Analog watchdog interrupt mask
|
|
* @param NewState: new state of the specified ADC interrupts.
|
|
* This parameter can be: ENABLE or DISABLE.
|
|
* @retval : None
|
|
*/
|
|
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState)
|
|
{
|
|
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_FUNCTIONAL_STATE(NewState));
|
|
assert_param(IS_ADC_IT(ADC_IT));
|
|
/* Get the ADC IT index */
|
|
//itmask = (uint8_t)ADC_IT;
|
|
if (NewState != DISABLE)
|
|
{
|
|
/* Enable the selected ADC interrupts */
|
|
ADCx->ADCR |= ADC_IT;
|
|
}
|
|
else
|
|
{
|
|
/* Disable the selected ADC interrupts */
|
|
ADCx->ADCR &= (~(uint32_t)ADC_IT);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Enables or disables the selected ADC software start conversion .
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param NewState: new state of the selected ADC software start conversion.
|
|
* This parameter can be: ENABLE or DISABLE.
|
|
* @retval : None
|
|
*/
|
|
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_FUNCTIONAL_STATE(NewState));
|
|
if (NewState != DISABLE)
|
|
{
|
|
/* Enable the selected ADC conversion on external event and start the selected
|
|
ADC conversion */
|
|
/*Set ADST bit*/
|
|
ADCx->ADCR |= ADCR_SWSTART_Set;
|
|
}
|
|
else
|
|
{
|
|
/* Disable the selected ADC conversion on external event and stop the selected
|
|
ADC conversion */
|
|
ADCx->ADCR &= ADCR_SWSTART_Reset;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Gets the selected ADC Software start conversion Status.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @retval : The new state of ADC software start conversion (SET or RESET).
|
|
*/
|
|
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx)
|
|
{
|
|
FlagStatus bitstatus = RESET;
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
/* Check the status of ADST bit */
|
|
if ((ADCx->ADCR & ADCR_SWSTART_Set) != (uint32_t)RESET)
|
|
{
|
|
/* ADST bit is set */
|
|
bitstatus = SET;
|
|
}
|
|
else
|
|
{
|
|
/* ADST bit is reset */
|
|
bitstatus = RESET;
|
|
}
|
|
/* Return the ADST bit status */
|
|
return bitstatus;
|
|
}
|
|
|
|
/**
|
|
* @brief Configures for the selected ADC channel its corresponding
|
|
* rank in the sequencer and its sample time.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param ADC_Channel: the ADC channel to configure.
|
|
* This parameter can be one of the following values:
|
|
* @arg ADC_Channel_0: ADC Channel0 selected
|
|
* @arg ADC_Channel_1: ADC Channel1 selected
|
|
* @arg ADC_Channel_2: ADC Channel2 selected
|
|
* @arg ADC_Channel_3: ADC Channel3 selected
|
|
* @arg ADC_Channel_4: ADC Channel4 selected
|
|
* @arg ADC_Channel_5: ADC Channel5 selected
|
|
* @arg ADC_Channel_6: ADC Channel6 selected
|
|
* @arg ADC_Channel_7: ADC Channel7 selected
|
|
* @arg ADC_Channel_8: ADC Channel8 selected
|
|
* @retval : None
|
|
*/
|
|
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
|
|
{
|
|
uint32_t tmpreg = 0;
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_CHANNEL(ADC_Channel));
|
|
assert_param(IS_ADC_REGULAR_RANK(Rank));
|
|
assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime));
|
|
tmpreg = ADCx->ADCFG;
|
|
tmpreg &= ~(ADC_SMPR_SMP<<10);
|
|
ADCx->ADCFG = tmpreg|((ADC_SampleTime&ADC_SMPR_SMP)<<10);
|
|
switch(ADC_Channel)
|
|
{
|
|
/* set the CHEN0 bit for channel 0 enable*/
|
|
case ADC_Channel_0: ADCx->ADCHS |= CHEN0_ENABLE;
|
|
break;
|
|
/* set the CHEN1 bit for channel 1 enable*/
|
|
case ADC_Channel_1: ADCx->ADCHS |= CHEN1_ENABLE;
|
|
break;
|
|
/* set the CHEN2 bit for channel 2 enable*/
|
|
case ADC_Channel_2: ADCx->ADCHS |= CHEN2_ENABLE;
|
|
break;
|
|
/* set the CHEN3 bit for channel 3 enable*/
|
|
case ADC_Channel_3: ADCx->ADCHS |= CHEN3_ENABLE;
|
|
break;
|
|
/* set the CHEN4 bit for channel 4 enable*/
|
|
case ADC_Channel_4: ADCx->ADCHS |= CHEN4_ENABLE;
|
|
break;
|
|
/* set the CHEN5 bit for channel 5 enable*/
|
|
case ADC_Channel_5: ADCx->ADCHS |= CHEN5_ENABLE;
|
|
break;
|
|
/* set the CHEN6 bit for channel 6 enable*/
|
|
case ADC_Channel_6: ADCx->ADCHS |= CHEN6_ENABLE;
|
|
break;
|
|
/* set the CHEN7 bit for channel 7 enable*/
|
|
case ADC_Channel_7: ADCx->ADCHS |= CHEN7_ENABLE;
|
|
break;
|
|
/* set the SENSOREN bit for channel 8 enable*/
|
|
case ADC_Channel_8: ADCx->ADCHS |= CHEN8_ENABLE; //SENSOREN or VREFINT
|
|
break;
|
|
case ADC_Channel_All:ADCx->ADCHS |= CHALL_ENABLE; //SENSOREN or VREFINT
|
|
break;
|
|
default:
|
|
ADCx->ADCHS &= CHEN_DISABLE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Enables or disables the ADCx conversion through external trigger.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param NewState: new state of the selected ADC external trigger
|
|
* start of conversion.
|
|
* This parameter can be: ENABLE or DISABLE.
|
|
* @retval : None
|
|
*/
|
|
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_FUNCTIONAL_STATE(NewState));
|
|
if (NewState != DISABLE)
|
|
{
|
|
/* Enable the selected ADC conversion on external event */
|
|
ADCx->ADCR |= ADCR_EXTTRIG_Set;
|
|
}
|
|
else
|
|
{
|
|
/* Disable the selected ADC conversion on external event */
|
|
ADCx->ADCR &= ADCR_EXTTRIG_Reset;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the last ADCx conversion result data for regular channel.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @retval : The Data conversion value.
|
|
*/
|
|
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
/* Return the selected ADC conversion value */
|
|
return (uint16_t) ADCx->ADDATA;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the last ADC conversion result data in dual mode.
|
|
* @retval : The Data conversion value.
|
|
*/
|
|
uint32_t ADC_GetDualModeConversionValue(void)
|
|
{
|
|
/* Return the dual mode conversion value */
|
|
return (*(__IO uint32_t *) ADDATA_ADDRESS);
|
|
}
|
|
|
|
/**
|
|
* @brief Configures the ADCx external trigger for injected channels conversion.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param ADC_ExternalTrigInjecConv: specifies the ADC trigger to
|
|
* start injected conversion.
|
|
* This parameter can be one of the following values:
|
|
* @arg ADC_ExternalTrigConv_T1_CC1: Timer1 capture
|
|
* compare1 selected (for ADC1)
|
|
* @arg ADC_ExternalTrigConv_T1_CC2: Timer1 capture
|
|
* compare2 selected (for ADC1)
|
|
* @arg ADC_ExternalTrigConv_T1_CC3: Timer1 capture
|
|
* compare3 selected (for ADC1)
|
|
* @arg ADC_ExternalTrigConv_T2_CC2: Timer2 capture
|
|
* compare2 selected (for ADC1)
|
|
* @arg ADC_ExternalTrigConv_T3_TRGO: Timer3 TRGO event
|
|
* selected (for ADC1)
|
|
* @arg ADC_ExternalTrigConv_T4_CC4: Timer4 capture
|
|
* compare4 selected (for ADC1)
|
|
* @arg ADC_ExternalTrigConv_T3_CC1: Timer3 capture
|
|
* compare1 selected (for ADC1)
|
|
* @arg ADC_ExternalTrigConv_EXTI_11: EXTI line 11 event
|
|
* cselected (for ADC1)
|
|
* @arg ADC_ExternalTrigConv_T1_TRGO: Timer1 TRGO event
|
|
* selected (for ADC2)
|
|
* @arg ADC_ExternalTrigConv_T1_CC4: Timer1 capture
|
|
* compare4 selected (for ADC2)
|
|
* @arg ADC_ExternalTrigConv_T2_TRGO: Timer2 TRGO event
|
|
* selected (for ADC2)
|
|
* @arg ADC_ExternalTrigConv_T2_CC1: Timer2 capture
|
|
* compare1 selected (for ADC2)
|
|
* @arg ADC_ExternalTrigConv_T3_CC4: Timer3 capture
|
|
* compare4 selected (for ADC2)
|
|
* @arg ADC_ExternalTrigConv_T4_TRGO: Timer4 TRGO event
|
|
* selected (for ADC2)
|
|
* @arg ADC_ExternalTrigConv_T3_CC1: Timer3 capture
|
|
* compare1 selected (for ADC2)
|
|
* @arg ADC_ExternalTrigConv_EXTI_15: EXTI line 15 event
|
|
* cselected (for ADC2)
|
|
* @retval : None
|
|
*/
|
|
void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv)
|
|
{
|
|
uint32_t tmpreg = 0;
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_EXT_INJEC_TRIG(ADC_ExternalTrigInjecConv));
|
|
/* Get the old register value */
|
|
tmpreg = ADCx->ADCR;
|
|
/* Clear the old external event selection for injected group */
|
|
tmpreg &= ADCR_EXTSEL_Reset;
|
|
/* Set the external event selection for injected group */
|
|
tmpreg |= ADC_ExternalTrigInjecConv;
|
|
/* Store the new register value */
|
|
ADCx->ADCR = tmpreg;
|
|
}
|
|
|
|
/**
|
|
* @brief Enables or disables the ADCx injected channels conversion
|
|
* through external trigger
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param NewState: new state of the selected ADC external trigger
|
|
* start of injected conversion.
|
|
* This parameter can be: ENABLE or DISABLE.
|
|
* @retval : None
|
|
*/
|
|
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_FUNCTIONAL_STATE(NewState));
|
|
if (NewState != DISABLE)
|
|
{
|
|
/* Enable the selected ADC external event selection for injected group */
|
|
ADCx->ADCR |= ADCR_EXTTRIG_Set;
|
|
}
|
|
else
|
|
{
|
|
ADCx->ADCR &= ADCR_EXTTRIG_Reset;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Enables or disables the analog watchdog on single/all regular
|
|
* or injected channels
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param ADC_AnalogWatchdog: the ADC analog watchdog configuration.
|
|
* This parameter can be one of the following values:
|
|
* @arg ADC_AnalogWatchdog_SingleRegEnable: Analog watchdog on
|
|
* a single regular channel
|
|
* @arg ADC_AnalogWatchdog_None: No channel guarded by the
|
|
* analog watchdog
|
|
* analog watchdog
|
|
* @retval : None
|
|
*/
|
|
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog)
|
|
{
|
|
uint32_t tmpreg = 0;
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_ANALOG_WATCHDOG(ADC_AnalogWatchdog));
|
|
/* Get the old register value */
|
|
tmpreg = ADCx->ADCFG;
|
|
/* Clear ADWEN bit */
|
|
tmpreg &= ADCFG_AWDMode_Reset;
|
|
/* Set the analog watchdog enable mode */
|
|
tmpreg |= ADC_AnalogWatchdog;
|
|
/* Store the new register value */
|
|
ADCx->ADCFG = tmpreg;
|
|
}
|
|
|
|
/**
|
|
* @brief Configures the high and low thresholds of the analog watchdog.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param HighThreshold: the ADC analog watchdog High threshold value.
|
|
* This parameter must be a 12bit value.
|
|
* @param LowThreshold: the ADC analog watchdog Low threshold value.
|
|
* This parameter must be a 12bit value.
|
|
* @retval : None
|
|
*/
|
|
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,
|
|
uint16_t LowThreshold)
|
|
{
|
|
uint32_t tempThreshold;
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_THRESHOLD(HighThreshold));
|
|
assert_param(IS_ADC_THRESHOLD(LowThreshold));
|
|
/* Get the ADCx high threshold */
|
|
tempThreshold = HighThreshold;
|
|
/* Set the ADCx high threshold and the ADCx low threshold */
|
|
ADCx->ADCMPR = (tempThreshold<<16) | LowThreshold;
|
|
}
|
|
|
|
/**
|
|
* @brief Configures the analog watchdog guarded single channel
|
|
* @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral.
|
|
* @param ADC_Channel: the ADC channel to configure for the analog
|
|
* watchdog.
|
|
* This parameter can be one of the following values:
|
|
* @arg ADC_Channel_0: ADC Channel0 selected
|
|
* @arg ADC_Channel_1: ADC Channel1 selected
|
|
* @arg ADC_Channel_2: ADC Channel2 selected
|
|
* @arg ADC_Channel_3: ADC Channel3 selected
|
|
* @arg ADC_Channel_4: ADC Channel4 selected
|
|
* @arg ADC_Channel_5: ADC Channel5 selected
|
|
* @arg ADC_Channel_6: ADC Channel6 selected
|
|
* @arg ADC_Channel_7: ADC Channel7 selected
|
|
* @arg ADC_Channel_8: ADC Channel8 selected
|
|
* @arg ADC_Channel_All: ADC all Channel selected
|
|
* @retval : None
|
|
*/
|
|
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel)
|
|
{
|
|
uint32_t tmpreg = 0;
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_CHANNEL(ADC_Channel));
|
|
/* Get the old register value */
|
|
tmpreg = ADCx->ADCR;
|
|
/* Clear the Analog watchdog channel select bits */
|
|
tmpreg &= ADCR_AWDCH_Reset;
|
|
/* Set the Analog watchdog channel */
|
|
tmpreg |= (ADC_Channel<<12);
|
|
/* Store the new register value */
|
|
ADCx->ADCR = tmpreg;
|
|
}
|
|
|
|
/**
|
|
* @brief Enables or disables the temperature sensor and Vrefint channel.
|
|
* @param NewState: new state of the temperature sensor.
|
|
* This parameter can be: ENABLE or DISABLE.
|
|
* @retval : None
|
|
*/
|
|
void ADC_TempSensorVrefintCmd(FunctionalState NewState)
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_FUNCTIONAL_STATE(NewState));
|
|
if (NewState != DISABLE)
|
|
{
|
|
/* Enable the temperature sensor and Vrefint channel*/
|
|
ADC1->ADCFG |= ADCFG_TVSEN ;
|
|
ADC2->ADCFG |= ADCFG_TVSEN ;//next
|
|
}
|
|
else
|
|
{
|
|
/* Disable the temperature sensor and Vrefint channel*/
|
|
ADC1->ADCFG &=~ ADCFG_TVSEN;
|
|
ADC2->ADCFG &=~ ADCFG_TVSEN;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Checks whether the specified ADC flag is set or not.
|
|
* @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral.
|
|
* @param ADC_FLAG: specifies the flag to check.
|
|
* This parameter can be one of the following values:
|
|
* @arg ADC_FLAG_AWD: Analog watchdog flag
|
|
* @arg ADC_FLAG_EOC: End of conversion flag
|
|
* @arg ADC_FLAG_BUSY: AD conversion busy flag
|
|
* @retval : The new state of ADC_FLAG (SET or RESET).
|
|
*/
|
|
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)
|
|
{
|
|
FlagStatus bitstatus = RESET;
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_GET_FLAG(ADC_FLAG));
|
|
/* Check the status of the specified ADC flag */
|
|
if ((ADCx->ADSTA & ADC_FLAG) != (uint8_t)RESET)
|
|
{
|
|
/* ADC_FLAG is set */
|
|
bitstatus = SET;
|
|
}
|
|
else
|
|
{
|
|
/* ADC_FLAG is reset */
|
|
bitstatus = RESET;
|
|
}
|
|
|
|
/* Return the ADC_FLAG status */
|
|
return bitstatus;
|
|
}
|
|
|
|
/**
|
|
* @brief Clears the ADCx's pending flags.
|
|
* @param ADCx: where x can be 1, 2 to select the ADC peripheral.
|
|
* @param ADC_FLAG: specifies the flag to clear.
|
|
* This parameter can be any combination of the following values:
|
|
* @arg ADC_FLAG_AWD: Analog watchdog flag
|
|
* @arg ADC_FLAG_EOC: End of conversion flag
|
|
* @retval : None
|
|
*/
|
|
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)
|
|
{
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG));
|
|
/* Clear the selected ADC flags */
|
|
ADCx->ADSTA |= ADC_FLAG;
|
|
}
|
|
|
|
/**
|
|
* @brief Checks whether the specified ADC interrupt has occurred or not.
|
|
* @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral.
|
|
* @param ADC_IT: specifies the ADC interrupt source to check.
|
|
* This parameter can be one of the following values:
|
|
* @arg ADC_IT_EOC: End of conversion interrupt mask
|
|
* @arg ADC_IT_AWD: Analog watchdog interrupt mask
|
|
* @retval : The new state of ADC_IT (SET or RESET).
|
|
*/
|
|
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT)
|
|
{
|
|
ITStatus bitstatus = RESET;
|
|
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_GET_IT(ADC_IT));
|
|
|
|
/* Check the status of the specified ADC interrupt */
|
|
if (((ADCx->ADSTA & ADC_IT)) != (uint32_t)RESET)
|
|
{
|
|
/* ADC_IT is set */
|
|
bitstatus = SET;
|
|
}
|
|
else
|
|
{
|
|
/* ADC_IT is reset */
|
|
bitstatus = RESET;
|
|
}
|
|
/* Return the ADC_IT status */
|
|
return bitstatus;
|
|
}
|
|
|
|
/**
|
|
* @brief Clears the ADCx's interrupt pending bits.
|
|
* @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral.
|
|
* @param ADC_IT: specifies the ADC interrupt pending bit to clear.
|
|
* This parameter can be any combination of the following values:
|
|
* @arg ADC_IT_EOC: End of conversion interrupt mask
|
|
* @arg ADC_IT_AWD: Analog watchdog interrupt mask
|
|
* @retval : None
|
|
*/
|
|
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT)
|
|
{
|
|
|
|
/* Check the parameters */
|
|
assert_param(IS_ADC_ALL_PERIPH(ADCx));
|
|
assert_param(IS_ADC_IT(ADC_IT));
|
|
/* Clear the selected ADC interrupt pending bits */
|
|
ADCx->ADSTA = ADC_IT;
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/*-------------------------(C) COPYRIGHT 2017 MindMotion ----------------------*/
|