STM32ADC单通道转换
1. 初始化
ADC功能初始化主要分三部分,GPIO初始化、ADC模式初始化与NVIC初始化。
1.1初始化GPIO
void ADC_GPIO_Config(void) // 配置ADC通道引脚
{
GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); // 使能GPIOC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 选择ADC通道引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 设置引脚模式为模拟输入
GPIO_Init(GPIOC,&GPIO_InitStructure); // 初始化引脚
}
1.2 初始化ADC模式
void ADC_MODE_Config(void)
{
ADC_InitTypeDef ADC_InitStructure; // 定义ADC结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE); // 使能ADC2时钟
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 设置ADC工作模式为独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 设置ADC扫描模式为单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 设置ADC连续转换模式为开启
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 设置ADC外部触发模式为无
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 设置ADC数据对齐模式为右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; // 设置ADC通道数为1
ADC_Init(ADC2,&ADC_InitStructure); // 初始化ADC2
RCC_ADCCLKConfig(RCC_PCLK2_Div8); // 设置ADC时钟为PCLK2的8分频
ADC_RegularChannelConfig(ADC2,ADC_Channel_11,1,ADC_SampleTime_55Cycles5); // 设置ADC通道为11,采样时间为55.5周期
ADC_ITConfig(ADC2,ADC_IT_EOC,ENABLE); // 使能ADC2中断
ADC_Cmd(ADC2,ENABLE); // 使能ADC2
ADC_ResetCalibration(ADC2); // 重置ADC2校准寄存器
while(ADC_GetResetCalibrationStatus(ADC2)); // 等待ADC2校准寄存器重置完成
ADC_StartCalibration(ADC2); // 启动ADC2校准
while(ADC_GetCalibrationStatus(ADC2)); // 等待ADC2校准完成
ADC_SoftwareStartConvCmd(ADC2,ENABLE); // 启动ADC2软件转换
}
1.3 初始化NVIC
void ADC_NVIC_Config(void) // ADC2中断优先级配置
{
NVIC_InitTypeDef NVIC_InitStructure; // 定义NVIC_InitTypeDef结构体变量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 设置NVIC中断分组1
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; // 设置中断通道为ADC1_2_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 设置中断优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 设置中断子优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStructure); // 初始化NVIC_InitTypeDef结构体变量
}
2.中断函数编写
中断函数命名为ADC1_2_IRQHandler即可,换ADC通道的话名字也要换。
void ADC1_2_IRQHandler(void) // ADC2中断服务函数
{
if(ADC_GetITStatus(ADC2,ADC_IT_EOC) == SET) // 判断是否为ADC2转换完成中断
{
ADC_Converted = ADC_GetConversionValue(ADC2); // 读取ADC2转换结果
}
ADC_ClearITPendingBit(ADC2,ADC_IT_EOC); // 清除ADC2转换完成中断标志位
}