【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中断。
作者:Macy~