news 2026/3/27 11:49:15

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/3/26 21:15:16

24、Linux 文本处理实用工具全解析

Linux 文本处理实用工具全解析 在 Linux 系统中,文本处理是一项非常重要的任务,有许多实用工具可以帮助我们完成各种文本编辑和处理工作。本文将介绍几个常用的文本处理工具,包括 tr 、 sed 和 aspell ,并详细讲解它们的功能和用法。 即时编辑文本 我们使用文本编…

作者头像 李华
网站建设 2026/3/26 18:15:23

提示工程与上下文学习:思维链、自洽性与指令微调实战

点击 “AladdinEdu&#xff0c;你的AI学习实践工作坊”&#xff0c;注册即送-H卡级别算力&#xff0c;沉浸式云原生集成开发环境&#xff0c;80G大显存多卡并行&#xff0c;按量弹性计费&#xff0c;教育用户更享超低价。 引言&#xff1a;从“编程”模型到“对话”模型——交互…

作者头像 李华
网站建设 2026/3/20 5:09:58

中国免费API都在这里:一键调用,零成本入门

欢迎来到小灰灰的博客空间&#xff01;Weclome you&#xff01; 博客主页&#xff1a;IT小灰灰 爱发电&#xff1a;小灰灰的爱发电 热爱领域&#xff1a;前端&#xff08;HTML&#xff09;、后端&#xff08;PHP&#xff09;、人工智能、云服务 目录 一、平台介绍 1.1 核心优势…

作者头像 李华
网站建设 2026/3/27 5:02:23

通信工程毕业论文(毕设)加分开题分享

【单片机毕业设计项目分享系列】 &#x1f525; 这里是DD学长&#xff0c;单片机毕业设计及享100例系列的第一篇&#xff0c;目的是分享高质量的毕设作品给大家。 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的单片机项目缺少创新和亮点…

作者头像 李华
网站建设 2026/3/26 6:48:58

市场营销书单:营销人必看的10本书

十本经典市场营销必读书籍从不同的角度去看营销——战略、品牌、传播、价格、消费者心理、销售管理……每一本都能让你收获新的知识、新的见解&#xff0c;特此送给同样在市场一线打拼的你。1. 《经理人参阅&#xff1a;市场营销》营销的本质&#xff0c;从不是卖产品&#xff…

作者头像 李华