【STM32笔记】STM32的ADC开发基础(三)---中断模式

一. ADC中断配置(中断模式)

  打开STM32CubeMX,选择STM32103C8芯片,设置基本配置。注意设置时钟配置ADC时钟不要超过14MHz。
  这里只打开ADC1的IN1通道,设置为禁止间断模式,禁止扫描模式,禁止连续转换模式。使能ADC1全局中断。
在这里插入图片描述
在这里插入图片描述

二. HAL库中ADC中断模式的重要函数

开启ADC中断函数:HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);

/**
  * @简介  使能ADC,通过中断开启常规组的转换。
  * @参数   hadc: ADC实例指针
  * @返回值  HAL status
  */
  
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);

关闭ADC中断函数:HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);

/**
  * @简介  停止常规组(和注入组)的ADC转换,禁用中断,转换结束,禁用ADC外设。
  * @参数  hadc: ADC实例指针
  * @返回值空
  */
  
HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);

ADC转换完成中断回调函数:__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);

/**
  * @简介    非阻塞模式下的ADC转换完成回调函数
  * @参数    hadc: ADC实例指针
  * @返回值  空
  */

__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);

以上函数在stm32f1xx_hal_adc.c文件中:
在这里插入图片描述

三. 实现ADC中断转换

在main.c文件的main函数中的while下写入以下代码:

 /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_ADC_Start_IT(&hadc1);
	  HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

在main.c文件中的Private variables下的USER CODE BEGIN PV注释对中写入以下代码:

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
unsigned int adc_value = 0;
/* USER CODE END PV */

在main.c文件中的Private function prototypes下的USER CODE BEGIN PFP注释对中写入以下代码:

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
// ADC转换完成中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
	if(hadc == &hadc1){
		adc_value = HAL_ADC_GetValue(&hadc1);
	}
}
/* USER CODE END PFP */

编译下载到开发板上,通过下载器保持开发板与Keil5的连接,开启Keil5的调试会话在这里插入图片描述
在这里插入图片描述
选定adc_value,鼠标右击,选择Add ‘adc_value’ 展示子菜单,选择Watch1就可以在界面右下角看到Watch1的adc_value查看其值的变化。

在这里插入图片描述
多次点击上图的Step Over选项,发现adc_value中的值发生了变化为0x00000FC3(h) = 4035(十进制),根据计算公式4035*3.3/4096 = 3.25V,此时我的PA1引脚口所接的就是3.3V(有亿点点的误差~~~~),但是还是实现了ADC中断。

### STM32 ADC 中断配置教程 在 STM32开发过程中,ADC 中断是一种常见的需求,用于实时获取模拟信号并处理其数字化后的数值。以下是关于如何通过 STM32CubeMX 配置和实现 ADC 中断的方法以及常见问题的解决方案。 #### 1. 使用 STM32CubeMX 配置 ADC 中断STM32CubeMX 工具中可以轻松完成 ADC 中断基础设置: - 打开 **Pinout & Configuration** 页面,在外设列表中找到 `ADC` 并启用它。 - 进入 `Configuration` -> `Mode` 设置页面,选择工作模式为 `Interrupt`[^1]。 - 在 `NVIC Settings` 下勾选对应的 ADC 中断源以允许中断请求被处理器响应。 初始化完成后生成代码框架,其中会自动包含必要的函数声明与部分初始化逻辑。 #### 2. 编写中断服务程序 (ISR) ```c void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { // 当一次转换结束时执行此回调函数 uint16_t adcValue = HAL_ADC_GetValue(hadc); // 对采集到的数据进行进一步处理... } ``` 上述代码片段展示了当 ADC 转换结束后会被调用的一个典型回调函数实例[^2]。注意实际项目可能需要依据具体应用场景调整该部分内容。 #### 3. 启动 ADC 转换 启动 ADC 单次或者连续转换可以通过如下方式实现: ```c if(HAL_OK != HAL_ADC_Start_IT(&hadc1)){ Error_Handler(); } ``` 这里采用了 IT(即 Interrupt Triggered)版本的 API 来开启带有中断支持的操作流程。 --- ### 常见问题及其解决办法 #### A. 中断未正常触发 如果发现预期中的 ISR 没有被执行,则需检查以下几个方面: - 是否正确设置了 NVIC 中的相关位使能; - 确认 ADC 外设本身已被激活并且处于运行状态; - 查看是否有其他更高优先级的任务抢占了 CPU 时间片从而延迟甚至阻止当前任务进入 ISRs。 #### B. 数据不一致现象 有时可能会遇到两次读数之间存在较大偏差的情况,这可能是由于缺乏足够的等待时间让模数转换电路稳定下来所致。可以在每次发起新测量之前加入短暂停顿来缓解这个问题。 #### C. 性能瓶颈考量 对于高频采样的场景下,单纯依赖软件循环查询标志位的方式效率较低,推荐充分利用硬件资源比如 DMA 技术配合多缓冲机制共同作用提升整体吞吐量表现。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值