⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f10x_adc.c

📁 中文固件库.rar
💻 C
📖 第 1 页 / 共 3 页
字号:
  * @简述  设置指定 ADC 的注入组通道,设置它们的转化顺序和采样时间.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  ADC_Channel: 被设置的ADC通道. 
  *          这个参数可以取下列值之一:
  *          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 
  * @参数  Rank: 规则组采样顺序.取值范围1到4.
  * @参数  ADC_SampleTime: 指定ADC通道的采样时间值. 
  *          这个参数可以使用下述值的一个:
  *          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_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
{
  uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_CHANNEL(ADC_Channel));
  assert_param(IS_ADC_INJECTED_RANK(Rank));
  assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime));
  /* 如果选择 ADC_Channel_10 ... ADC_Channel_17 */
  if (ADC_Channel > ADC_Channel_9)
  {
    /* 得到旧的寄存器的值 */
    tmpreg1 = ADCx->SMPR1;
    /* 计算需要清除的标志 */
    tmpreg2 = SMPR1_SMP_Set << (3*(ADC_Channel - 10));
    /* 清除旧的通道采样时间 */
    tmpreg1 &= ~tmpreg2;
    /* 计算需要置位的标志 */
    tmpreg2 = (uint32_t)ADC_SampleTime << (3*(ADC_Channel - 10));
    /* 设置新的通道采样时间 */
    tmpreg1 |= tmpreg2;
    /* 存储新的寄存器的值 */
    ADCx->SMPR1 = tmpreg1;
  }
  else /* ADC_Channel include in ADC_Channel_[0..9] */
  {
    /* 得到旧的寄存器的值 */
    tmpreg1 = ADCx->SMPR2;
    /* 计算需要清除的标志 */
    tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel);
    /* 清除旧的通道采样时间 */
    tmpreg1 &= ~tmpreg2;
    /* 计算需要置位的标志 */
    tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel);
    /* 设置新的通道采样时间 */
    tmpreg1 |= tmpreg2;
    /* 存储新的寄存器的值 */
    ADCx->SMPR2 = tmpreg1;
  }
  /* 配置 Rank 规则组采样顺序 */
  /* 得到旧的寄存器的值 */
  tmpreg1 = ADCx->JSQR;
  /* 得到 JL 的值: Number = JL+1 */
  tmpreg3 =  (tmpreg1 & JSQR_JL_Set)>> 20;
  /* 计算需要清除的标志: ((Rank-1)+(4-JL-1)) */
  tmpreg2 = JSQR_JSQ_Set << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1)));
  /* 清除选中序列 JSQx 位 */
  tmpreg1 &= ~tmpreg2;
  /* 计算需要置位的标志: ((Rank-1)+(4-JL-1)) */
  tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1)));
  /* 置位选中序列旧的 JSQx 位 */
  tmpreg1 |= tmpreg2;
  /* 存储新的寄存器的值 */
  ADCx->JSQR = tmpreg1;
}

/**
  * @简述  设置注入组通道的转换序列长度
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  Length: 转换序列长度. 
  *                这个参数必须是 1 到 4 之间的值.
  * @返回  没有
  */
void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length)
{
  uint32_t tmpreg1 = 0;
  uint32_t tmpreg2 = 0;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_INJECTED_LENGTH(Length));
  
  /* 得到旧的寄存器的值 */
  tmpreg1 = ADCx->JSQR;
  /* 清除注入信道音序器的长度 JL 位 */
  tmpreg1 &= JSQR_JL_Reset;
  /* 置位注入信道音序器的长度 JL 位 */
  tmpreg2 = Length - 1; 
  tmpreg1 |= tmpreg2 << 20;
  /* 存储新的寄存器的值 */
  ADCx->JSQR = tmpreg1;
}

/**
  * @简述  设置注入组通道的转换偏移值
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  ADC_InjectedChannel: 需要设置偏移值的ADC注入信道. 
  *          这个参数可以使用下述值的一个:
  *          ADC_InjectedChannel_1: 选择注入通道1 
  *          ADC_InjectedChannel_2: 选择注入通道2 
  *          ADC_InjectedChannel_3: 选择注入通道3 
  *          ADC_InjectedChannel_4: 选择注入通道4 
  * @参数  Offset: 选中的ADC注入信道的偏移值,该参数是一个12位值.
  * @返回  没有
  */
