HAL_ADC_ConvCpltCallback 和 HAL_ADC_ConvHalfCpltCallback 是 STM32 HAL 库中用于处理 ADC(模数转换器)转换完成事件的回调函数。它们分别在 ADC 转换完成和转换完成一半时被调用。以下是它们的详细说明:
1. HAL_ADC_ConvCpltCallback
功能:当 ADC 转换完全完成时,此回调函数会被调用。
使用场景:适用于需要处理完整转换数据的场景。例如,当 ADC 完成一组采样后,你可以在这个回调函数中读取转换结果并进行处理。
示例代码:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{// 读取 ADC 转换结果uint32_t adc_value = HAL_ADC_GetValue(hadc);// 处理转换结果// ...
}
2. HAL_ADC_ConvHalfCpltCallback
功能:当 ADC 转换完成一半时,此回调函数会被调用。
使用场景:适用于需要处理部分转换数据的场景。例如,在双缓冲模式下,当 ADC 完成一半的采样时,你可以在这个回调函数中读取并处理前半部分的数据。
示例代码:
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{// 读取前半部分 ADC 转换结果uint32_t adc_value = HAL_ADC_GetValue(hadc);// 处理前半部分转换结果// ...
}
3. 使用注意事项
启用中断:为了使用这些回调函数,你需要确保 ADC 的中断已经启用。通常,你需要在初始化 ADC 时配置中断。
双缓冲模式:在双缓冲模式下,HAL_ADC_ConvHalfCpltCallback 和 HAL_ADC_ConvCpltCallback 可以分别用于处理前半部分和后半部分的转换数据。
回调函数重写:这些回调函数是弱定义的,你需要在你的代码中重写它们以实现具体的功能。
4. 示例配置
以下是一个简单的 ADC 配置示例,展示了如何启用中断并使用这些回调函数:
ADC_HandleTypeDef hadc;void ADC_Init(void)
{// ADC 初始化配置hadc.Instance = ADC1;hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;hadc.Init.Resolution = ADC_RESOLUTION_12B;hadc.Init.ScanConvMode = DISABLE;hadc.Init.ContinuousConvMode = ENABLE;hadc.Init.DiscontinuousConvMode = DISABLE;hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc.Init.NbrOfConversion = 1;HAL_ADC_Init(&hadc);// 配置 ADC 通道ADC_ChannelConfTypeDef sConfig = {0};sConfig.Channel = ADC_CHANNEL_0;sConfig.Rank = 1;sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;HAL_ADC_ConfigChannel(&hadc, &sConfig);// 启用 ADC 中断HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);HAL_NVIC_EnableIRQ(ADC_IRQn);// 启动 ADC 转换HAL_ADC_Start_IT(&hadc);
}void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{uint32_t adc_value = HAL_ADC_GetValue(hadc);// 处理完整转换结果
}void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{uint32_t adc_value = HAL_ADC_GetValue(hadc);// 处理前半部分转换结果
}
通过这种方式,你可以灵活地处理 ADC 转换的不同阶段,并根据需要执行相应的操作。