
概述 直接存储器访问(DMA)用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何CPU操作的情况下通过DMA快速传输传输。这样节省的CPU资源可供其它操作使用。 DMA允许在后台执行数据传输,无需Cortex-MO处理器干预。在此操作过程中,主处理器可以执行其它任务,仅当整个数据块需要处理时,才会中断主处理器。这样即使传输大量数据也不会对系统性能造成太大影响。 DMA主要用于为不同的外设模块实现集中数据缓冲存储(通常在系统SRAM中)。与分布式解决方案(其中每个外设都需要实现自己的本地数据存储)相比,DMA解决方案在硅片成本和功耗方面的成本较低。 根据使用的产品型号的不同,有一个或两个DMA模块。 STM32F0XX DMA控制器总共有5个通道用于DMA1,每个通道都专门管理来自一个或多个外设的存储器访问请求。它具有一个仲裁器,用于处理不同的DMA请求的优先级。 本篇文章主要介绍如何使用STM32CubeMX实现ADC在DMA下快速采集,并且打印出去。 ![]() 首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板: ![]() 选择芯片型号 使用STM32CUBEMX选择芯片stm32f030r8,如下所示: ![]() 配置时钟源 HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示: ![]() 配置时钟树 STM32F0的最高主频到48M,所以配置48即可: ![]() 串口配置 本次实验使用的串口1进行串口通信,波特率配置为115200。 ![]() ADC配置 STM32f030中,有一个ADC(模拟/数字转换器),每个 ADC 有 12 位、 10 位、 8 位和 6 位可选,每个ADC有16个外部通道、2个内部通道和一个VBAT 通道的信号。 本文将开ADC的IN0、IN1、IN4一共三个通道,来分别读取ADC,由于串口2和IN2,IN3复用,故不使用IN2、IN3。配置如下: ![]() 开启DMA: ![]() 打开中断: ![]() 生成工程设置 注意在生产工程设置中不能出现中文,不然会报错。 ![]() 代码生成设置 最后设置生成独立的初始化文件: ![]() 生成代码 ![]() 配置keil ![]() ![]() 在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。
函数声明和串口重定向:
变量定义:
主循环:
演示效果 设定adc1口接3.3V,adc2口接GND,adc口接1.5V,输出如下。 ![]() 转载自:记帖 如有侵权请联系删除 |
经验分享 | STM32双定时器+ADC+DMA实战案例
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | 基于STM32片内信号的ADC应用演示
经验分享 | STM32F0 ADC结果挪位的问题分析及解决
经验分享 | 三个 ADC 同步模式配置以及 CubeMx 错误配置的解决方法
经验分享 | 为什么ADC结果出现断层?
经验分享 | STM32U5 ADC+DMA配置演示
经验分享 | STM32 ADC模拟看门狗应用演示
基于STM32使用ADC的多通道采样经验分享
基于STM32利用ADC+DMA采样显示经验分享