Subversion Repositories NaviCtrl

Compare Revisions

Ignore whitespace Rev 71 → Rev 72

/tags/V0.14b/libstr91x/src/91x_adc.c
0,0 → 1,591
/******************** (C) COPYRIGHT 2006 STMicroelectronics ********************
* File Name : 91x_adc.c
* Author : MCD Application Team
* Date First Issued : 05/18/2006 : Version 1.0
* Description : This file provides all the ADC software functions.
********************************************************************************
* History:
* 05/22/2007 : Version 1.2
* 05/24/2006 : Version 1.1
* 05/18/2006 : Version 1.0
********************************************************************************
* THE PRESENT SOFTWARE 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, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT
* OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
* OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
* CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
 
 
/* Standard include ----------------------------------------------------------*/
#include "91x_adc.h"
#include "91x_scu.h"
/* Include of other module interface headers ---------------------------------*/
/* Local includes ------------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
 
/* ADC mask */
#define ADC_FLAG_MASK 0x001F /* ADC Flag Mask */
#define ADC_RESULT_MASK 0x03FF /* ADC Result Mask */
#define ADC_SCAN_MODE_MASK 0x0020 /* ADC Sacn Mode Mask */
#define ADC_STANDBY_MODE_MASK 0x0008 /* ADC Standby Mode Mask */
#define ADC_CMD_MASK 0x0002 /* ADC Command Mask */
#define ADC_CHANNEL_MASK 0xFE3F /* ADC Channel Select Mask */
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Interface functions -------------------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
 
/*******************************************************************************
* Function Name : ADC_DeInit
* Description : Deinitialize the ADC module registers to their default reset
* values
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void ADC_DeInit(void)
{
/* Reset the ADC registers values */
SCU_APBPeriphReset(__ADC,ENABLE);
SCU_APBPeriphReset(__ADC,DISABLE);
}
 
/*******************************************************************************
* Function Name : ADC_Init
* Description : Initializes ADC peripheral according to the specified
* parameters in the ADC_InitTypeDef structure.
* Input : ADC_InitStruct: pointer to a ADC_InitTypeDef structure that
* contains the configuration information for the specified
* ADC peripheral.
* Output : None
* Return : None
*******************************************************************************/
void ADC_Init(ADC_InitTypeDef* ADC_InitStruct)
{
/* Set the low threshold of the watchdog */
ADC->LTR = ADC_InitStruct->ADC_WDG_Low_Threshold;
 
/* Set the high threshold of the watchdog */
ADC->HTR = ADC_InitStruct->ADC_WDG_High_Threshold;
 
/* Channel 0 conversion mode */
ADC->CCR &= 0xFFFC;
ADC->CCR |= ADC_InitStruct->ADC_Channel_0_Mode;
/* Channel 1 conversion mode */
ADC->CCR &= 0xFFF3;
ADC->CCR |= ADC_InitStruct->ADC_Channel_1_Mode << 0x2;
 
/* Channel 2 conversion mode */
ADC->CCR &= 0xFFCF;
ADC->CCR |= ADC_InitStruct->ADC_Channel_2_Mode << 0x4;
/* Channel 3 conversion mode */
ADC->CCR &= 0xFF3F;
ADC->CCR |= ADC_InitStruct->ADC_Channel_3_Mode << 0x6;
 
/* Channel 4 conversion mode */
ADC->CCR &= 0xFCFF;
ADC->CCR |= ADC_InitStruct->ADC_Channel_4_Mode << 0x8;
 
/* Channel 5 conversion mode */
ADC->CCR &= 0xF3FF;
ADC->CCR |= ADC_InitStruct->ADC_Channel_5_Mode << 0xA;
 
/* Channel 6 conversion mode */
ADC->CCR &= 0xCFFF;
ADC->CCR |= ADC_InitStruct->ADC_Channel_6_Mode << 0xC;
 
/* Channel 7 conversion mode */
ADC->CCR &= 0x3FFF;
ADC->CCR |= ADC_InitStruct->ADC_Channel_7_Mode << 0xE;
 
/* Select the channel to be converted */
ADC->CR &= ADC_CHANNEL_MASK;
ADC->CR |= ADC_InitStruct->ADC_Select_Channel << 0x6;
 
/* Enable/disable the scan mode */
if (ADC_InitStruct->ADC_Scan_Mode == ENABLE)
{
/* Enable the scan mode */
ADC->CR |= ADC_SCAN_MODE_MASK;
}
else
{
/* Disable the scan mode */
ADC->CR &= ~ADC_SCAN_MODE_MASK;
}
 
/* Configure the conversion mode */
if (ADC_InitStruct->ADC_Conversion_Mode == ADC_Continuous_Mode)
{
/* ADC continuous mode */
ADC->CR |= ADC_Continuous_Mode;
}
else
{
/* ADC single mode */
ADC->CR &= ADC_Single_Mode;
}
}
 
