【STM32】ADC模拟数字转换(规则组多通道)+ DMA数据转运(外设到存储器)

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发

目录

前言

ADC规则组扫描模式+DMA

定义变量

规则组配置 

ADC初始化 

连续模式

 扫描模式

规则组通道个数 

 ADC初始化框架

 DMA初始化

ADC和DMA使能 

 软件触发转运

 代码框架

ADC扫描转换与DMA循环转运

单次扫描+单轮转运


前言

本篇博客会在下面两篇的代码及理解的基础上修改。阅读本篇之前建议先阅读以下两篇博客: 

 【STM32】ADC模拟数字转换-规则组单通道-CSDN博客

【STM32】DMA数据转运(存储器到存储器)-CSDN博客

ADC规则组扫描模式+DMA

  之前学习了ADC规则组单通道,这种方式只能一次触发一个通道的ADC转换,虽然可以通过每次触发前改变序列上的通道号来对通道实现轮询的转换,但每次触发也只能转换一个通道的模拟量,不能一次ADC触发实现多个模数转换,效率较低。

本篇来学习ADC规则组的多通道转换,一次触发ADC转换可以实现转换多个通道,已知ADC规则组数据寄存器只有一个,当配置为多通道转换时,每个序列上的通道会依次把数据存在数据寄存器中。规则组转换完成一次时(标志位EOC为1),最终数据寄存器上的数据是最后一个指定的序列上的通道转换的值。前面通道的数据都会覆盖,因为组内每一个序列上通道转换完成时,没有标志位,无法通过软件实现检查标志位控制CPU来实现转运数据,那该怎么办呢?

可以通过ADC发出DMA请求,每一个序列上的通道转换完成都会发出DMA请求。ADC序列1的通道转换完成发出DMA请求,触发DMA转运,DMA就会把ADC规则组数据寄存器位置上的数据转运到指定地址,序列2的通道转换完成,数据覆盖上一次转化的数据,再次发出DMA请求,DMA转运数据(转运相当于复制了数据再转运,原数据依然在寄存器中)

图片来源于[8-1] DMA直接存储器存取_哔哩哔哩_bilibili

参考手册

DMA请求 因为规则通道转换的值储存在一个仅有的数据寄存器中,所以当转换多个规则通道时需要使用 DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。 只有在规则通道的转换结束时才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到用户指定的目的地址。

注: 只有ADC1和ADC3拥有DMA功能。由ADC2转化的数据可以通过双ADC模式,利用ADC1的 DMA功能传输。 

定义变量

ADC分辨率为12位,但规则组通道数据寄存器为16位,我这里数据设置右对齐,定义无符号16位储存规则组4个通道的值

关于数据对齐的解释这里不再赘述

uint16_t AD_Value[4]; //存放DM
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值