[其他ST产品] STM32CubeMX配置ADC采样(轮询、中断、DMA)

[复制链接]
2873|76
 楼主| 工程师犹饿死 发表于 2023-4-18 22:48 | 显示全部楼层 |阅读模式
STM32CubeMX能够极大减小STM32外设配置的工作量,因此作者也借助空闲时间对STM32CubeMX相关配置进行了学习,本文介绍如何利用STM32CubeMX配置ADC采样,记录了作者学习过程中遇到的问题及解决办法,使大家少走弯路,并方便以后复习.

1、单通道轮询 71968643eadac507c5.png


 楼主| 工程师犹饿死 发表于 2023-4-18 22:48 | 显示全部楼层
先选择所使用的MCU,这里我使用的是STM32F407ZGT系列
62266643eadc6e02d2.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:49 | 显示全部楼层
修改一下DEBUG功能,否则后续无法调试
65569643eadda971a4.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:50 | 显示全部楼层
修改时钟,采用外部晶振
29672643eae20171e1.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:52 | 显示全部楼层
配置一串口,用于打印采集的ADC值
54475643eaeb809ad3.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:53 | 显示全部楼层
这里我采用ADC1的通道0,并开启连续采样模式,否则每次开启ADC采样后只进行一次采样
86651643eaec6f183d.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:53 | 显示全部楼层
开启ADC全局中断(如果只采用轮询采样就不用开启,这里开启是为了方便后面演示中断采样)
74291643eaed89b4b5.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:53 | 显示全部楼层
修改一下ADC全局中断的优先级
34774643eaee8ccdca.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:53 | 显示全部楼层
在HCLK处输入其时钟最高频率168,按回车,其余时钟会自动配置好,一般情况下无需改动
41863643eaf0561cb2.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:54 | 显示全部楼层
 楼主| 工程师犹饿死 发表于 2023-4-18 22:54 | 显示全部楼层
勾选上后,每个外设会单独保存至一个.c文件,便于查看
22596643eaf2a30f46.png
48592643eaf31589b2.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:55 | 显示全部楼层
生成并打开文件

13982643eaf4778f8f.png


 楼主| 工程师犹饿死 发表于 2023-4-18 22:55 | 显示全部楼层
在main.h中包含头文件stdio.h
91281643eaf5c93991.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:55 | 显示全部楼层
在usart.c文件中加入fputc函数,加入后才能使用printf函数进行打印数据
68906643eaf6962f7d.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:55 | 显示全部楼层
在while循环中添加以上代码,由于开启了连续转换模式,即hadc1.Init.ContinuousConvMode = ENABLE;因此每次转换完成后都要调用HAL_ADC_Stop来关闭ADC;如果不想每次都调用该函数来关闭ADC,可以关闭连续转换模式,即hadc1.Init.ContinuousConvMode = DISABLE,这样每次开启ADC转换以后只会进行一次采样,这样就不需要每次都关闭ADC了
 楼主| 工程师犹饿死 发表于 2023-4-18 22:56 | 显示全部楼层
实验现象如下图:
77465643eaf8866341.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:56 | 显示全部楼层
2、单通道中断

单通道中断采样配置过程与单通道轮询采样相同,利用cubemx配置完成后有两种开始ADC采样的方法
方法一:
94962643eaf990e645.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:56 | 显示全部楼层
在主函数中加入上述代码,__HAL_ADC_ENABLE_IT(&hadc1,ADC_IT_EOC);用于打开ADC转换完成中断,HAL_ADC_Start(&hadc1);用于开启ADC采样,这两个函数一定要放到外设初始化函数的后面,否则串口函数初始化未完成,在ADC中断中使用printf函数可能会卡死

54694643eafb2d9789.png
 楼主| 工程师犹饿死 发表于 2023-4-18 22:57 | 显示全部楼层
在主函数中加入上述代码,__HAL_ADC_ENABLE_IT(&hadc1,ADC_IT_EOC);用于打开ADC转换完成中断,HAL_ADC_Start(&hadc1);用于开启ADC采样,这两个函数一定要放到外设初始化函数的后面,否则串口函数初始化未完成,在ADC中断中使用printf函数可能会卡死


 楼主| 工程师犹饿死 发表于 2023-4-18 22:57 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

967

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部