/*******************************************************************************
* Function Name : ADC_StructInit
* Description : Fills each ADC_InitStruct member with its reset value.
* Input : ADC_InitStruct : pointer to a ADC_InitTypeDef structure
* which will be initialized.
* Output : None
* Return : None.
*******************************************************************************/
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct)
{
ADC_InitStruct->ADC_WDG_High_Threshold = 0x0000;
ADC_InitStruct->ADC_WDG_Low_Threshold = 0x0000;
ADC_InitStruct->ADC_Channel_0_Mode = ADC_No_Conversion;
ADC_InitStruct->ADC_Channel_1_Mode = ADC_No_Conversion;
ADC_InitStruct->ADC_Channel_2_Mode = ADC_No_Conversion;
ADC_InitStruct->ADC_Channel_3_Mode = ADC_No_Conversion;
ADC_InitStruct->ADC_Channel_4_Mode = ADC_No_Conversion;
ADC_InitStruct->ADC_Channel_5_Mode = ADC_No_Conversion;
ADC_InitStruct->ADC_Channel_6_Mode = ADC_No_Conversion;
ADC_InitStruct->ADC_Channel_7_Mode = ADC_No_Conversion;
ADC_InitStruct->ADC_Select_Channel = ADC_Channel_0;
ADC_InitStruct->ADC_Scan_Mode = DISABLE;
ADC_InitStruct->ADC_Conversion_Mode = ADC_Single_Mode;
}
 
