news 2026/6/15 12:14:18

Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Freertos手把手教STM32CubeMx设置STM32F4芯片DMA发送ADC数据(一)

本期目标

理清本工程系统框架

弄懂CubeMx配置相关原理及设置的背后含义

梳理代码设计流程

SAR型 ADC

单片机里的ADC,一般都是SAR型 ADC,是逐次逼近型ADC 吗这种类型的ADC精度一般都不是很高 ,但是成本都比较低

CubeMx配置

DMA设置

对DMA不熟悉的可以参考以下文章 , 详细讲解了DMA的具体设置、FIFO的作用及其具体操作

DMA初学者必看!帮小白从系统CPU层理解DMA原理-CSDN博客

小白也能看懂!从底层原理深入理解DMA控制器的内部架构图及其构成,加深对DMA的掌控-CSDN博客

打开中断

时钟设置

NVIC

ADC设置

串口设置

Freertos设置

代码部分

hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc1) != HAL_OK)

PCLK2 divided by 4

ADC也需要动力 , 时钟就是他的动力, 对PCLK2 , 进行四分频

Rigiht alignment

右对齐

Scan Conversion Mode

Scan Conversion Mode 是控制:ADC 是否按照配置的通道序列,对多个通道进行依次转换。(我们本次就一个通道,所以未开启)

  • 如果是 Enable,ADC 将按照在规则通道(Regular Channels)中配置的通道序列,依次对多个通道进行转换。 每次触发(无论是软件触发还是硬件触发),ADC都会按照顺序对所有配置的通道进行一次完整的转换序列。适用于需要同时采集多个模拟信号的情况,例如多传感器数据采集、数据监测等。

    • 如果同时启用了 Continuous Conversion Mode(连续转换模式), ADC 会在完成一次完整的通道序列转换后,立即开始下一次序列的转换,形成一个连续的循环。如果没有启用 Continuous ConversionMode(连续转换模式),ADC在完成一次通道序列转换后停止,等待下一个触发事件。

    • 如果同时启用了 Discontinuous Conversion Mode(非连续转换模式),会将通道序列分成若干组,每次触发事件只转换一组通道,

  • 如果是 Disable,ADC 仅对配置的一个通道进行转换,没有通道序列的概念。每次触发只转换一个通道,简单高效。适用于只需要采集一个模拟信号的简单应用,例如单一传感器的读取。

Continuous Conversion Mode(连续转换模式)是控制:是否持续的对某一个通道不停地转换,你会在 DR 里面一直看到数据更新,EOC 标志位一直会产生。于是你可以通过轮询或者中断的方式一直来取 ADC 的数据。

Discontinuous Conversion Mode(非连续转换模式)是控制:是否 ADC 将进入 非连续转换模式

(Discontinuous Conversion Mode).

  • 在非连续转换模式下(Enable),ADC 会将配置的通道序列分成若干个小组,每个小组的大小由Discontinuous Number(非连续数目)参数确定,范围是1到8。(应确保 Scan Conversion Mode 也是Enable 的)

    • ADC会在每个触发事件(比如软件或硬件触发)下,仅转换一个小组的通道,然后停止,等待下一个触发事件。每次非连续转换都需要新的触发事件,这种模式适用于需要在多个触发事件下分批次采样的情况。

      • 例如,在实时控制系统中,可能希望在每个控制周期内只采样部分通道(而不是 全部通道),以减少 CPU 负担。比如说,如果你配置了6个通道的序列,且将 Discontinuous Number 设置为 2,那么 ADC 会将这 6个通道分成3组,每组 2个通道。每次触发事件会启动一组(2 个通道)的转换需要 3 次触发事件才能完成所有通道的转换。

sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

ADC_SAMPLETIME_3CYCLES

将逐次逼近设置成大概3个周期之后就将值给计算出来 ,这个值越大越准确 , 有时候ADC数据出问题 , 就是这里设置的太快了

1.申请buffer

freertos.c

定义

