STM32ADC单通道转换

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转换完成中断标志位
}

posted @ 2024-03-01 21:48  T7H  阅读(87)  评论(0编辑  收藏  举报