/*******************************************************************************
* Function Name : ADC_PrescalerConfig
* Description : This routine is used to configure the ADC prescaler value.
* Input : ADC_Prescaler: specifies the prescaler value. This parameter
* can be a value from 0x0 to 0xFF.
* Output : None
* Return : None
*******************************************************************************/
void ADC_PrescalerConfig(u8 ADC_Prescaler)
{
ADC->PRS &= 0xFF00;
ADC->PRS |= ADC_Prescaler;
 
}
/*******************************************************************************
* Function Name : ADC_GetPrescalerValue
* Description : This routine is used to get the ADC prescaler value.
* Input : None
* Output : None
* Return : The prescaler value.
*******************************************************************************/
u8 ADC_GetPrescalerValue(void)
{
return ADC->PRS & 0x00FF;
}
/*******************************************************************************
* Function Name : ADC_GetFlagStatus
* Description : Checks whether the specified ADC flag is set or not.
* Input : ADC_Flag: flag to check.
* This parameter can be one of the following values:
* - ADC_FLAG_OV_CH_0: Conversion overflow status for
* channel 0.
* - ADC_FLAG_OV_CH_1: Conversion overflow status for
* channel 1.
* - ADC_FLAG_OV_CH_2: Conversion overflow status for
* channel 2.
* - ADC_FLAG_OV_CH_3: Conversion overflow status for
* channel 3.
* - ADC_FLAG_OV_CH_4: Conversion overflow status for
* channel 4.
* - ADC_FLAG_OV_CH_5: Conversion overflow status for
* channel 5.
* - ADC_FLAG_OV_CH_6: Conversion overflow status for
* channel 6.
* - ADC_FLAG_OV_CH_7: Conversion overflow status for
* channel 7.
* - ADC_FLAG_ECV: End of conversion status.
* - ADC_FLAG_AWD: Analog watchdog status.
* Output : None
* Return : The NewState of the ADC_Flag (SET or RESET).
*******************************************************************************/
FlagStatus ADC_GetFlagStatus(u16 ADC_Flag)
{
u8 AdcReg = 0, FlagPos = 0;
/* Get the ADC register index */
AdcReg = ADC_Flag >> 5;
 
/* Get the flag position */
FlagPos = ADC_Flag & ADC_FLAG_MASK;
 
if(AdcReg == 1) /* The flag to check is in CR register */
{
if((ADC->CR & (1<<FlagPos))!= RESET)
{
return SET;
}
else
{
return RESET;
}
}
else if(AdcReg == 6) /* The flag to check is in DR0 register */
{
if((ADC->DR0 & (1<<FlagPos))!= RESET)
{
return SET;
}
else
{
return RESET;
}
}
else if(AdcReg == 7) /* The flag to check is in DR1 register */
{
if((ADC->DR1 & (1<<FlagPos))!= RESET)
{
return SET;
}
else
{
return RESET;
}
}
else if(AdcReg == 8) /* The flag to check is in DR2 register */
{
if((ADC->DR2 & (1<<FlagPos))!= RESET)
{
return SET;
}
else
{
return RESET;
}
}
else if(AdcReg == 9) /* The flag to check is in DR3 register */
{
if((ADC->DR3 & (1<<FlagPos))!= RESET)
{
return SET;
}
else
{
return RESET;
}
}
 
else if(AdcReg == 0xA) /* The flag to check is in DR4 register */
{
if((ADC->DR4 & (1<<FlagPos))!= RESET)
{
return SET;
}
else
{
return RESET;
}
}
else if(AdcReg == 0xB) /* The flag to check is in DR5 register */
{
if((ADC->DR5 & (1<<FlagPos))!= RESET)
{
return SET;
}
else
{
return RESET;
}
}
else if(AdcReg == 0xC) /* The flag to check is in DR6 register */
{
if((ADC->DR6 & (1<<FlagPos))!= RESET)
{
return SET;
}
else
{
return RESET;
}
}
else /* (AdcReg == 0xD), The flag to check is in DR7 register */
{
if((ADC->DR7 & (1<<FlagPos))!= RESET)
{
return SET;
}
else
{
return RESET;
}
}
}
 
/*******************************************************************************
* Function Name : ADC_ClearFlag
* Description : Clears the ADC Flag passed as a parameter.
* Input : ADC_Flag: flag to clear.
* This parameter can be one of the following values:
* - ADC_FLAG_ECV: End of conversion status.
* - ADC_FLAG_AWD: Analog watchdog status.
* Output : None
* Return : None
*******************************************************************************/
void ADC_ClearFlag(u16 ADC_Flag)
{
/* Clear the correspondent flag */
ADC->CR |= (1<<(ADC_Flag & ADC_FLAG_MASK));
}
 
