STM32 ADC转换完成回调函数详解 HAL_ADC_ConvCpltCallback与HAL_ADC_ConvHalfCpltCallback

发布于:2025-04-01 ⋅ 阅读:(23) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到