hal库adc校准代码
时间: 2025-02-01 16:37:06 浏览: 76
### STM32 HAL 库中的 ADC 校准
在 STM32 的 HAL 库中,ADC 校准是一个重要的过程,用于提高 ADC 测量的准确性。为了执行校准操作,必须先禁用 ADC 并确保其处于锁定状态。
当准备进行校准时,HAL 库提供了 `__HAL_LOCK` 函数来防止其他任务干扰当前的操作[^2]:
```c
/* Process locked */
__HAL_LOCK(hadc);
```
在校准之前,需要确认 ADC 是否已禁用。如果 ADC 已经被禁用,则可以继续设置 ADC 状态并启动校准过程:
```c
if (ADC_IS_ENABLE(hadc) == RESET)
{
/* Set ADC state */
ADC_STATE_CLR_SET(hadc->State,
HAL_ADC_STATE_REG_BUSY,
HAL_ADC_STATE_BUSY_INTERNAL);
/* Start ADC calibration */
hadc->Instance->CR |= ADC_CR_ADCAL;
}
```
这段代码展示了如何通过修改控制寄存器 (`CR`) 来触发 ADC 自动校准命令。一旦设置了 `ADCAL` 位,硬件会自动完成内部校准流程。
下面是一段完整的示例代码,它包含了初始化、配置以及调用上述逻辑来进行 ADC 校准的过程:
```c
#include "stm32f4xx_hal.h"
void ADC_Calibration(ADC_HandleTypeDef* hadc)
{
/* Ensure that the ADC is not enabled before starting calibration */
if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_ADRDY))
__HAL_ADC_DISABLE(hadc);
/* Wait until the ADC is effectively disabled */
while(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_ADRDY));
/* Lock process to prevent other tasks from interfering with this operation */
__HAL_LOCK(hadc);
/* Check whether the ADC has been successfully locked */
if(HAL_OK != HAL_ADCEx_Lock(hadc)){
// Handle error here...
}
/* Perform actual calibration by setting CAL bit in CR register */
SET_BIT(hadc->Instance->CR, ADC_CR_ADCAL);
/* Unlock after finishing calibration */
__HAL_UNLOCK(hadc);
}
int main(void)
{
/* Initialize all configured peripherals & variables */
MX_GPIO_Init();
MX_ADC1_Init();
/* Calibrate ADC */
ADC_Calibration(&hadc1);
/* Infinite loop */
while (1){
// Application code goes here...
}
}
```
此函数首先检查 ADC 是否已经准备好接受新的指令,并对其进行必要的预处理工作;接着利用锁机制保护整个校准期间不受外界打扰;最后实际发起一次自检请求并通过清除先前的状态标志位结束该过程。
阅读全文
相关推荐


















