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

📄 stm32f10x_adc.c

📁 中文固件库.rar
💻 C
📖 第 1 页 / 共 3 页
字号:
  {
    /* 允许选择的ADC转换外部事件和启动选择的ADC转换 */
    ADCx->CR2 |= CR2_EXTTRIG_SWSTART_Set;
  }
  else
  {
    /* 禁止选择的ADC转换外部事件和停止选择的ADC转换 */
    ADCx->CR2 &= CR2_EXTTRIG_SWSTART_Reset;
  }
}

/**
  * @简述  获取ADC软件转换启动状态.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @返回  ADC软件开始转换的新状态 (SET 或 RESET).
  */
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx)
{
  FlagStatus bitstatus = RESET;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  /* 检查 SWSTART 位的新状态 */
  if ((ADCx->CR2 & CR2_SWSTART_Set) != (uint32_t)RESET)
  {
    /* 设置 SWSTART 位 */
    bitstatus = SET;
  }
  else
  {
    /* 复位 SWSTART 位 */
    bitstatus = RESET;
  }
  /* 返回 SWSTART 位的状态 */
  return  bitstatus;
}

/**
  * @简述  对ADC规则组通道配置间断模式.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  Number: 模式下常规信道计数值,该值范围为1-8. 
  * @返回  没有
  */
void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number)
{
  uint32_t tmpreg1 = 0;
  uint32_t tmpreg2 = 0;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_REGULAR_DISC_NUMBER(Number));
  /* 得到过去的寄存器值 */
  tmpreg1 = ADCx->CR1;
  /* 清除过去的不间断模式通道计数器 */
  tmpreg1 &= CR1_DISCNUM_Reset;
  /* 设置间断模式通道计数器 */
  tmpreg2 = Number - 1;
  tmpreg1 |= tmpreg2 << 13;
  /* 存储寄存器的新值 */
  ADCx->CR1 = tmpreg1;
}

/**
  * @简述  使能或者失能指定的ADC规则组通道的间断模式.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  NewState: 指定的ADC规则组通道的间断模式的新状态.
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 使能指定的ADC规则组通道的间断模式 */
    ADCx->CR1 |= CR1_DISCEN_Set;
  }
  else
  {
    /* 失能指定的ADC规则组通道的间断模式 */
    ADCx->CR1 &= CR1_DISCEN_Reset;
  }
}

/**
  * @简述  设置指定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到16.
  * @参数  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_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
{
  uint32_t tmpreg1 = 0, tmpreg2 = 0;
  /* 检查参数 */
  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));
  /* 如果选定 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;
  }
  /* For Rank 1 to 6 */
  if (Rank < 7)
  {
    /* 得到旧的寄存器的值 */
    tmpreg1 = ADCx->SQR3;
    /* 计算需要清除的标志 */
    tmpreg2 = SQR3_SQ_Set << (5 * (Rank - 1));
    /* 根据选择的序列清除旧的 SQx 位 */
    tmpreg1 &= ~tmpreg2;
    /* 计算需要置位的标志 */
    tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1));
    /* 根据选择的序列设置新的 SQx 位 */
    tmpreg1 |= tmpreg2;
    /* 存储新的寄存器的值 */
    ADCx->SQR3 = tmpreg1;
  }
  /* For Rank 7 to 12 */
  else if (Rank < 13)
  {
    /* 得到旧的寄存器的值 */
    tmpreg1 = ADCx->SQR2;
    /* 计算需要清除的标志 */
    tmpreg2 = SQR2_SQ_Set << (5 * (Rank - 7));
    /* 根据选择的序列清除旧的 SQx 位 */
    tmpreg1 &= ~tmpreg2;
    /* 计算需要置位的标志 */
    tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7));
    /* 根据选择的序列设置新的 SQx 位 */
    tmpreg1 |= tmpreg2;
    /* 存储新的寄存器的值 */
    ADCx->SQR2 = tmpreg1;
  }
  /* For Rank 13 to 16 */
  else
  {
    /* 得到旧的寄存器的值 */
    tmpreg1 = ADCx->SQR1;
    /* 计算需要清除的标志 */
    tmpreg2 = SQR1_SQ_Set << (5 * (Rank - 13));
    /* 根据选择的序列清除旧的 SQx 位 */
    tmpreg1 &= ~tmpreg2;
    /* 计算需要置位的标志 */
    tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13));
    /* 根据选择的序列设置新的 SQx 位 */
    tmpreg1 |= tmpreg2;
    /* 存储新的寄存器的值 */
    ADCx->SQR1 = tmpreg1;
  }
}

/**
  * @简述  使能或者失能 ADCx 的经外部触发启动转换功能.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  NewState: 选定的 ADCx 的经外部触发启动转换功能的新状态.
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 使能 ADCx 的经外部触发启动转换功能 */
    ADCx->CR2 |= CR2_EXTTRIG_Set;
  }
  else
  {
    /* 失能 ADCx 的经外部触发启动转换功能 */
    ADCx->CR2 &= CR2_EXTTRIG_Reset;
  }
}

/**
  * @简述  返回最近一次 ADCx 规则组的转换结果.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @返回  转换结果.
  */
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)
{
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  /* 返回最近一次 ADCx 规则组的转换结果 */
  return (uint16_t) ADCx->DR;
}

/**
  * @简述  返回最近一次双 ADC 模式下的 ADC1 和 ADC2 转换结果.
  * @retval 转换结果.
  */
uint32_t ADC_GetDualModeConversionValue(void)
{
  /* 返回双转换下的转换结果 */
  return (*(__IO uint32_t *) DR_ADDRESS);
}

