stm32f103c8t6最小系统PB9 PA10 PA14 PA15初始化为ADC1输入的代码,使用规则组方式
时间: 2023-08-29 18:05:28 浏览: 116
使用规则组方式初始化PA10、PA14、PA15和PB9对应的ADC1通道,可以参考以下代码:
```c
#include "stm32f10x.h"
void ADC1_Init(void)
{
/* 使能GPIOA和GPIOB时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
/* 使能ADC1时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* 配置PA10、PA14、PA15和PB9为模拟输入引脚 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 配置ADC1规则组转换模式 */
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 关闭连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// 关闭外部触发转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 4; // 4个通道
ADC_Init(ADC1, &ADC_InitStructure);
/* 配置ADC1规则组通道 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); // 通道0,采样时间239.5个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_239Cycles5); // 通道4,采样时间239.5个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_239Cycles5); // 通道5,采样时间239.5个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 4, ADC_SampleTime_239Cycles5); // 通道8,采样时间239.5个周期
/* 使能ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* 开始校准ADC1 */
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));
}
int main(void)
{
ADC1_Init();
while (1)
{
/* 读取ADC1规则组转换值 */
uint16_t adc_value[4];
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始转换
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
adc_value[0] = ADC_GetConversionValue(ADC1);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
adc_value[1] = ADC_GetConversionValue(ADC1);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
adc_value[2] = ADC_GetConversionValue(ADC1);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
adc_value[3] = ADC_GetConversionValue(ADC1);
/* 处理ADC1转换值 */
// TODO
/* 等待一段时间后进行下一次转换 */
for (volatile int i = 0; i < 100000; i++);
}
}
```
在此代码中,我们使用了规则组方式初始化了PA10、PA14、PA15和PB9对应的ADC1通道。其中,我们开启了扫描模式,并且关闭了连续转换模式和外部触发转换。我们将它们分别配置为ADC_Channel_0、ADC_Channel_4、ADC_Channel_5和ADC_Channel_8,并且设置了相同的采样时间。在主函数中,我们使用了ADC_SoftwareStartConvCmd函数开始转换,并且使用了ADC_GetConversionValue函数读取转换结果。最后,我们可以根据读取到的转换值进行相应的处理。
阅读全文