/* USER CODE BEGIN Includes */ #include <stdlib.h> /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ #define BUFFER_SIZE 1 uint32_t * buffer1 = NULL; uint32_t * buffer2 = NULL; /* USER CODE END PTD */

task

/* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void *argument) { /* USER CODE BEGIN StartDefaultTask */ buffer1 = (uint32_t *)malloc((sizeof(uint32_t)* BUFFER_SIZE)); buffer2 = (uint32_t *)malloc((sizeof(uint32_t)* BUFFER_SIZE)); if(NULL == buffer1) { printf("buffer1 malloc failed \r\n"); } if(NULL == buffer2) { printf("buffer2 malloc failed \r\n"); return; } printf("buffer1 , buffer2 malloc success\r\n "); memset(buffer1, 0xff , (sizeof(uint32_t)* BUFFER_SIZE)); memset(buffer2, 0xff , (sizeof(uint32_t)* BUFFER_SIZE)); /* Infinite loop */ for(;;) { printf("hello world \r\n"); osDelay(1000); } /* USER CODE END StartDefaultTask */ }

至此

本期将前置设置配好了 , 并且成功分配了buffer数据 ,打印至串口

下一步我们将启动DMA传输并且进入中断

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 4:41:55

23、Linux文本处理工具全解析

Linux文本处理工具全解析 在Linux系统中,文本处理是一项非常重要的工作。无论是日常的系统管理,还是软件开发过程中的代码处理,都离不开各种文本处理工具。本文将详细介绍一些常用的Linux文本处理工具及其使用方法。 排序与去重 在处理文本文件时,排序和去重是常见的操作…

作者头像 李华
网站建设 2026/6/15 10:28:03

YouTube开放稳定币收款,加密货币支付正在全球普及?

2025年底&#xff0c;一则看似简单的支付功能更新&#xff0c;却引起了全球科技与金融圈的热烈讨论。全球最大的影音平台YouTube宣布&#xff0c;将允许美国地区的内容创作者选择使用PayPal发行的美元稳定币PYUSD来领取他们的收益。这不仅仅是为创作者提供一个新的收款选项&…

作者头像 李华
网站建设 2026/6/15 13:15:04

显卡卸载工具DDU

链接&#xff1a;https://pan.quark.cn/s/b675ab53fa00显卡卸载工具DDU是款可用于显卡驱动卸载的程序工具&#xff0c;这个驱动卸载工具支持卸载NVIDIA, AMD, Intel品牌的显卡驱动&#xff0c;也就是说绝大部分电脑都可以使用它彻底卸载显卡驱动。功能特点可用于显卡驱动程序的…

作者头像 李华
网站建设 2026/6/15 11:20:33

直播工具OBS Studio

链接&#xff1a;https://pan.quark.cn/s/b675ab53fa00OBS Studio是一款非常知名&#xff0c;使用用户庞大的一款OBS直播软件&#xff0c;是专为视频直播开发的一款直播软件&#xff0c;与经典版相比&#xff0c;它在这个基础上进行了升级改进&#xff0c;音频分路简单&#xf…

作者头像 李华
网站建设 2026/6/15 12:22:01

针对原网格的流场单变量进行本征正交分解pod程序 输出模态tecplot文件,特征值,时间系数等参数

针对原网格的流场单变量进行本征正交分解pod程序 输出模态tecplot文件&#xff0c;特征值&#xff0c;时间系数等参数&#xff0c;输出重构流场tecplot文件 包含视频教程和实例数据以及程序代码最近在搞流场分析的朋友应该都听说过POD这玩意儿。这玩意说白了就是把复杂流动数据…

作者头像 李华
网站建设 2026/6/15 11:30:34

如何在 Vim 启用行号显示和语法高亮功能

文章目录 检查是否支持语法高亮命令方式启用行号显示和语法高亮功能&#xff08;仅对当次有效&#xff09;配置模式启用行号显示和语法高亮功能&#xff08;永久有效&#xff09;总结开启行号显示关闭行号显示开启语法高亮关闭语法高亮 Vim 是 Linux 平台上优秀的文本编辑器的开…

作者头像 李华