void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset)
{
  __IO uint32_t tmp = 0;
  
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel));
  assert_param(IS_ADC_OFFSET(Offset));  
  
  tmp = (uint32_t)ADCx;
  tmp += ADC_InjectedChannel;
  
  /* 设置选定的注入通道的数据偏移量 */
  *(__IO uint32_t *) tmp = (uint32_t)Offset;
}

/**
  * @简述  返回 ADC 指定注入通道的转换结果
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  ADC_InjectedChannel: 指定注入通道.
  *          这个参数可以使用下述值的一个:
  *          ADC_InjectedChannel_1: 选定注入通道1 
  *          ADC_InjectedChannel_2: 选定注入通道2
  *          ADC_InjectedChannel_3: 选定注入通道3
  *          ADC_InjectedChannel_4: 选定注入通道4
  * @返回  转换结果.
  */
uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel)
{
  __IO uint32_t tmp = 0;
  
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel));

  tmp = (uint32_t)ADCx;
  tmp += ADC_InjectedChannel + JDR_Offset;
  
  /* 返回 ADC 指定注入通道的转换结果 */
  return (uint16_t) (*(__IO uint32_t*)  tmp);   
}

/**
  * @简述  使能或者失能指定单个/全体,规则/注入组通道上的模拟看门狗
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  ADC_AnalogWatchdog: ADC模拟看门狗配置.
  *          这个参数可以使用下述值的一个:
  *          ADC_AnalogWatchdog_SingleRegEnable:        单个规则通道上设置模拟看门狗
  *          ADC_AnalogWatchdog_SingleInjecEnable:      单个注入通道上设置模拟看门狗
  *          ADC_AnalogWatchdog_SingleRegOrInjecEnable: 单个规则通道或者注入通道上设置模拟看门狗
  *          ADC_AnalogWatchdog_AllRegEnable:           所有规则通道上设置模拟看门狗
  *          ADC_AnalogWatchdog_AllInjecEnable:         所有注入通道上设置模拟看门狗
  *          ADC_AnalogWatchdog_AllRegAllInjecEnable:   所有规则通道和所有注入通道上上设置模拟看门狗
  *          ADC_AnalogWatchdog_None:                   不设置模拟看门狗
  * @返回  没有	  
  */
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog)
{
  uint32_t tmpreg = 0;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_ANALOG_WATCHDOG(ADC_AnalogWatchdog));
  /* 得到旧的寄存器的值 */
  tmpreg = ADCx->CR1;
  /* 清除 AWDEN, AWDENJ 和 AWDSGL 位 */
  tmpreg &= CR1_AWDMode_Reset;
  /* 设置模拟看门狗允许模式 */
  tmpreg |= ADC_AnalogWatchdog;
  /* 存储新的寄存器的值 */
  ADCx->CR1 = tmpreg;
}

/**
  * @简述  设置模拟看门狗的高/低阈值.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  HighThreshold: 模拟看门狗的高阈值.
  *                       这个参数是一个12位的值.
  * @参数  LowThreshold:  模拟看门狗的低阈值.
  *                       这个参数是一个12位的值.
  * @返回  没有
  */
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,
                                        uint16_t LowThreshold)
{
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_THRESHOLD(HighThreshold));
  assert_param(IS_ADC_THRESHOLD(LowThreshold));
  /* 设置模拟看门狗的高阈值 */
  ADCx->HTR = HighThreshold;
  /* 设置模拟看门狗的低阈值 */
  ADCx->LTR = LowThreshold;
}

/**
  * @简述  对单个ADC通道设置模拟看门狗
  * @参数  ADCx: 其中x可以是1、2或3,用来选择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 
  * @返回  没有
  */
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel)
{
  uint32_t tmpreg = 0;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_CHANNEL(ADC_Channel));
  /* 得到旧的寄存器的值 */
  tmpreg = ADCx->CR1;
  /* 清除模拟看门狗通道选择位 */
  tmpreg &= CR1_AWDCH_Reset;
  /* 设置模拟看门狗通道选择位 */
  tmpreg |= ADC_Channel;
  /* 存储寄存器的新值 */
  ADCx->CR1 = tmpreg;
}