/*******************************************************************************
* Function Name : ADC_GetConversionValue
* Description : Read the result of conversion from the appropriate data
* register.
* Input : ADC_Channel: the correspondent channel of the ADC peripheral.
* This parameter can be one of the following values:
* - ADC_Channel_0: ADC channel 0.
* - ADC_Channel_1: ADC channel 1.
* - ADC_Channel_2: ADC channel 2.
* - ADC_Channel_3: ADC channel 3.
* - ADC_Channel_4: ADC channel 4.
* - ADC_Channel_5: ADC channel 5.
* - ADC_Channel_6: ADC channel 6.
* - ADC_Channel_7: ADC channel 7.
* Output : None
* Return : The result of the conversion for the specific channel.
*******************************************************************************/
u16 ADC_GetConversionValue(u16 ADC_Channel)
{
u16 ADC_Conversion_Value = 0;
 
switch (ADC_Channel)
{
case (ADC_Channel_0):
/* Get the conversion value of the channel 0 */
ADC_Conversion_Value = ADC->DR0 & ADC_RESULT_MASK;
break;
 
case (ADC_Channel_1):
/* Get the conversion value of the channel 1 */
ADC_Conversion_Value = ADC->DR1 & ADC_RESULT_MASK;
break;
 
case (ADC_Channel_2):
/* Get the conversion value of the channel 2 */
ADC_Conversion_Value = ADC->DR2 & ADC_RESULT_MASK;
break;
 
case (ADC_Channel_3):
/* Get the conversion value of the channel 3 */
ADC_Conversion_Value = ADC->DR3 & ADC_RESULT_MASK;
break;
 
case (ADC_Channel_4):
/* Get the conversion value of the channel 4 */
ADC_Conversion_Value = ADC->DR4 & ADC_RESULT_MASK;
break;
 
case (ADC_Channel_5):
/* Get the conversion value of the channel 5 */
ADC_Conversion_Value = ADC->DR5 & ADC_RESULT_MASK;
break;
case (ADC_Channel_6):
/* Get the conversion value of the channel 6 */
ADC_Conversion_Value = ADC->DR6 & ADC_RESULT_MASK;
break;
 
case (ADC_Channel_7):
/* Get the conversion value of the channel 7 */
ADC_Conversion_Value = ADC->DR7 & ADC_RESULT_MASK;
break;
 
default:
break;
}
 
return(ADC_Conversion_Value);
}
 
/*******************************************************************************
* Function Name : ADC_GetAnalogWatchdogResult
* Description : Return the result of the comparaison on the selected Analog
* Watchdog.
* Input : ADC_Channel: the correspondent channel of the ADC peripheral.
* This parameter can be one of the following values:
* - ADC_Channel_0: ADC channel 0.
* - ADC_Channel_1: ADC channel 1.
* - ADC_Channel_2: ADC channel 2.
* - ADC_Channel_3: ADC channel 3.
* - ADC_Channel_4: ADC channel 4.
* - ADC_Channel_5: ADC channel 5.
* - ADC_Channel_6: ADC channel 6.
* - ADC_Channel_7: ADC channel 7.
* Output : None
* Return : The state of the comparision (SET or RESET).
*******************************************************************************/
FlagStatus ADC_GetAnalogWatchdogResult(u16 ADC_Channel)
{
if (ADC->CRR & (1<<ADC_Channel) != RESET)
{
return SET;
}
else
{
return RESET;
}
}
 
/*******************************************************************************
* Function Name : ADC_ClearAnalogWatchdogResult
* Description : Clear the result of the comparaison on the selected Analog
* Watchdog.
* Input : ADC_Channel: the correspondent channel of the ADC peripheral.
* This parameter can be one of the following values:
* - ADC_Channel_0: ADC channel 0.
* - ADC_Channel_1: ADC channel 1.
* - ADC_Channel_2: ADC channel 2.
* - ADC_Channel_3: ADC channel 3.
* - ADC_Channel_4: ADC channel 4.
* - ADC_Channel_5: ADC channel 5.
* - ADC_Channel_6: ADC channel 6.
* - ADC_Channel_7: ADC channel 7.
* Output : None
* Return : None
*******************************************************************************/
void ADC_ClearAnalogWatchdogResult(u16 ADC_Channel)
{
/* Clear the correspondent watchdog result */
ADC->CRR = 1<<ADC_Channel;
}
 
