STM32 - ADC采集电压 中断处理

时间:2025-04-11 15:01:14
#include "msp_adc.h" __IO uint16_t ADC_ConvertedValue; //PCLK2=HCLK=72M /******************************************************************************* Function: Driver_Adc_GPIO_Init Description: adc采样端口初始化 Input: 无 Output: 无 Return: 无 *******************************************************************************/ void Driver_Adc_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(ADC_GPIO_CLK,ENABLE); GPIO_InitStructure.GPIO_Pin = ADC_PIN; //PA1 (Analog Input) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 必须为模拟输入 GPIO_Init(ADC_PORT, &GPIO_InitStructure); } /***************************************************************************** Function: Driver_ADC_Config Description: ADC模式配置,中断方式 Input: 无 Output: 无 Return: 无 *******************************************************************************/ void Driver_ADC_Config(void) { ADC_InitTypeDef ADC_InitStruct; RCC_APB2PeriphClockCmd ( ADC_CLK, ENABLE ); //打开ADC时钟 ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; // 只使用一个ADC,属于独立模式 ADC_InitStruct.ADC_ScanConvMode = DISABLE; //禁止扫描模式,多通道才要,单通道不需要 ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; //连续转换 ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不用外部触发转换,软件触发 ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; //对齐方式 ,不用外部触发转换 ADC_InitStruct.ADC_NbrOfChannel = 1; //只转换规则序列1 ADC_Init(ADC_x,&ADC_InitStruct); RCC_ADCCLKConfig(RCC_PCLK2_Div8); // 配置ADC时钟为PCLK2的8分频,即9MHz ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5); // 配置 ADC 通道转换顺序和采样时间 ADC_ITConfig(ADC_x, ADC_IT_EOC, ENABLE); // ADC 转换结束产生中断,在中断服务程序中读取转换值 } /******************************************************************************* Function: Driver_ADC_Cmd_ENABLE Description: 内部参考电压使能 Input: 无 Output: 无 Return: 无 *******************************************************************************/ void Driver_ADC_Cmd_ENABLE(void) { ADC_Cmd(ADC_x,ENABLE); } /******************************************************************************* Function: Driver_ADC_Cmd_DISABLE Description: 内部参考电压失能关闭 Input: 无 Output: 无 Return: 无 *******************************************************************************/ void Driver_ADC_Cmd_DISABLE(void) { ADC_Cmd(ADC_x,DISABLE); } /***************************************************************************** Function: Driver_ADC_Calibration Description: 进行ADC校准四个步骤,减小误差 Input: 无 Output: 无 Return: 无 *******************************************************************************/ void Driver_ADC_Calibration(void) { ADC_ResetCalibration(ADC_x); // 初始化ADC 校准寄存器 while(ADC_GetResetCalibrationStatus(ADC_x)); //等待复位校准完成 ADC_StartCalibration(ADC_x); // ADC开始校准 while(ADC_GetCalibrationStatus(ADC_x)); // 等待校准完成 ADC_SoftwareStartConvCmd(ADC_x, ENABLE); // 由于没有采用外部触发,所以使用软件触发ADC转换 } /***************************************************************************** Function: ADC_NVIC_Config Description: 进行ADC中断配置 Input: 无 Output: 无 Return: 无 *******************************************************************************/ static void ADC_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; // 优先级分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 配置中断优先级 NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /***************************************************************************** Function: ADC_IRQHandler Description: ADC中断 Input: 无 Output: 无 Return: 无 *******************************************************************************/ void ADC_IRQHandler(void) { if (ADC_GetITStatus(ADC_x,ADC_IT_EOC)==SET) { ADC_ConvertedValue = ADC_GetConversionValue(ADC_x); // 读取ADC的转换值 } ADC_ClearITPendingBit(ADC_x,ADC_IT_EOC); } ///***************************************************************************** //Function: Driver_ADC_Getconvertedvalue //Description: ADC转换数据获取 //Input: 无 //Output: 无 //Return: 无 //*******************************************************************************/ //float Driver_ADC_Getconvertedvalue(void) //{ // //float Vdd_Value = 3.3;//基准电压 // //float ADC_ConvertedValueLocal = 0; // // DMA_ClearITPendingBit(DMA1_IT_TC1); // while(!DMA_GetITStatus(DMA1_IT_TC1)); // DMA_ClearITPendingBit(DMA1_IT_TC1); // //ADC_ConvertedValueLocal = (float)ADC_ConvertedValue/4096*Vdd_Value; // return 0; //} /***************************************************************************** Function: ADCx_Init Description: ADC初始化 Input: 无 Output: 无 Return: 无 *******************************************************************************/ void ADCx_Init(void) { Driver_Adc_GPIO_Init(); Driver_ADC_Config(); Driver_ADC_Cmd_ENABLE(); Driver_ADC_Calibration(); ADC_NVIC_Config(); } /****************************************END*************************************/