我的使用环境:

硬件:STM32F767ZGT6、串口1、ADC1、16MHz晶振、216MHz主频

软件:STM32 CUBE IDE

优点:不用定时触发采样,ADC数据是不停的实时更新,ADC数据的更新频率根据采样时钟和采样周期决定,后期只需要定时取用数据即可。

串口1用 printf 的打印ADC采集到的数据。或者用仿真查看数据变化也行。

一、基础知识

ADC的时钟是APB2,与时钟树的配置有关,同时规格书中ADC的时钟最大频率又跟电源电压有关,3.3V下最大时钟频率为36MHz。所以预分频后的频率肯定是在这个规定最大时钟频率之内的。

二、STM32Cube IDE 具体配置

串口配置:使能后更改合适波特率。

ADC和DMA 配置

  1. 预分频之后的时钟应该是在ADC时钟范围之内的,用APB2频率除以分频数。
  2. DMA要开启扫描模式、连续转换模式、DMA连续请求
  3. 每个ADC通道的采样时间一定要高于分辨率要求的采样时钟周期,否则会导致初始化失败或者数据没有更新。

4、配置详细解释:

长的采样时间可以减少 ADC 读数的噪声,从而提高精度。在更长的采样时间内,模拟信号的值可以平稳地积累,使得读数更加准确。虽然长的采样时间可以提高 ADC 的精度,但是会影响采样频率。因此,在不同的应用场景中,需要选择合适的采样时间,以达到较高的精度和采样频率的平衡。

5、ADC Injected Conversion Mode

它允许在特定序列中执行多次ADC转换,每次转换有单独的触发。注入转换通常用于高级任务,例如过采样或偏移校正,并且在ADC的触发输入或软件命令触发的常规转换之外执行。
        在注入转换模式下,ADC执行一系列转换,每次转换由单独的触发输入触发。注入转换的ADC结果寄存器与常规转换的结果寄存器分开,结束转换中断可以为每种类型的转换单独生成。这允许CPU监视ADC的状态,并确定注入转换何时完成。
        是否使用注入转换模式取决于ADC应用程序的具体要求,在使用注入转换模式之前了解注入转换模式的功能和限制是非常重要的。

三、验证程序

生成程序后,main.c中开始,使用下面的函数打开DMA传输,每当ADC完成一次数据采样,DMA就会将ADC数据更新至 *pData指定的数组。在任意时刻取用数组中的数据即可。

HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)

串口用 printf 打印:

主体部分:

四、测试结果

main.c 代码如下:

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;UART_HandleTypeDef huart1;/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);return ch;
}
#endifuint16_t ADC_Value_buffer[2];
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_ADC1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf("**************************\r\n");HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value_buffer, 2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("ADC_Value_buffer: %d %d\r\n", ADC_Value_buffer[0], ADC_Value_buffer[1]);HAL_Delay(500);}/* USER CODE END 3 */
}

测试结果如下:

五、注意事项

问题:当涉及到很多外设的时候,用以上配置发现指定数组的数据数据,没有变化更新。

解决方法:修改函数生成的顺序,保证DMA初始化函数在ADC初始化函数(或你需要传输的外设数据)之前。同理,用DMA传输串口或者DAC也没有数据变化的时候也可能是这种情况。选中功能项,选表格右上角的调节按钮可以调节顺序,如果遇到ADC函数在第一个同时在DMA上方不能调节的情况,在Pinout&Configuration 配置页面去掉ADC选项生成一次代码,按开始步骤再配置一次ADC,然后再生成一次代码,ADC初始化函数就在最底下了。

底层代码逻辑:ADC初始化函数中有一个硬件层面的Msp初始化函数,这个函数定义了ADC的硬件层,同时将ADC和DMA传输用__HAL_LINKDMA 函数连接到一起 。

如果先初始化 ADC,再初始化 DMA,可能会导致 ADC 采样的数据无法正确地传输到内存。这是因为,在初始化 ADC 之前,DMA 无法确定将要采样的数据存储在哪个内存地址。因此,在 DMA 初始化期间,必须指定数据存储地址,以便 DMA 正确地传输数据。

因此,为了避免这种情况,在初始化 ADC 之前,必须先初始化 DMA。在 DMA 初始化过程中,将会指定数据存储地址,这样,当 ADC 开始采样时,DMA 就可以正确地传输数据。

另外,还需要在 DMA 和 ADC 之间建立正确的链接,使得 DMA 可以监视 ADC 的数据采样并自动进行传输。这通常可以通过使用 __HAL_LINKDMA 宏函数实现。

正确的顺序是:先初始化 DMA,指定数据存储地址,然后链接 DMA 和 ADC,最后初始化 ADC。这样可以保证 ADC 采样的数据能够正确地传输到内存。

HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc)
{HAL_ADC_MspInit(hadc);
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{__HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);
}