/*******************************************************************************
* Function Name : ADC_GetWatchdogThreshold
* Description : Get the higher/lower thresholds values of the watchdog.
* Input : ADC_Threshold: the lower or the higher threshold.
* This parameter can be one of the following values:
* - ADC_HigherThreshold: The higher threshold.
* - ADC_LowerThreshold: The lower threshold.
* Output : None
* Return : The selected threshold value.
*******************************************************************************/
u16 ADC_GetWatchdogThreshold(ADC_ThresholdType ADC_Threshold)
{
u16 ADC_Threshold_Value = 0;
 
switch (ADC_Threshold)
{
case ADC_LowThreshold:
/* Get the low threshold of the watchdog */
ADC_Threshold_Value = ADC->LTR;
break;
 
case ADC_HighThreshold:
/* Get the high threshol of the watchdog */
ADC_Threshold_Value = ADC->HTR;
break;
 
default:
break;
}
 
return(ADC_Threshold_Value);
}
 
/*******************************************************************************
* Function Name : ADC_ITConfig
* Description : Enables or disables the specified ADC interrupts.
* Input : - ADC_IT: specifies the ADC interrupts sources to be enabled
* or disabled.
* This parameter can be one of the following values:
* - ADC_IT_EndOfConversion: End of conversion interrupt.
* - ADC_IT_AnalogWDG: Analog watchdog interrupt.
* - ADC_NewState: new state of the specified ADC interrupts.
* (ADC_Newstate can be ENABLE or DISABLE).
* Output : None
* Return : None
*******************************************************************************/
void ADC_ITConfig(u16 ADC_IT, FunctionalState ADC_NewState)
{
if (ADC_NewState == ENABLE)
{
/* Enable the interrupt */
ADC->CR |= ADC_IT;
}
else
{
/* Disable the interrupt */
ADC->CR &= ~ADC_IT;
}
}
 
/*******************************************************************************
* Function Name : ADC_StandbyModeCmd
* Description : Enable or disable the standby mode.
* Input : ADC_NewState: new state of the ADC standby mode.
* (ADC_Newstate can be ENABLE or DISABLE).
* Output : None
* Return : None
*******************************************************************************/
void ADC_StandbyModeCmd(FunctionalState ADC_NewState)
{
if (ADC_NewState == ENABLE)
{
/* Enable the standby mode */
ADC->CR |= ADC_STANDBY_MODE_MASK;
}
else
{
/* Disable the standby mode */
ADC->CR &= ~ADC_STANDBY_MODE_MASK;
}
}
 
/*******************************************************************************
* Function Name : ADC_Cmd
* Description : Power on or put in reset mode the ADC peripheral.
* Input : ADC_NewState: new state of the ADC peripheral.
* (ADC_Newstate can be ENABLE or DISABLE).
* Output : None
* Return : None
*******************************************************************************/
void ADC_Cmd(FunctionalState ADC_NewState)
{
if (ADC_NewState == ENABLE)
{
/* Enable the ADC */
ADC->CR |= ADC_CMD_MASK;
}
else
{
/* Disable the ADC */
ADC->CR &= ~ADC_CMD_MASK;
}
}
 
/*******************************************************************************
* Function Name : ADC_ConversionCmd
* Description : Start or stop the ADC conversion in the selected mode.
* Input : ADC_Conversion: the conversion command.
* This parameter can be one of the following values:
* - ADC_Conversion_Start: Start the conversion.
* - ADC_Conversion_Stop: Stop the Conversion.
* Output : None
* Return : None
*******************************************************************************/
void ADC_ConversionCmd(u16 ADC_Conversion)
{
if (ADC_Conversion == ADC_Conversion_Start)
{
/* Start the ADC conversion */
ADC->CR |= ADC_Conversion_Start;
}
else
{
/* Stop the ADC conversion */
ADC->CR &= ADC_Conversion_Stop;
}
}
 
/******************* (C) COPYRIGHT 2006 STMicroelectronics *****END OF FILE****/