📄 stm32f10x_adc.c
字号:
{
/* 允许选择的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 + -