STM32H743+CubeMX-ADC+DMA采样四路AD

本文档详细介绍了如何使用STM32H743和CubeMX配置ADC和DMA进行模拟量采样。内容涵盖时钟配置、MPU设置、ADC通道配置、DMA设置和GPIO接线。通过设置,实现ADC3对四个通道的采样,并通过DMA将数据存储到特定内存区域,CPU在需要时通过缓存获取数据。硬件连接包括3.3V、GND和外部模拟量输入。调试过程中发现,为确保ADC校准准确性,建议在初始化时添加延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


相关笔记:
STM32H743+CubeMX-梳理MPU的设置
STM32H743-梳理ADC模数转换器在CubeMX上的配置

一、前言

在实际项目上,ADC采样必须与DMA组合使用,实现并行采样。这里的“并行采样”并不是多个通道同时采样,而是ADC控制器一边采样,CPU一边干其他非常重要的活。当CPU在需要ADC采样的数据时,通过cache获取内存里模拟量的值即可。这个笔记实现ADC3+DMA采样四路模拟量,其中三路从CPU外部获取,另外一路从CPU内部获取(CPU的温度)。
系统框图如下(从右到左):

  1. ADC3采样各个通道的模拟量,每当采样完成时,让DMA将采样的数据存放到内存RAM_D3里(声明一个全局数组ADC3_Data[4])。
  2. DMA将RANK1(CH5)的值搬运到ADC_Data[0],将RANK2(CH9)的值搬运到ADC_Data[1],RANK3(CH16)的值搬运到ADC_Data[2],RANK4(CPU Temp)的值搬运到ADC_Data[3]。
  3. 每隔300ms,CPU通过cache获取全局变量ADC_Data[0] ~ ADC_Data[3]一共4个模拟量。
    在这里插入图片描述

二、CubeMX

2.1、Clock Configuration

ADC的时钟源设置72M,这个时钟模板最多人使用。
在这里插入图片描述

2.2、CORTEX_M7(cache与MPU)

这一次ADC+DMA模拟量采样使用的是RAM_D3内存(AHB SRAM(D3域) ),即MPU管理的第二块内存。MPU管理的第一块内存AXI SRAM不配置也没关系,这个配置是前面研究MPU时所留下来的配置。
在这里插入图片描述

2.3、ADC3 Mode and Configuration

使能4个通道。
在这里插入图片描述

2.4、Parameter Settings

各个参数的说明,参考笔记:STM32H743+CubeMX-梳理MPU的设置
在这里插入图片描述

2.5、DMA Settings

经过测试,Data Width使用Word也可以。Data Width改用Word的话,代码里的变量大小,HAL库参数也要跟着改动。
在这里插入图片描述

2.6、GPIO settings

在这里插入图片描述

三、STM32H743IITX_FLASH.ld

将全局数组ADC_Data[4]定义到内存RAM_D3域。参考笔记:STM32H743+CubeMX-将变量定义到指定的内存
首先确认芯片的内存架构,找到所需的内存名字。
在这里插入图片描述
用户定义一段内存_D3_Area。芯片的SRAM需要定义一个名字后才能使用,我尝试过跳开这一个步骤,结果失败了。
在这里插入图片描述

四、代码

4.1、adc.c

全局数组ADC3_Date[4]放在内存RAM_D3,全局变量adc_f[4]放在默认的DTCM内存。
在这里插入图片描述
在函数void MX_ADC3_Init(void)的用户代码段编写代码,使用HAL库校准ADC。
在这里插入图片描述
在文件最下方,编写函数,用户将模拟量的值转换成电压值与温度值。
在这里插入图片描述

4.2、main.c

声明外部变量。
在这里插入图片描述
启动ADC+DMA采样。
在这里插入图片描述

4.3、freertos.c

在freertos的一个任务里调用刚才编写的转换函数。这个任务很简单,每隔300ms获取一次模拟量的值。
在这里插入图片描述

五、硬件接线

  • PH5直接连接到板子的3.3V。
  • PF4直接连接到板子的GND(0V)。
  • PF3连接到安富莱设计的H7-TOOL的模拟量输出通道上。(我让它输出约2.4V)
    在这里插入图片描述

六、DEBUG

将刚才的两个全局变量添加到STM32CubeIDE的现场表达式上,实时观察变量的值。

  • adc_f[0]采样的是PF3的值,非常接近H7-TOOL输出的2.41V。采样到的数值与实际的值不完全相等,因为模拟量采样都是有误差的。
  • adc_f[1]采样的是PF4的值,这个通道直接连接到板子的GND,所以非常接近0V。
  • adc_f[2]采样的是PH5的值,这个通道直接连接到板子的3.3V,所以非常接近3.3V。
  • adc_f[3]采样的是内部CPU的温度,经过官方提供的公式,转换后得到约45℃。
    在这里插入图片描述

七、细节补充

7.1、在HAL_ADCEx_Calibration_Start()之前添加HAL_Delay

有一些网友说,在某些板子上电时,电容正在充电,最好在HAL_ADCEx_Calibration_Start()之前延时一会会,等待电容充满电,板子的3.3V电源网络稳定后再执行HAL_ADCEx_Calibration_Start()。
在这里插入图片描述

### STM32F103C8T6 使用 STM32CubeMX 配置 ADC 采样并启用 DMA 传输 #### 准备工作 为了实现通过DMA进行ADC采样的配置,首先需要准备必要的硬件和软件环境。确保已经安装了STM32CubeMX工具,并下载了适用于目标芯片(STM32F103C8T6)的支持包。 #### 创建项目 启动STM32CubeMX,在新项目的向导中选择合适的MCU型号——即STM32F103C8T6。完成基本设置后进入主界面开始具体外设的配置过程。 #### 配置ADC模块 在Pinout & Configuration标签页下找到Analog to Digital Converters (ADC),点击右侧的小齿轮图标展开更多选项: - **Mode**: 设置为`Independent`模式; - **Clock Prescaler**: 可选,默认即可满足大多数应用场景需求; - **Resolution**: 根据实际精度要求调整分辨率位数; - **Data Alignment**: 数据对齐方式通常保持默认值Right Align; - 启用所需的通道,比如对于GPIOA_PIN0作为输入,则勾选`IN0`;如果还需要其他引脚参与转换操作同样处理[^2]。 #### 开启DMA支持 继续在同一页面向下滚动至Direct Memory Access Controller部分: - 添加至少一条DMA流给选定的ADC实例用于读取转换后的数值; - 对应的数据缓冲区大小依据应用场合设定合理长度; - 确认触发条件被正确指定为由ADC事件驱动而非软件请求发起传输动作[^4]。 #### 波特率及其他参数 虽然本案例主要关注的是ADCDMA之间的交互,但如果涉及到后续将采集到的信息经由串行接口输出显示的话,记得也要适当调节USART/UART组件的相关属性,特别是波特率等通讯速率匹配项[^3]。 #### 生成代码框架 当所有必要外围设备都已妥善安排完毕之后,切换回Project Manager视图,填写好工程名称路径等基本信息,最后按下GENERATE CODE按钮自动生成初始化源文件集合供进一步开发使用。 ```c // 示例:初始化完成后可以在main.c中的while循环内调用如下函数来获取最新一次完整的AD转换结果数组 uint16_t adcValue; HAL_ADC_Start_DMA(&hadc, (uint32_t*)&adcValue, 1); ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wallace Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值