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 转换的不同阶段,并根据需要执行相应的操作。