使用STM32 CUBE IDE配置STM32F7 用DMA传输多通道ADC数据相关推荐

  1. 基于STM32F103C8T6的高速DMA传输多通道ADC数据

    文章目录 前言 一.软件设计思路 二.代码 总结 前言 ADC在STM32系列单片机的使用中占用着很大的比例,常见的案例是通过ADC单次转换电压值,这种方式的缺陷在于转换效率不高.一般的单片机带有AD ...

  2. STM32 Cube IDE HAL库驱动 W25Q128 进行读、写、擦除操作

    一.W25Q128相关理论 W25Q128存储大小为128M-bit=16MB,可编程位(地址)为Flash_Size=16*1024*1024=16777216 B. W25Q128包含256个块. ...

  3. STM32F4基于DMA的多通道ADC采集——遇到的问题解决

    这几天在尝试用DMA实现规则通道多通道的ADC采集,遇到了不少问题,在这记录一下我遇到的问题,一方面理顺一下思路,也希望后人少走弯路. 一开始按照开发板资料中的程序源码编写,但无论如何配置,也无法实现 ...

  4. 立创梁山派GD32F450ZGT6--使用DMA实现多通道ADC采集

    这次调试有些久,缺乏的知识很多,最重要的是ADC的引脚配置为浮空之后,如果没有接入东西,其读取的ADC值是不确定的,所以在测试的时候,一定要把对应的电压接入ADC引脚,测量的值才是准确的. 上代码. ...

  5. STM32F407 DMA采集多通道ADC

    STM32F407和STM32F103在HAL库使用的时候有较大的差别,同时407取消掉了ADC校准,在使用DMA进行多通道采集时需要打开DMA连续请求:hadc1.Init.DMAContinuou ...

  6. STM32开发项目:借助DMA传输高效的使用ADC

    目录 项目背景 DMA简介 DMA请求 DMA通道 DMA仲裁 DMA配置 从哪里来到哪里去 要传多少,单位是什么 什么时候传输完成 代码示例 配置GPIO 相关变量定义 配置ADC 配置DMA 获取 ...

  7. stm32.cube介绍

    stm32.cube(一)--系统架构及目录结构 stm32.cube(二)--HAL结构及初始化 stm32.cube(三)--HAL.GPIO stm32.cube(四)--HAL.ADC stm ...

  8. STM32 Cube MX学习笔记——TOF 高速单线激光雷达 L10(usart)

    STM32 Cube MX学习笔记--TOF 高速单线激光雷达 L10_串口中断通信 1. TOF 高速单线激光雷达 L10 2. STM32 Cube MX配置 3.代码配置 4.编译 烧录 显示 ...

  9. stm32cubeide烧写程序_STM32 Cube IDE 下实现 IAP —— (1) 程序跳转

    ST 推出自家的IDE:STM32 CubeIDE 有一段时间了,现在正好有新的项目了,尝试直接把它用起来了,不用再来回去切换 CubeMX 和其他 IDE 了. 目前的项目是要做一个 IAP 的框架 ...

最新文章

  1. 部署vs 2008 Report View
  2. RegionServer宕机的原因
  3. xp sp3安装.Net 4.0提示严重错误,0x80070643,解决办法2017版
  4. 东京见闻:快速走红日本市场 阿里云的三大秘密
  5. 杭电1280java实现
  6. SeqGAN——对抗思想与增强学习的碰撞
  7. [Python图像处理] 二十五.图像特效处理之素描、怀旧、光照、流年以及滤镜特效
  8. UE4 使用VaRest的最佳实践
  9. Http benchmarking 工具 wrk 基本使用
  10. cmd小游戏_使用pygame制作Flappy bird小游戏
  11. [SPOJ - FTOUR2] Free tour II(点分治 + 背包dp + 启发式合并)
  12. Linux管道和重定向 ---多命令协作
  13. python+OpenCV图像处理(五)图像的阈值分割
  14. rl滤波器原理_滤波器基本原理.ppt
  15. 我开源的软件只能我拿来赚钱
  16. bzoj 1689: [Usaco2005 Open] Muddy roads 泥泞的路(模拟)
  17. python一切皆对象的理解_Python难点解析---初级篇2.一切皆对象
  18. 微信小程序--微信扫一扫登录pc页面功能的实现
  19. 浪潮服务器安装ESXI6.7 无raid驱动解决方案
  20. Java 面试真题 【继承静态代码块执行时机】

热门文章

  1. 如何用python爬视频_科学网—利用python爬取一个小视频 - 李鸿斌的博文
  2. 海思Hi3798MV310芯片处理器参数介绍
  3. 腾讯会议腾讯课堂考勤工具
  4. 计算机软考软件设计师2019试题,最新2018年上半年软件设计师真题+答案解析上午选择+下午案例完整版(全国计算机软考)...
  5. JS指定打印机进行打印
  6. wordpress+HTML5游戏,轻松在wordpress上植入一个网页游戏
  7. 情感驿站 | 大学生应该明白的事情
  8. CodeGear开发者日投影片和Delphi 2007 For Win32范例录像
  9. Tomcat、Servlet
  10. 关于csdn写的博文未显示,待审核状态