/**
  * @简述  使能或者失能温度传感器和内部参考电压通道.
  * @参数  NewState: 温度传感器和内部参考电压通道的新状态.
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void ADC_TempSensorVrefintCmd(FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 使能温度传感器和内部参考电压通道 */
    ADC1->CR2 |= CR2_TSVREFE_Set;
  }
  else
  {
    /* 失能温度传感器和内部参考电压通道 */
    ADC1->CR2 &= CR2_TSVREFE_Reset;
  }
}

/**
  * @简述  检查制定 ADC 标志位置1与否.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  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, uint8_t ADC_FLAG)
{
  FlagStatus bitstatus = RESET;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_GET_FLAG(ADC_FLAG));
  /* 检查指定ADC状态位 */
  if ((ADCx->SR & ADC_FLAG) != (uint8_t)RESET)
  {
    /* 设置 ADC_FLAG 位 */
    bitstatus = SET;
  }
  else
  {
    /* 复位 ADC_FLAG 位 */
    bitstatus = RESET;
  }
  /* 返回 ADC_FLAG 的状态 */
  return  bitstatus;
}

/**
  * @简述  清除 ADCx 的待处理标志位.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  ADC_FLAG: 待处理的标志位. 
  *          这个参数可以是下列值的组合:
  *          ADC_FLAG_AWD:   模拟看门狗标志位
  *          ADC_FLAG_EOC:   转换结束标志位
  *          ADC_FLAG_JEOC:  注入组转换结束标志位
  *          ADC_FLAG_JSTRT: 注入组转换开始标志位
  *          ADC_FLAG_STRT:  规则组转换开始标志位
  * @返回  没有
  */
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)
{
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG));
  /* 清除指定的 ADC 标志 */
  ADCx->SR = ~(uint32_t)ADC_FLAG;
}

/**
  * @简述  检查指定的ADC中断是否发生.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  ADC_IT: 需要检查的ADC中断源. 
  *          这个参数可以使用下述值的一个:
  *          ADC_IT_EOC:  转换结束中断屏蔽
  *          ADC_IT_AWD:  模拟看门狗中断屏蔽
  *          ADC_IT_JEOC: 注入组转换结束中断屏蔽
  * @返回  ADC_IT 的新状态 (SET 或 RESET).
  */
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT)
{
  ITStatus bitstatus = RESET;
  uint32_t itmask = 0, enablestatus = 0;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_GET_IT(ADC_IT));
  /* 得到 ADC IT 中断号 */
  itmask = ADC_IT >> 8;
  /* 设置 ADC_IT 允许位状态 */
  enablestatus = (ADCx->CR1 & (uint8_t)ADC_IT) ;
  /* 检查指定的 ADC 中断 */
  if (((ADCx->SR & itmask) != (uint32_t)RESET) && enablestatus)
  {
    /* 设置 ADC_IT */
    bitstatus = SET;
  }
  else
  {
    /* 复位 ADC_IT */
    bitstatus = RESET;
  }
  /* 返回 ADC_IT 的状态 */
  return  bitstatus;
}

/**
  * @简述  清除 ADCx 的中断待处理位.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  ADC_IT: 带清除的 ADC 中断待处理位.
  *          可以使用下述值的一个或者几个值的组合:
  *          ADC_IT_EOC:  转换结束中断
  *          ADC_IT_AWD:  模拟看门狗中断
  *          ADC_IT_JEOC: 注入组转换结束中断
  * @返回  没有
  */
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT)
{
  uint8_t itmask = 0;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_IT(ADC_IT));
  /* 得到 ADC IT 中断号 */
  itmask = (uint8_t)(ADC_IT >> 8);
  /* 清除选择的ADC中断挂起位 */
  ADCx->SR = ~(uint32_t)itmask;
}

/**
  * @}
  */

/**
  * @}
  */

/**
  * @}
  */

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -