/** * @brief Configures the sequencer length for injected channels * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. * @param Length: The sequencer length. * This parameter must be a number between 1 to 4. * @retval None */ void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length) { uint32_t tmpreg1 = 0; uint32_t tmpreg2 = 0; /* Check the parameters */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); assert_param(IS_ADC_INJECTED_LENGTH(Length)); /* Get the old register value */ tmpreg1 = ADCx->JSQR; /* Clear the old injected sequnence lenght JL bits */ tmpreg1 &= JSQR_JL_Reset; /* Set the injected sequnence lenght JL bits */ tmpreg2 = Length - 1; tmpreg1 |= tmpreg2 << 20; /* Store the new register value */ ADCx->JSQR = tmpreg1; }
/** * @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->CR2 |= CR2_JEXTTRIG_Set; ADCx->ADCR |= ADCR_EXTTRIG_Set; } else { /* Disable the selected ADC external event selection for injected group */ //ADCx->CR2 &= CR2_JEXTTRIG_Reset; ADCx->ADCR &= ADCR_EXTTRIG_Reset; } }
/** * @brief Enables or disables the specified ADC interrupts. * @param ADCx: where x can be 1 to select the ADC peripheral. * @param ADC_IT: specifies the ADC interrupt sources to be enabled or disabled. * This parameter can be one of the following values: * @arg ADC_IT_ADRDY: ADC ready interrupt * @arg ADC_IT_EOSMP: End of sampling interrupt * @arg ADC_IT_EOC: End of conversion interrupt * @arg ADC_IT_EOSEQ: End of sequence of conversion interrupt * @arg ADC_IT_OVR: overrun interrupt * @arg ADC_IT_AWD: Analog watchdog interrupt * @param NewState: new state of the specified ADC interrupts. * This parameter can be: ENABLE or DISABLE. * @retval None */ void ADC_ITConfig(ADC_TypeDef* ADCx, uint32_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_CONFIG_IT(ADC_IT)); if (NewState != DISABLE) { /* Enable the selected ADC interrupts */ ADCx->IER |= ADC_IT; } else { /* Disable the selected ADC interrupts */ ADCx->IER &= (~(uint32_t)ADC_IT); } }
/** * @brief Enables or disables the jitter when the ADC is clocked by PCLK div2 * or div4 * @note This function is obsolete and maintained for legacy purpose only. ADC_ClockModeConfig() * function should be used instead. * @param ADCx: where x can be 1 to select the ADC1 peripheral. * @param ADC_JitterOff: This parameter can be : * @arg ADC_JitterOff_PCLKDiv2: Remove jitter when ADC is clocked by PLCK divided by 2 * @arg ADC_JitterOff_PCLKDiv4: Remove jitter when ADC is clocked by PLCK divided by 4 * @param NewState: new state of the ADCx jitter. * This parameter can be: ENABLE or DISABLE. * @retval None */ void ADC_JitterCmd(ADC_TypeDef* ADCx, uint32_t ADC_JitterOff, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); assert_param(IS_ADC_JITTEROFF(ADC_JitterOff)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { /* Disable Jitter */ ADCx->CFGR2 |= (uint32_t)ADC_JitterOff; } else { /* Enable Jitter */ ADCx->CFGR2 &= (uint32_t)(~ADC_JitterOff); } }
/** * @brief Enables or disables the selected ADC start of the injected * channels conversion. * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. * @param NewState: new state of the selected ADC software start injected conversion. * This parameter can be: ENABLE or DISABLE. * @retval None */ void ADC_SoftwareStartInjectedConvCmd(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 for injected group on external event and start the selected ADC injected conversion */ ADCx->CR2 |= CR2_JEXTTRIG_JSWSTART_Set; } else { /* Disable the selected ADC conversion on external event for injected group and stop the selected ADC injected conversion */ ADCx->CR2 &= CR2_JEXTTRIG_JSWSTART_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; }
/******************************************************************************* * 函数名称: ADC_DiscModeChannelCountConfig * 功能描述: 配置选中的ADC常规组为非连续模式. * 输入参数: (1)ADCx:其中x可以是1、2或3,用来选择ADC外围模块. * (2)Number:非连续模式下常规信道计数值。该值范围为1-8。 * 输出参数: 无 * 返回参数: 无 *******************************************************************************/ void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, u8 Number) { u32 tmpreg1 = 0; u32 tmpreg2 = 0; /* Check the parameters [检查参数] */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); assert_param(IS_ADC_REGULAR_DISC_NUMBER(Number)); /* Get the old register value [取得过去的寄存器值]*/ tmpreg1 = ADCx->CR1; /* Clear the old discontinuous mode channel count [清除过去的不间断模式通道计数器]*/ tmpreg1 &= CR1_DISCNUM_Reset; /* Set the discontinuous mode channel count [设置不间断模式通道计数器]*/ tmpreg2 = Number - 1; tmpreg1 |= tmpreg2 << 13; /* Store the new register value [存储新的寄存器值]*/ ADCx->CR1 = tmpreg1; }
/******************************************************************************* * 函数名称: ADC_SoftwareStartConvCmd * 功能描述: 使能/禁止选中的ADC由软件控制开始转换 . * 输入参数: (1)ADCx:其中x可以是1、2或3,用来选择ADC外围模块. * (2)NewState:选中的由软件发出开始信号的ADC的新状态这个参数可以是:ENABLE或DISABLE * 输出参数: 无 * 返回参数: 无 *******************************************************************************/ 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 [允许选择的ADC转换外部事件和启动选择的ADC转换]*/ ADCx->CR2 |= CR2_EXTTRIG_SWSTART_Set; } else { /* Disable the selected ADC conversion on external event and stop the selected ADC conversion [禁止选择的ADC转换外部事件和停止选择的ADC转换]*/ ADCx->CR2 &= CR2_EXTTRIG_SWSTART_Reset; } }
/** * @brief Gets the selected ADC calibration status. * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. * @retval The new state of ADC calibration (SET or RESET). */ FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx) { FlagStatus bitstatus = RESET; /* Check the parameters */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); /* Check the status of CAL bit */ if ((ADCx->CR2 & CR2_CAL_Set) != (uint32_t)RESET) { /* CAL bit is set: calibration on going */ bitstatus = SET; } else { /* CAL bit is reset: end of calibration */ bitstatus = RESET; } /* Return the CAL bit status */ return bitstatus; }
/** * @brief Gets the selected ADC Software start injected conversion Status. * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. * @retval The new state of ADC software start injected conversion (SET or RESET). */ FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx) { FlagStatus bitstatus = RESET; /* Check the parameters */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); /* Check the status of JSWSTART bit */ if ((ADCx->CR2 & CR2_JSWSTART_Set) != (uint32_t)RESET) { /* JSWSTART bit is set */ bitstatus = SET; } else { /* JSWSTART bit is reset */ bitstatus = RESET; } /* Return the JSWSTART bit status */ return bitstatus; }
/******************************************************************************* * 函数名称: ADC_InjectedSequencerLengthConfig * 功能描述: 配置注入信道音序器(sequencer)的长度 * 输入参数: (1)ADCx:其中x可以是1、2或3,用来选择ADC外围模块. * (2)Length:音序器(sequencer)的长度该参数的范围是1-4. * 输出参数: 无 * 返回参数: 无 *******************************************************************************/ void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, u8 Length) { u32 tmpreg1 = 0; u32 tmpreg2 = 0; /* Check the parameters [检查参数] */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); assert_param(IS_ADC_INJECTED_LENGTH(Length)); /* Get the old register value [取得旧的寄存器值]*/ tmpreg1 = ADCx->JSQR; /* Clear the old injected sequnence lenght JL bits [清除注入信道音序器的长度JL位]*/ tmpreg1 &= JSQR_JL_Reset; /* Set the injected sequnence lenght JL bits [置位注入信道音序器的长度JL位]*/ tmpreg2 = Length - 1; tmpreg1 |= tmpreg2 << 20; /* Store the new register value [存储新的寄存器值]*/ ADCx->JSQR = tmpreg1; }
/** * @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 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); /* 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_TRGEN value */ /* Set TRGSEL bits according to ADC_ExternalTrigConv value */ /* Set ADMD bit according to ADC_Mode value */ /*tmpreg1 |= ((uint32_t)ADC_InitStruct->ADC_DataAlign) | ADC_InitStruct->ADC_ExternalTrigConv | ((uint32_t)ADC_InitStruct->ADC_Mode) | ((uint32_t)ADC_InitStruct->ADC_TRGEN);*/ tmpreg1 |= ((uint32_t)ADC_InitStruct->ADC_DataAlign) | ((uint32_t)ADC_InitStruct->ADC_Mode) | (((uint32_t)ADC_InitStruct->ADC_TRGEN)<<2); /* Write to ADCx ADCR */ ADCx->ADCR = tmpreg1; }
/** * @brief Configures the analog watchdog guarded single channel * @param ADCx: where x can be 1 to select the ADC1 peripheral. * @param ADC_AnalogWatchdog_Channel: the ADC channel to configure for the analog watchdog. * This parameter can be one of the following values: * @arg ADC_AnalogWatchdog_Channel_0: ADC Channel0 selected * @arg ADC_AnalogWatchdog_Channel_1: ADC Channel1 selected * @arg ADC_AnalogWatchdog_Channel_2: ADC Channel2 selected * @arg ADC_AnalogWatchdog_Channel_3: ADC Channel3 selected * @arg ADC_AnalogWatchdog_Channel_4: ADC Channel4 selected * @arg ADC_AnalogWatchdog_Channel_5: ADC Channel5 selected * @arg ADC_AnalogWatchdog_Channel_6: ADC Channel6 selected * @arg ADC_AnalogWatchdog_Channel_7: ADC Channel7 selected * @arg ADC_AnalogWatchdog_Channel_8: ADC Channel8 selected * @arg ADC_AnalogWatchdog_Channel_9: ADC Channel9 selected * @arg ADC_AnalogWatchdog_Channel_10: ADC Channel10 selected * @arg ADC_AnalogWatchdog_Channel_11: ADC Channel11 selected * @arg ADC_AnalogWatchdog_Channel_12: ADC Channel12 selected * @arg ADC_AnalogWatchdog_Channel_13: ADC Channel13 selected * @arg ADC_AnalogWatchdog_Channel_14: ADC Channel14 selected * @arg ADC_AnalogWatchdog_Channel_15: ADC Channel15 selected * @arg ADC_AnalogWatchdog_Channel_16: ADC Channel16 selected * @arg ADC_AnalogWatchdog_Channel_17: ADC Channel17 selected * @arg ADC_AnalogWatchdog_Channel_18: ADC Channel18 selected * @note The channel selected on the AWDCH must be also set into the CHSELR * register * @retval None */ void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog_Channel) { uint32_t tmpreg = 0; /* Check the parameters */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); assert_param(IS_ADC_ANALOG_WATCHDOG_CHANNEL(ADC_AnalogWatchdog_Channel)); /* Get the old register value */ tmpreg = ADCx->CFGR1; /* Clear the Analog watchdog channel select bits */ tmpreg &= ~ADC_CFGR1_AWDCH; /* Set the Analog watchdog channel */ tmpreg |= ADC_AnalogWatchdog_Channel; /* Store the new register value */ ADCx->CFGR1 = tmpreg; }
/** * @brief Enables or disables the specified ADC interrupts. * @param ADCx: where x can be 1, 2 or 3 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 * @arg ADC_IT_JEOC: End of injected conversion 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) { uint8_t itmask = 0; /* 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->CR1 |= itmask; } else { /* Disable the selected ADC interrupts */ ADCx->CR1 &= (~(uint32_t)itmask); } }
/** * @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_JEOC: End of injected group conversion flag * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag * @arg ADC_FLAG_STRT: Start of regular group conversion 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->SR & 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 Configures for the selected ADC and its sampling time. * @param ADCx: where x can be 1 to select the ADC peripheral. * @param ADC_Channel: the ADC channel to configure. * This parameter can be any combination 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_9: ADC Channel9 selected * @arg ADC_Channel_10: ADC Channel10 selected, not available for STM32F031 devices * @arg ADC_Channel_11: ADC Channel11 selected, not available for STM32F031 devices * @arg ADC_Channel_12: ADC Channel12 selected, not available for STM32F031 devices * @arg ADC_Channel_13: ADC Channel13 selected, not available for STM32F031 devices * @arg ADC_Channel_14: ADC Channel14 selected, not available for STM32F031 devices * @arg ADC_Channel_15: ADC Channel15 selected, not available for STM32F031 devices * @arg ADC_Channel_16: ADC Channel16 selected * @arg ADC_Channel_17: ADC Channel17 selected * @arg ADC_Channel_18: ADC Channel18 selected, not available for STM32F030 devices * @param ADC_SampleTime: The sample time value to be set for the selected channel. * This parameter can be one of the following values: * @arg ADC_SampleTime_1_5Cycles: Sample time equal to 1.5 cycles * @arg ADC_SampleTime_7_5Cycles: Sample time equal to 7.5 cycles * @arg ADC_SampleTime_13_5Cycles: Sample time equal to 13.5 cycles * @arg ADC_SampleTime_28_5Cycles: Sample time equal to 28.5 cycles * @arg ADC_SampleTime_41_5Cycles: Sample time equal to 41.5 cycles * @arg ADC_SampleTime_55_5Cycles: Sample time equal to 55.5 cycles * @arg ADC_SampleTime_71_5Cycles: Sample time equal to 71.5 cycles * @arg ADC_SampleTime_239_5Cycles: Sample time equal to 239.5 cycles * @retval None */ void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_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_SAMPLE_TIME(ADC_SampleTime)); /* Configure the ADC Channel */ ADCx->CHSELR |= (uint32_t)ADC_Channel; /* Clear the Sampling time Selection bits */ tmpreg &= ~ADC_SMPR1_SMPR; /* Set the ADC Sampling Time register */ tmpreg |= (uint32_t)ADC_SampleTime; /* Configure the ADC Sample time register */ ADCx->SMPR = tmpreg ; }
/******************************************************************************* * 函数名称: ADC_GetResetCalibrationStatus * 功能描述: 得到选中的ADC重置校准寄存器的状态. * 输入参数: ADCx:其中x可以是1、2或3,用来选择ADC外围模块. * 输出参数: 无 * 返回参数: ADC重置校准寄存器的新状态(SET或RESET). *******************************************************************************/ FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx) { FlagStatus bitstatus = RESET; /* Check the parameters [检查参数] */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); /* Check the status of RSTCAL bit [检查状态位RSTCAL]*/ if ((ADCx->CR2 & CR2_RSTCAL_Set) != (u32)RESET) { /* RSTCAL bit is set [置位RSTCAL]*/ bitstatus = SET; } else { /* RSTCAL bit is reset [复位RSTCAL]*/ bitstatus = RESET; } /* Return the RSTCAL bit status [返回状态位RSTCAL]*/ return bitstatus; }
/******************************************************************************* * 函数名称: ADC_GetCalibrationStatus * 功能描述: 得到选中的ADC 校准的状态 * 输入参数: ADCx:其中x可以是1、2或3,用来选择ADC外围模块.. * 输出参数: 无 * 返回参数: ADC 校准的新状态(SET 或RESET). *******************************************************************************/ FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx) { FlagStatus bitstatus = RESET; /* Check the parameters [检查参数] */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); /* Check the status of CAL bit [检查状态位CAL]*/ if ((ADCx->CR2 & CR2_CAL_Set) != (u32)RESET) { /* CAL bit is set: calibration on going [CAL设置:校准开始]*/ bitstatus = SET; } else { /* CAL bit is reset: end of calibration [CAL复位:结束校准]*/ bitstatus = RESET; } /* Return the CAL bit status [返回状态位CAL]*/ return bitstatus; }
/******************************************************************************* * 函数名称: ADC_GetSoftwareStartConvStatus * 功能描述: 获得选中ADC软件开始转换状态。 * 输入参数: ADCx:其中x可以是1、2或3,用来选择ADC外围模块. * 输出参数: 无 * 返回参数: ADC软件开始转换的新状态(SET或RESET). *******************************************************************************/ FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx) { FlagStatus bitstatus = RESET; /* Check the parameters [检查参数] */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); /* Check the status of SWSTART bit [检查状态位SWSTART]*/ if ((ADCx->CR2 & CR2_SWSTART_Set) != (u32)RESET) { /* SWSTART bit is set [置位SWSTART]*/ bitstatus = SET; } else { /* SWSTART bit is reset [复位SWSTART]*/ bitstatus = RESET; } /* Return the SWSTART bit status [返回状态位SWSTART]*/ return bitstatus; }
/** * @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 Configures for the selected ADC and its sampling time. * @param ADCx: where x can be 1 to select the ADC peripheral. * @param ADC_Channel: the ADC channel to configure. * This parameter can be any combination 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_9: ADC Channel9 selected * @arg ADC_Channel_10: ADC Channel10 selected * @arg ADC_Channel_11: ADC Channel11 selected * @arg ADC_Channel_12: ADC Channel12 selected * @arg ADC_Channel_13: ADC Channel13 selected * @arg ADC_Channel_14: ADC Channel14 selected * @arg ADC_Channel_15: ADC Channel15 selected * @arg ADC_Channel_16: ADC Channel16 selected * @arg ADC_Channel_17: ADC Channel17 selected * @arg ADC_Channel_18: ADC Channel18 selected * @param ADC_SampleTime: The sample time value to be set for the selected channel. * This parameter can be one of the following values: * @arg ADC_SampleTime_1_5Cycles: Sample time equal to 1.5 cycles * @arg ADC_SampleTime_7_5Cycles: Sample time equal to 7.5 cycles * @arg ADC_SampleTime_13_5Cycles: Sample time equal to 13.5 cycles * @arg ADC_SampleTime_28_5Cycles: Sample time equal to 28.5 cycles * @arg ADC_SampleTime_41_5Cycles: Sample time equal to 41.5 cycles * @arg ADC_SampleTime_55_5Cycles: Sample time equal to 55.5 cycles * @arg ADC_SampleTime_71_5Cycles: Sample time equal to 71.5 cycles * @arg ADC_SampleTime_239_5Cycles: Sample time equal to 239.5 cycles * @retval None */ void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_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_SAMPLE_TIME(ADC_SampleTime)); /* Configure the ADC Channel */ // ADCx->CHSELR |= (uint32_t)ADC_Channel; PbP bug fix. The STM code logic ORs the Channel. This will not clear any previous set channels ADCx->CHSELR = (uint32_t)ADC_Channel; // Our fix will clear previous set channels /* Clear the Sampling time Selection bits */ tmpreg &= ~ADC_SMPR1_SMPR; /* Set the ADC Sampling Time register */ tmpreg |= (uint32_t)ADC_SampleTime; /* Configure the ADC Sample time register */ ADCx->SMPR = tmpreg ; }
/******************************************************************************* * 函数名称: ADC_GetFlagStatus * 功能描述: 检查指定的ADC标志是否置位. * 输入参数: (1)ADCx:其中x可以是1、2或3,用来选择ADC外围模块. * (2)ADC_FLAG:指定需要检查的标志。 * 给出了ADC_FLAG 的取值: * - ADC_FLAG_AWD: 模拟看门狗标志 * - ADC_FLAG_EOC: 转换结束标志 * - ADC_FLAG_JEOC: 注入组转换结束标志 * - ADC_FLAG_JSTRT: 注入组转换开始标志 * - ADC_FLAG_STRT: 常规组转换开始标志 * 输出参数: 无 * 返回参数: ADC_FLAG的新状态(SET或RESET). *******************************************************************************/ FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, u8 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 [检查指定ADC状态位]*/ if ((ADCx->SR & ADC_FLAG) != (u8)RESET) { /* ADC_FLAG is set [置位ADC_FLAG]*/ bitstatus = SET; } else { /* ADC_FLAG is reset [复位ADC_FLAG]*/ bitstatus = RESET; } /* Return the ADC_FLAG status [返回状态位ADC_FLAG]*/ return bitstatus; }
/******************************************************************************* * 函数名称: ADC_ITConfig * 功能描述: 使能/禁止指定的ADC中断. * 输入参数: (1)ADCx: 其中x可以是1、2或3,用来选择ADC外围模块. * (2)ADC_IT: 指定ADC中断源是使能的或禁止的. * ADC_IT 用来使能或者禁止ADC 中断.可以使用下述值的一个或者几个值的组合: * - ADC_IT_EOC: EOC中断屏蔽 * - ADC_IT_AWD: AWDOG中断屏蔽 * - ADC_IT_JEOC: JEOC中断屏蔽 * (3)NewState: 指定的ADC中断的新状态这个参数可以是:ENABLE或DISABLE * 输出参数: 无 * 返回参数: 无 *******************************************************************************/ void ADC_ITConfig(ADC_TypeDef* ADCx, u16 ADC_IT, FunctionalState NewState) { u8 itmask = 0; /* 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 [取得ADC IT中断号]*/ itmask = (u8)ADC_IT; if (NewState != DISABLE) { /* Enable the selected ADC interrupts [允许选择的ADC 中断]*/ ADCx->CR1 |= itmask; } else { /* Disable the selected ADC interrupts [禁用选择的ADC 中断]*/ ADCx->CR1 &= (~(u32)itmask); } }
/** * @brief Initializes the ADCx peripheral according to the specified parameters * in the ADC_InitStruct. * @note This function is used to configure the global features of the ADC ( * Resolution, Data Alignment, continuous mode activation, External * trigger source and edge, Sequence Scan Direction). * @param ADCx: where x can be 1 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 tmpreg = 0; /* Check the parameters */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); assert_param(IS_ADC_RESOLUTION(ADC_InitStruct->ADC_Resolution)); assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode)); assert_param(IS_ADC_EXT_TRIG_EDGE(ADC_InitStruct->ADC_ExternalTrigConvEdge)); assert_param(IS_ADC_EXTERNAL_TRIG_CONV(ADC_InitStruct->ADC_ExternalTrigConv)); assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign)); assert_param(IS_ADC_SCAN_DIRECTION(ADC_InitStruct->ADC_ScanDirection)); /* Get the ADCx CFGR value */ tmpreg = ADCx->CFGR1; /* Clear SCANDIR, RES[1:0], ALIGN, EXTSEL[2:0], EXTEN[1:0] and CONT bits */ tmpreg &= CFGR1_CLEAR_MASK; /*---------------------------- ADCx CFGR Configuration ---------------------*/ /* Set RES[1:0] bits according to ADC_Resolution value */ /* Set CONT bit according to ADC_ContinuousConvMode value */ /* Set EXTEN[1:0] bits according to ADC_ExternalTrigConvEdge value */ /* Set EXTSEL[2:0] bits according to ADC_ExternalTrigConv value */ /* Set ALIGN bit according to ADC_DataAlign value */ /* Set SCANDIR bit according to ADC_ScanDirection value */ tmpreg |= (uint32_t)(ADC_InitStruct->ADC_Resolution | ((uint32_t)( ADC_InitStruct->ADC_ContinuousConvMode) << 13) | ADC_InitStruct->ADC_ExternalTrigConvEdge | ADC_InitStruct->ADC_ExternalTrigConv | ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ScanDirection); /* Write to ADCx CFGR */ ADCx->CFGR1 = tmpreg; }
/** * @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; } }
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) { uint32_t tmpreg1 = 0, tmpreg2 = 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)); /* if ADC_Channel_10 ... ADC_Channel_18 is selected */ if (ADC_Channel > ADC_Channel_9) { /* Get the old register value */ tmpreg1 = ADCx->SMPR1; /* Calculate the mask to clear */ tmpreg2 = SMPR1_SMP_SET << (3 * (ADC_Channel - 10)); /* Clear the old sample time */ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set */ tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); /* Set the new sample time */ tmpreg1 |= tmpreg2; /* Store the new register value */ ADCx->SMPR1 = tmpreg1; } else /* ADC_Channel include in ADC_Channel_[0..9] */ { /* Get the old register value */ tmpreg1 = ADCx->SMPR2; /* Calculate the mask to clear */ tmpreg2 = SMPR2_SMP_SET << (3 * ADC_Channel); /* Clear the old sample time */ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set */ tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); /* Set the new sample time */ tmpreg1 |= tmpreg2; /* Store the new register value */ ADCx->SMPR2 = tmpreg1; } /* For Rank 1 to 6 */ if (Rank < 7) { /* Get the old register value */ tmpreg1 = ADCx->SQR3; /* Calculate the mask to clear */ tmpreg2 = SQR3_SQ_SET << (5 * (Rank - 1)); /* Clear the old SQx bits for the selected rank */ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set */ tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1)); /* Set the SQx bits for the selected rank */ tmpreg1 |= tmpreg2; /* Store the new register value */ ADCx->SQR3 = tmpreg1; } /* For Rank 7 to 12 */ else if (Rank < 13) { /* Get the old register value */ tmpreg1 = ADCx->SQR2; /* Calculate the mask to clear */ tmpreg2 = SQR2_SQ_SET << (5 * (Rank - 7)); /* Clear the old SQx bits for the selected rank */ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set */ tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7)); /* Set the SQx bits for the selected rank */ tmpreg1 |= tmpreg2; /* Store the new register value */ ADCx->SQR2 = tmpreg1; } /* For Rank 13 to 16 */ else { /* Get the old register value */ tmpreg1 = ADCx->SQR1; /* Calculate the mask to clear */ tmpreg2 = SQR1_SQ_SET << (5 * (Rank - 13)); /* Clear the old SQx bits for the selected rank */ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set */ tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13)); /* Set the SQx bits for the selected rank */ tmpreg1 |= tmpreg2; /* Store the new register value */ ADCx->SQR1 = tmpreg1; } }
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct) { uint32_t tmpreg1 = 0; uint8_t tmpreg2 = 0; /* Check the parameters */ assert_param(IS_ADC_ALL_PERIPH(ADCx)); assert_param(IS_ADC_RESOLUTION(ADC_InitStruct->ADC_Resolution)); assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode)); assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode)); assert_param(IS_ADC_EXT_TRIG_EDGE(ADC_InitStruct->ADC_ExternalTrigConvEdge)); 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_NbrOfConversion)); /*---------------------------- ADCx CR1 Configuration -----------------*/ /* Get the ADCx CR1 value */ tmpreg1 = ADCx->CR1; /* Clear RES and SCAN bits */ tmpreg1 &= CR1_CLEAR_MASK; /* Configure ADCx: scan conversion mode and resolution */ /* Set SCAN bit according to ADC_ScanConvMode value */ /* Set RES bit according to ADC_Resolution value */ tmpreg1 |= (uint32_t)(((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8) | \ ADC_InitStruct->ADC_Resolution); /* Write to ADCx CR1 */ ADCx->CR1 = tmpreg1; /*---------------------------- ADCx CR2 Configuration -----------------*/ /* Get the ADCx CR2 value */ tmpreg1 = ADCx->CR2; /* Clear CONT, ALIGN, EXTEN and EXTSEL bits */ tmpreg1 &= CR2_CLEAR_MASK; /* Configure ADCx: external trigger event and edge, data alignment and continuous conversion mode */ /* Set ALIGN bit according to ADC_DataAlign value */ /* Set EXTEN bits according to ADC_ExternalTrigConvEdge value */ /* Set EXTSEL bits according to ADC_ExternalTrigConv value */ /* Set CONT bit according to ADC_ContinuousConvMode value */ tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | \ ADC_InitStruct->ADC_ExternalTrigConv | ADC_InitStruct->ADC_ExternalTrigConvEdge | \ ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1)); /* Write to ADCx CR2 */ ADCx->CR2 = tmpreg1; /*---------------------------- ADCx SQR1 Configuration -----------------*/ /* Get the ADCx SQR1 value */ tmpreg1 = ADCx->SQR1; /* Clear L bits */ tmpreg1 &= SQR1_L_RESET; /* Configure ADCx: regular channel sequence length */ /* Set L bits according to ADC_NbrOfConversion value */ tmpreg2 |= (uint8_t)(ADC_InitStruct->ADC_NbrOfConversion - (uint8_t)1); tmpreg1 |= ((uint32_t)tmpreg2 << 20); /* Write to ADCx SQR1 */ ADCx->SQR1 = tmpreg1; }
/******************************************************************************* * 函数名称: ADC_RegularChannelConfig * 功能描述: 为选中的ADC常规组信道配置相关的音序器(sequencer)等级和采样时间。 * 输入参数: (1)ADCx:其中x可以是1、2或3,用来选择ADC外围模块. * (2)ADC_Channel:需要配置的ADC信道 * ADC_Channel 可能的取值: * - ADC_Channel_0: ADC信道0被选择 * - ADC_Channel_1: ADC信道1被选择 * - ADC_Channel_2: ADC信道2被选择 * - ADC_Channel_3: ADC信道3被选择 * - ADC_Channel_4: ADC信道4被选择 * - ADC_Channel_5: ADC信道5被选择 * - ADC_Channel_6: ADC信道6被选择 * - ADC_Channel_7: ADC信道7被选择 * - ADC_Channel_8: ADC信道8被选择 * - ADC_Channel_9: ADC信道9被选择 * - ADC_Channel_10: ADC信道10被选择 * - ADC_Channel_11: ADC信道11被选择 * - ADC_Channel_12: ADC信道12被选择 * - ADC_Channel_13: ADC信道13被选择 * - ADC_Channel_14: ADC信道14被选择 * - ADC_Channel_15: ADC信道15被选择 * - ADC_Channel_16: ADC信道16被选择 * - ADC_Channel_17: ADC信道17被选择 * (3)Rank:常规组音序器(sequencer)的等级。参数范围是1-16。 * (4)ADC_SampleTime:将要为所选的信道设置的采样时间 * ADC_SampleTime.取值: * - ADC_SampleTime_1Cycles5: 采样时间等于1.5个周期 * - ADC_SampleTime_7Cycles5: 采样时间等于7.5个周期 * - ADC_SampleTime_13Cycles5: 采样时间等于13.5个周期 * - ADC_SampleTime_28Cycles5: 采样时间等于28.5个周期 * - ADC_SampleTime_41Cycles5: 采样时间等于41.5个周期 * - ADC_SampleTime_55Cycles5: 采样时间等于55.5个周期 * - ADC_SampleTime_71Cycles5: 采样时间等于71.5个周期 * - ADC_SampleTime_239Cycles5: 采样时间等于239.5个周期 * 输出参数: 无 * 返回参数: 无 *******************************************************************************/ void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, u8 ADC_Channel, u8 Rank, u8 ADC_SampleTime) { u32 tmpreg1 = 0, tmpreg2 = 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)); /* if ADC_Channel_10 ... ADC_Channel_17 is selected [如果ADC_Channel_10 ... ADC_Channel_17被选择]*/ if (ADC_Channel > ADC_Channel_9) { /* Get the old register value [取得旧的寄存器值]*/ tmpreg1 = ADCx->SMPR1; /* Calculate the mask to clear [计算需要清除的标志]*/ tmpreg2 = SMPR1_SMP_Set << (3 * (ADC_Channel - 10)); /* Clear the old discontinuous mode channel count [清除过去的不间断模式通道计数器]*/ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set [计算需要置位的标志]*/ tmpreg2 = (u32)ADC_SampleTime << (3 * (ADC_Channel - 10)); /* Set the discontinuous mode channel count [设置不间断模式通道计数器]*/ tmpreg1 |= tmpreg2; /* Store the new register value [存储新的寄存器值]*/ ADCx->SMPR1 = tmpreg1; } else /* ADC_Channel include in ADC_Channel_[0..9] [ADC_Channel 在 ADC_Channel_[0..9]之间]*/ { /* Get the old register value [取得旧的寄存器值]*/ tmpreg1 = ADCx->SMPR2; /* Calculate the mask to clear [计算需要清除的标志]*/ tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel); /* Clear the old discontinuous mode channel count [清除过去的不间断模式通道计数器]*/ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set [计算需要置位的标志]*/ tmpreg2 = (u32)ADC_SampleTime << (3 * ADC_Channel); /* Set the discontinuous mode channel count [设置不间断模式通道计数器]*/ tmpreg1 |= tmpreg2; /* Store the new register value [存储新的寄存器值]*/ ADCx->SMPR2 = tmpreg1; } /* For Rank 1 to 6 [序列在1到6之间]*/ if (Rank < 7) { /* Get the old register value [取得旧的寄存器值]*/ tmpreg1 = ADCx->SQR3; /* Calculate the mask to clear [计算需要清除的标志]*/ tmpreg2 = SQR3_SQ_Set << (5 * (Rank - 1)); /* Clear the old SQx bits for the selected rank [根据选择的序列清除旧的SQx位]*/ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set [计算需要置位的标志]*/ tmpreg2 = (u32)ADC_Channel << (5 * (Rank - 1)); /* Set the SQx bits for the selected rank [根据选择的序列置位新的SQx位]*/ tmpreg1 |= tmpreg2; /* Store the new register value [存储新的寄存器值]*/ ADCx->SQR3 = tmpreg1; } /* For Rank 7 to 12 [序列在7到12之间]*/ else if (Rank < 13) { /* Get the old register value [取得旧的寄存器值]*/ tmpreg1 = ADCx->SQR2; /* Calculate the mask to clear [计算需要清除的标志]*/ tmpreg2 = SQR2_SQ_Set << (5 * (Rank - 7)); /* Clear the old SQx bits for the selected rank [根据选择的序列清除旧的SQx位]*/ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set [计算需要置位的标志]*/ tmpreg2 = (u32)ADC_Channel << (5 * (Rank - 7)); /* Set the SQx bits for the selected rank [根据选择的序列置位新的SQx位]*/ tmpreg1 |= tmpreg2; /* Store the new register value [存储新的寄存器值]*/ ADCx->SQR2 = tmpreg1; } /* For Rank 13 to 16 [序列在13到16之间]*/ else { /* Get the old register value [取得旧的寄存器值]*/ tmpreg1 = ADCx->SQR1; /* Calculate the mask to clear [计算需要清除的标志]*/ tmpreg2 = SQR1_SQ_Set << (5 * (Rank - 13)); /* Clear the old SQx bits for the selected rank [根据选择的序列清除旧的SQx位]*/ tmpreg1 &= ~tmpreg2; /* Calculate the mask to set [计算需要置位的标志]*/ tmpreg2 = (u32)ADC_Channel << (5 * (Rank - 13)); /* Set the SQx bits for the selected rank [根据选择的序列置位新的SQx位]*/ tmpreg1 |= tmpreg2; /* Store the new register value [存储新的寄存器值]*/ ADCx->SQR1 = tmpreg1; } }