hal adc中断
时间: 2025-04-01 17:05:08 浏览: 17
### STM32 HAL 库中 ADC 中断的实现
在 STM32 的 HAL (Hardware Abstraction Layer) 库中,ADC 中断功能通过初始化函数 `HAL_ADC_MspInit` 和回调函数 `HAL_ADC_ConvCpltCallback` 实现。以下是关于如何配置和使用这些功能的具体说明。
#### 配置 ADC 中断的过程
1. **GPIO 初始化**:
在 `HAL_ADC_MspInit` 函数中,需要设置用于 ADC 转换的 GPIO 引脚模式为模拟输入模式。这通常由以下代码片段完成:
```c
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(adcHandle->Instance==ADC1) {
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
__HAL_RCC_ADC1_CLK_ENABLE();
}
}
```
上述代码启用了 GPIOA 时钟并设置了 PA0 引脚为模拟输入模式[^2]。
2. **ADC 初始化结构体配置**:
使用 `ADC_HandleTypeDef` 结构体来定义 ADC 参数。例如:
```c
ADC_HandleTypeDef hadc1;
void MX_ADC1_Init(void) {
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
}
```
这里指定了 ADC 的分辨率、扫描模式以及连续转换模式等参数[^4]。
3. **启用中断**:
在 `MX_ADC1_Init` 函数之后调用 `HAL_NVIC_EnableIRQ` 来使能 ADC 中断请求。
```c
HAL_NVIC_SetPriority(ADC1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC1_IRQn);
```
此外,在启动 ADC 后需开启 IT 模式:
```c
HAL_ADC_Start_IT(&hadc1);
```
4. **处理中断回调**:
当 ADC 完成一次转换后会触发中断,并执行回调函数 `HAL_ADC_ConvCpltCallback`。该函数可以用来读取转换后的数据或者停止进一步的操作。
```c
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
static uint32_t iOrder = 0;
iOrder++;
uint8_t aTxBuffer[100] = { 0 };
sprintf((char*)aTxBuffer, "ADC Value %lu: %d\r\n", iOrder, HAL_ADC_GetValue(hadc));
HAL_UART_Transmit(&huart1, aTxBuffer, strlen((const char*)aTxBuffer), HAL_MAX_DELAY);
HAL_ADC_Stop_IT(hadc); // 关闭 ADC [^1]
}
```
#### 示例代码总结
完整的示例代码如下所示:
```c
#include "stm32f1xx_hal.h"
ADC_HandleTypeDef hadc1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
HAL_ADC_Start_IT(&hadc1); // 开始 ADC 并进入中断模式
while (1) {}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
static uint32_t iOrder = 0;
iOrder++;
uint8_t aTxBuffer[100] = { 0 };
sprintf((char*)aTxBuffer, "ADC Value %lu: %d\r\n", iOrder, HAL_ADC_GetValue(hadc));
HAL_UART_Transmit(&huart1, aTxBuffer, strlen((const char*)aTxBuffer), HAL_MAX_DELAY);
HAL_ADC_Stop_IT(hadc); // 停止 ADC
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(adcHandle->Instance == ADC1) {
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
__HAL_RCC_ADC1_CLK_ENABLE();
}
HAL_NVIC_SetPriority(ADC1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC1_IRQn);
}
```
上述代码展示了从硬件初始化到中断服务程序的整体流程。
---
###
阅读全文
相关推荐


















