📄 stm32f10x_adc.c
字号:
* @简述 设置指定 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 + -