大神教你如何快速使用DMA处理ADC

发布者:SereneHeart最新更新时间:2024-02-23 来源: elecfans关键字:DMA  ADC  STM32 手机看文章 扫描二维码
随时随地手机看文章

ADC:

1.STM32内部的ADC模块有三个ADC1,ADC2,ADC3,他们彼此独立,所以可以进行同步采样。


2ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生,要在RCC_CFGR配置,再ADC自己的寄存器中在没有时钟分频的配置位。

大神教你如何快速使用DMA处理ADC

3.ADC转换时间: STM32F103xx增强型产,时钟为56MHz时为1μ s( 时钟为72MHz为1.17 μ s)

4.ADC的转换精度默认设置为12位,输入范围:ADC输入范围:V REF-≤ VIN≤ VREF+

5.共有18个通道,其中外部16个通道,内部两个通道,内部温度传感器连接在ADC1_IN16,内部参考电压V REFINT连接在ADC1_IN17

6.转换的启动方式:有外部触发,内部外设触发如TIMx,以及软件触发,一次触发转换一个组,软件使能方式通过设置ADC_CR2 寄存器的ADON。

7.两个组的概念,a.规则组:一般情况下使用的ADC转换序列;b.注入组,它的优先级高于规则组中的转换序列,当规则组正在转换的情况下,入股触发了注入组,他将会打断规则组正在进行的转换,知道注入组转换完成,再次会带规则则组转换。

8总的来说,规则转换的方式有两种,即连独立单次转换方式、间断一次启动转换n个通道,n可配置、连续不断地转换,知道知道设置了停止。连续加是扫描模式下,一次启动通道会在序列中逐个来回的转换,然而规则通道组只有一个数据寄存器ADCx_DR,因此下一次转换完成之前必须将上次转换的数据值读出,否则将会 被覆盖,这是一般会使能DMA请求,让每次数据刺激转换完成后产生EOC的同时,也产生DMA请求,DMA将DR中的数据传至存储器单元。

而单次转换模式下必须要每次完成之后查询EOC或利用中断将数据读出,然后再软件启动下一次转换,在这期间若要改变转换的序列也可以写入下次采集的通道。和以前使用AD的模式一样,但这样耗费时间。

间断模式,是在整个SQR寄存器组中通过设置n,一次制转换其中的几个,知道将这个序列转换完。暂时未用。

8.ADC的采样时间时刻配置的,在采样时间寄存器配置,一次转换所需要的时间TCONV= 采样时间+ 12.5 = 14 周期,12.5是转换周期。

9.有序数据只有12,不足16位,因此要设置第七方式,方便数据的提取,有注入组中能设置转换的品偏移量,即转换结果等于采样值减去偏移量的值,可能是负值,因此右对齐式,高位时符号位的扩展,规则组下高4位全部为0。

10.可以配置ADC转换的阀值,类似看门狗功能,ADC_HTR 和ADC_LTR寄存器分别配置上下限,不在这个范围内饰可以产生中断标志,用户可以选择进入中断。

11.外部触发模式,主要是外设的触发信号,TIM的中断时间来触发ADC的转换开始,达到控制采样时间的的目的,就不用如原来一样单独的写配置定时器中断

12.双ADC使用,双ADC有很多中模式,最可能用到的就是双ADC规则同步转换方式,可查阅Datasheet来配置。

规则单次转换配置方式:

关闭CONT,关闭SCAN模式,设置n值等于1,ADC独立模式,初始化结构体基本上是这样。

然后向SQR组中的某个位置写入通道号,配置该通道的转换采样时间。

使能ADCx,比较重要的是在最后要进行ADC校准,否则可能不准,校准包括复位校准、AD校准,等待校准完成后才能开始转换。

每次转换完成查询EOC标志位,然后读取DR数据并且使能下一次转换,也可写入新的转换通道。

void Init_ADC()

{

ADC_InitTypeDef ADC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

RCC_ADCCLKConfig(RCC_PCLK2_Div6);

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

ADC_DeInit(ADC1);

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_InitStructure.ADC_ScanConvMode = ENABLE; //这是使用连续扫描模式时

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfChannel = 2;

// ADC_InitStructure.ADC_ScanConvMode = DSIABLE;

// ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

// ADC_InitStructure.ADC_NbrOfChannel = 1;

ADC_Init(ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); //

ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); //

/* Enable ADC1 DMA */

ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */

ADC_Cmd(ADC1, ENABLE);

/* Enable ADC1 reset calibration register */

ADC_ResetCalibration(ADC1);

while(ADC_GetResetCalibrationStatus(ADC1))

{

;

}

/* Start ADC1 calibration */

ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1))

{

;

}

}

读取函数:

void GetADValue()

