summaryrefslogtreecommitdiffstats
path: root/uc_str912/prj_template91x/str91x_lib/src/91x_adc.c
diff options
context:
space:
mode:
Diffstat (limited to 'uc_str912/prj_template91x/str91x_lib/src/91x_adc.c')
-rw-r--r--uc_str912/prj_template91x/str91x_lib/src/91x_adc.c590
1 files changed, 590 insertions, 0 deletions
diff --git a/uc_str912/prj_template91x/str91x_lib/src/91x_adc.c b/uc_str912/prj_template91x/str91x_lib/src/91x_adc.c
new file mode 100644
index 0000000..a6a07d3
--- /dev/null
+++ b/uc_str912/prj_template91x/str91x_lib/src/91x_adc.c
@@ -0,0 +1,590 @@
+/******************** (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/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****/
OpenPOWER on IntegriCloud