/**
  * @简述  使能或者失能指定 ADC 在规则组转化后自动开始注入组转换.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  NewState: 选中的进行自动注入转换的ADC新状态.
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 使能指定 ADC 在规则组转化后自动开始注入组转换 */
    ADCx->CR1 |= CR1_JAUTO_Set;
  }
  else
  {
    /* 失能指定 ADC 在规则组转化后自动开始注入组转换 */
    ADCx->CR1 &= CR1_JAUTO_Reset;
  }
}

/**
  * @简述  使能或者失能指定 ADC 的注入组间断模式
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  NewState: ADC 注入组通道上间断模式的新状态.
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 失能指定 ADC 的注入组间断模式 */
    ADCx->CR1 |= CR1_JDISCEN_Set;
  }
  else
  {
    /* 失能指定 ADC 的注入组间断模式 */
    ADCx->CR1 &= CR1_JDISCEN_Reset;
  }
}

/**
  * @简述  配置 ADCx 的外部触发启动注入组转换功能.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  ADC_ExternalTrigInjecConv: 开始注入转换的ADC触发器. 
  *          这个参数可以取下列值之一:
  *          ADC_ExternalTrigInjecConv_T1_TRGO: 选择定时器1的TRGO作为注入转换外部触发 (for ADC1, ADC2 and ADC3)
  *          ADC_ExternalTrigInjecConv_T1_CC4:  选择定时器1的捕获比较4作为注入转换外部触发 (for ADC1, ADC2 and ADC3)
  *          ADC_ExternalTrigInjecConv_T2_TRGO: 选择定时器2的 TRGO 作为注入转换外部触发 (for ADC1 and ADC2)
  *          ADC_ExternalTrigInjecConv_T2_CC1:  选择定时器2的捕获比较1作为注入转换外部触发 (for ADC1 and ADC2)
  *          ADC_ExternalTrigInjecConv_T3_CC4:  选择定时器3的捕获比较4作为注入转换外部触发 (for ADC1 and ADC2)
  *          ADC_ExternalTrigInjecConv_T4_TRGO: 选择定时器4的TRGO作为注入转换外部触发 (for ADC1 and ADC2)
  *          ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4: 外部中断15或者timer8比较事件作为注入转换的外部触发器 (for ADC1 and ADC2)                       
  *          ADC_ExternalTrigInjecConv_T4_CC3:  选择定时器4捕获比较3 (for ADC3 only)
  *          ADC_ExternalTrigInjecConv_T8_CC2:  选择定时器8捕获比较2 (for ADC3 only)                         
  *          ADC_ExternalTrigInjecConv_T8_CC4:  选择定时器8捕获比较4 (for ADC3 only)
  *          ADC_ExternalTrigInjecConv_T5_TRGO: 选择定时器5触发事件 (for ADC3 only)                         
  *          ADC_ExternalTrigInjecConv_T5_CC4:  选择定时器5捕获比较4 (for ADC3 only)                        
  *          ADC_ExternalTrigInjecConv_None:    注入转换由软件启动,而不是由外部触发器启动 (for ADC1, ADC2 and ADC3)
  * @返回  没有
  */
void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv)
{
  uint32_t tmpreg = 0;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_EXT_INJEC_TRIG(ADC_ExternalTrigInjecConv));
  /* 得到旧的寄存器的值 */
  tmpreg = ADCx->CR2;
  /* 清除选择的注入通道群的外部触发事件 */
  tmpreg &= CR2_JEXTSEL_Reset;
  /* 设置选择的注入通道群的外部触发事件 */
  tmpreg |= ADC_ExternalTrigInjecConv;
  /* 存储新的寄存器的值 */
  ADCx->CR2 = tmpreg;
}

/**
  * @简述  使能或者失能 ADCx 的经外部触发启动注入组转换功能.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  NewState: 指定ADC外部触发启动注入转换的新状态.
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 使能 ADCx 的经外部触发启动注入组转换功能 */
    ADCx->CR2 |= CR2_JEXTTRIG_Set;
  }
  else
  {
    /* 失能 ADCx 的经外部触发启动注入组转换功能 */
    ADCx->CR2 &= CR2_JEXTTRIG_Reset;
  }
}

/**
  * @简述  使能或者失能 ADCx 软件启动注入组转换功能.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @参数  NewState: 指定 ADC 软件触发启动注入转换的新状态.
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 使能 ADCx 软件启动注入组转换功能并且启动注入选择 */
    ADCx->CR2 |= CR2_JEXTTRIG_JSWSTART_Set;
  }
  else
  {
    /* 失能 ADCx 软件启动注入组转换功能并且启动注入选择 */
    ADCx->CR2 &= CR2_JEXTTRIG_JSWSTART_Reset;
  }
}

/**
  * @简述  获取指定 ADC 的软件启动注入组转换状态.
  * @参数  ADCx: 其中x可以是1、2或3,用来选择ADC外围模块.
  * @返回  指定的 ADC 软件触发启动注入转换的新状态 (SET 或 RESET).
  */
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx)
{
  FlagStatus bitstatus = RESET;
  /* 检查参数 */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  /* 检查 JSWSTART 位的状态 */
  if ((ADCx->CR2 & CR2_JSWSTART_Set) != (uint32_t)RESET)
  {
    /* 设置 JSWSTART 位 */
    bitstatus = SET;
  }
  else
  {
    /* 复位 JSWSTART 位 */
    bitstatus = RESET;
  }
  /* 返回 JSWSTART 位的状态 */
  return  bitstatus;
}

/**

⌨️ 快捷键说明

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