{

// ADC_RegularChannelConfig(ADC1


关键字:DMA  ADC  STM32 引用地址:大神教你如何快速使用DMA处理ADC

上一篇:使用电容器降低MCU的电源噪声
下一篇:stm32串口接收中断触发原理

推荐阅读最新更新时间:2024-11-06 18:11

STM32 基础系列教程 24 - USB_HID_key
前言 学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开发了。需要提示的是,stm32在使用usb接口功能是一般需要在DP引脚上上拉一个1.5K电阻到3.3V(部分MCU内部会上拉)。 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如
[单片机]
<font color='red'>STM32</font> 基础系列教程 24 - USB_HID_key
STM32开发笔记19: STM32CubeMX中定时器的配置方法
单片机型号:STM32L053R8T6 本文介绍在STM32CubeMX进行定时器的配置,产生固定时间中断的方法,以TIM2为例,步骤如下: 1、使能TIM2,指定时钟源。 2、查看数据手册,确定该定时器的内部数据总线,本文所引用的定时器内部数据总线为APB1。 3、在时钟配置中确认所选定时器的内部数据总线的时钟频率,我这里是32MHz。 4、在配置页中,选中相应的时钟,在Prescaler中输入预分频系数,在Counter Period中输入溢出系数。例如,本例中时钟为32MHz/32=1MHz,也就是一个周期为1us,我选择溢出系数为1000,则产生中断的时间为1ms。
[单片机]
<font color='red'>STM32</font>开发笔记19: STM32CubeMX中定时器的配置方法
STM32之输入捕获以及小小应用(库)
简介:五一之际,先祝大家五一快乐、其实快乐很简单,工作的人有假放,学习的人也有假放,像我,有假放才有更多的时间学自己想学的东西、51假期学51,可惜没有32假期呀、好了、、言归正传,大家听过吸星大法吧、、在这里、智商和情商比我高的人估计又知道我要说什么了、、没错了、、今天我们来了解“葵花宝典”第STM32篇之输入捕获,也就是上文所讲的“吸星大法” 那输入捕获可以用来干嘛呢??这个问题问的好,输入捕获可以用来测量脉冲宽度或者测量频率,假如要捕获一个脉冲的高电平脉宽,我们要怎么做呢??别急哈、、接下来我们从头慢慢的分析到脚、、 据老夫所知:STM32的输入捕获,就是通过检测通道上的边沿信号,在边沿信号发生跳变(比如说突然来个上
[单片机]
<font color='red'>STM32</font>之输入捕获以及小小应用(库)
在Nucleo STM32F401RE上使用SPI DMA方式提高W5500传输速率
WIZnet W5500 支持高达 80MHz SPI 时钟,所以用户可用 MCU来提供一个最大传输速率的高速以太网SPI通讯。本文中,我将展示如何用STM32 MCU来让W5500达到最大传输速率。 当使用来自STMicro的Cortex M3/M4产线的32位处理器,以太网传输速率可以在使用SPI通讯模式事产生最大变化。我将比较使用SPI标准模式和SPI DMA模式的不同传输速率。 组成 MCU : Nucleo STM32F401RE 以太网控制器 : WIZnet WIZ550io(内嵌 W5500) 引脚连接 MCU与WIZnet WIZ550io之间的引脚连接,请参见下表。 首先,连接电源线。 其次,连接S
[单片机]
在Nucleo STM32F401RE上使用SPI <font color='red'>DMA</font>方式提高W5500传输速率
STM32学习笔记--------时钟体系
stm32的时钟体系参考(转自正点原子,仅用于学习交流): 一、时钟是什么? 时钟:给单片机提供一个时钟信号(某个频率),协调单片机内部组件同步工作,实现与外部设备通信的同步。(串口的波特率同步)相当于我们的心脏,是核心的部分。 二、时钟源 STM32103的5个时钟源 HSE 高速外部时钟 RC振荡器 频率为8MHz HSI 高速内部时钟 外接时钟4MHz~16MHz LSI 低速内部时钟 RC振荡器频率为40KHz 供WDG看门狗 LSE 低速外部时钟 32.768MHz 供给RTC PLL 锁相环倍频输出(范围2~16倍)最大不超过72MHz 系统时钟来源SYSCLK HSI HSE PLL 时钟
[单片机]
<font color='red'>STM32</font>学习笔记--------时钟体系
stm32 GPIO 速度 模式理解
1、输入/输出模式(参考stm32手册) 2、GPIO输出模式下,几种速度的区别: (1). GPIO 引脚速度: GPIO_Speed_2MHz (10MHz, 50MHz) ; 又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。) 可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。 (如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。失真因素?) 如果信号频率为10MHz,而你配置了2MHz的带宽,则10MH
[单片机]
stm32函数放入段section中
关键字,__attribute__((section)). 对于这样一个需求,不管你写多少个硬件底层初始化函数,我都能通过固定的循环进行执行,是不动的一个状态,这种实现方式,可以通过以下介绍的方式操作。 思路,有两种办法,一种是指定一个段,这个段需要固定,然后,在这个段之间的区域将函数写入进去。一种是直接将函数一直写入,编译器知道写的函数有多少个,调用编译器得到的函数个数来操作,对于写的函数个数同样灵活。 第一种办法: 指定段的办法。 操作示例: 先定义一个函数类型。 typedef int (*MyFun)(void); #define INIT_FUN(fn,level)
[单片机]
发挥Cortex-M3极致性能的全新STM32 F-2系列(ST)
意法半导体(ST)宣布全新STM32 F-2微控制器产品系列正式上市,把Cortex-M3架构性能发挥到极致。 意法半导体全新的STM32 F-2先进微控制器产品系列整合意法半导体先进的90nm制程与创新的自适应实时存储器加速器(ART Accelerator™),成功发挥Cortex-M3架构的极致性能。当以120MHz速度从闪存执行代码时,STM32 F-2 微控制器的处理性能高达150 Dhrystone MIPS,这是Cortex-M3处理器在这个频率下的最高性能。CoreMark测试结果显示,当从闪存执行代码时,该系列产品的动态功耗为 188uA/MHz ,相当于在120MHz时消耗22.5mA电流。除内置现有Cor
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved