STM32学习——AD单通道与多通道转换(DMA)

发布者:科技探险者最新更新时间:2018-10-20 来源: eefocus关键字:STM32  AD单通道  多通道转换  DMA 手机看文章 扫描二维码
随时随地手机看文章

第三章AD转换

本章的内容分两部分,第一是AD的单通道转换,第二是AD的多通道转换。首先先将单通道转换。

 STM32中自带的AD最大的转换频率是14MHZ,共有16个转换通道,每个转换通道对应的管脚如下表所示。

管脚名

默认复用功能

PF6

ADC3_IN4

PF7

ADC3_IN5

PF8

ADC3_IN6

PF9

ADC3_IN7

PF10

ADC3_IN8

PC0

ADC123_IN10

PC1

ADC123_IN11

PC2

ADC123_IN12

PC3

ADC123_IN13

PA3

ADC123_IN3

PA6

ADC12_IN6

PA7

ADC12_IN7

PC4

ADC12_IN14

PC5

ADC12_IN15

PB0

ADC12_IN8

PB1

ADC12_IN9

注:ADC123_IN10表明PC0管脚可以作为AD1,AD2,AD3的第10通道。

下面我们将PC0配置成AD1的通道10为例进行讲解。

3.1首先我们应将PC0设置成模拟输入:

#include "adc.h"

 

#define  ADC1_DR_Address    ((u32)0x40012400+0x4c)

 

__IO uint16_t ADC_ConvertedValue;

 

        static void ADC1_GPIO_Config(void)

{

 GPIO_InitTypeDef  GPIO_InitStructure;

  

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC,ENABLE);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

   GPIO_Init(GPIOC, &GPIO_InitStructure);

}

 

3.2设置完端口后下一步当然是对AD进行初始化:

        这里需要补充一个知识点DMA,DMA就相当与CPU的一个秘书,他的作用就是帮CPU减轻负担的。说的再具体点就是帮CPU来转移数据的。我们都知道,AD每次转换结束后会将转换的结果放到一个固定的寄存器里,以往我们如果想将该寄存器中的值赋给某一变量时会用到赋值语句,如果不用DMA,则赋值语句便要CPU来完成,CPU本来就要忙着处理其他事情,现在还要来解决赋值语句这么简单的问题,肯到会蛋疼。所以需要DMA这个秘书来帮他解决这个问题。由于DMA只是个秘书,所以比较笨,你只有把任务交代清楚了她才能很好的完成任务。那么怎样来给DMA吩咐任务呢,聪明的人肯定想到了,那当然是“DMA_Init(DMA1_Channel1, &DMA_InitStructure)”这个函数啦。下面就来一步步的来给DMA交代任务。

 

static void ADC1_Mode_Config(void)

{

 DMA_InitTypeDef  DMA_InitStructure;

 ADC_InitTypeDef  ADC_InitStructure;

 

 DMA_DeInit(DMA1_Channel1);

 

 DMA_InitStructure.DMA_PeripheralBaseAddr =ADC1_DR_Address;

 

 DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&ADC_ConvertedValue;

 

 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

 

 DMA_InitStructure.DMA_BufferSize = 1;

  

 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

 

 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

 

 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  

 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  

 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

 

 DMA_InitStructure.DMA_Priority = DMA_Priority_High;

 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

 DMA_Init(DMA1_Channel1, &DMA_InitStructure);

 

  DMA_Cmd(DMA1_Channel1, ENABLE);

  

   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

  

   ADC_InitStructure.ADC_ScanConvMode = DISABLE ;

  

   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

  

   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

  

   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  

   ADC_InitStructure.ADC_NbrOfChannel = 1;

   ADC_Init(ADC1, &ADC_InitStructure);

  

   RCC_ADCCLKConfig(RCC_PCLK2_Div8);

  

  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);

         

   ADC_DMACmd(ADC1, ENABLE);

  

   ADC_Cmd(ADC1, ENABLE);

  

   ADC_ResetCalibration(ADC1);

  

   while(ADC_GetResetCalibrationStatus(ADC1));

  

   ADC_StartCalibration(ADC1);

  

   while(ADC_GetCalibrationStatus(ADC1));

  

   ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

配置完以上的程序,那么AD每转换一次,DMA都会将转换结果搬到变量

ADC_ConvertedValue中,而不需用每次都用赋值语句来取值AD转换的值。

 

 

 

 

第二部分:AD多路采样

#include "adc.h"

#define  ADC1_DR_Address    ((u32)0x40012400+0x4c)

 

__IO uint16_t ADC_ConvertedValue[2];

 

static void ADC1_GPIO_Config(void)

{

 GPIO_InitTypeDef  GPIO_InitStructure;

  

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

 

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC,ENABLE);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

   GPIO_Init(GPIOC, &GPIO_InitStructure);

}

 

static void ADC1_Mode_Config(void)

{

 DMA_InitTypeDef  DMA_InitStructure;

 ADC_InitTypeDef  ADC_InitStructure;

 

 DMA_DeInit(DMA1_Channel1);

 

 DMA_InitStructure.DMA_PeripheralBaseAddr =ADC1_DR_Address;

 

 DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&ADC_ConvertedValue;

 

 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

 

 DMA_InitStructure.DMA_BufferSize = 2;

  

 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

 

 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

   

 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  

 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  

 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

 

 DMA_InitStructure.DMA_Priority = DMA_Priority_High;

 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

 DMA_Init(DMA1_Channel1, &DMA_InitStructure);

 

  DMA_Cmd(DMA1_Channel1, ENABLE);

  

   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_Init(ADC1, &ADC_InitStructure);

  

   RCC_ADCCLKConfig(RCC_PCLK2_Div8);

 

   ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);

   ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);

  

   ADC_DMACmd(ADC1, ENABLE);

  

   ADC_Cmd(ADC1, ENABLE);

  

   ADC_ResetCalibration(ADC1);

  

   while(ADC_GetResetCalibrationStatus(ADC1));

  

   ADC_StartCalibration(ADC1);

  

   while(ADC_GetCalibrationStatus(ADC1));

  

   ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

 

!!!!!单通道采样与多通道采样的不同点都在第二段程序中用红色标出来了,注意比较。

总结:DMA就是一个无私奉献的搬运工,想将外设寄存器中的值放入内存中原本需要CPU来完成,现在DMA来帮CPU完成,这在一定程度上解放了CPU.


关键字:STM32  AD单通道  多通道转换  DMA 引用地址:STM32学习——AD单通道与多通道转换(DMA)

上一篇:stm32中AMBA、AHB、APB总系介绍
下一篇:用STM32F407玩控制—神经网络PID控制

推荐阅读最新更新时间:2024-03-16 16:17

STM32固件库详解
1.1 基于标准外设库的软件开发 1.1.1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对
[单片机]
<font color='red'>STM32</font>固件库详解
STM32的RS485调试过程记录
RS485是半双工,RS422是全双工。 A接A,B接B,不要交叉。 RS485标准是4根线,定义如下: RO: Receiver Output: If A B by 200mV, RO will be high;If A B by 200mV, RO will be low.2 /RE: 接收器输出使能。当RE为低电平时,RO有效;当RE为高电平时,RO为高阻状态。 RI: Driver Input. A low on DI forces output Y low and output Z high. Similarly, a high on DI forces output Y high and output Z low
[单片机]
什么是stm32看门狗?独立看门狗和窗口看门狗工作原理解析
stm32有两个看门狗,独立看门狗和窗口看门狗,其实两者的功能是类似的,只是喂狗的限制时间不同。 独立看门狗是限制喂狗时间在0-x内,x由你的相关寄存器决定。喂狗的时间不能过晚。 窗口看门狗,所以称之为窗口就是因为其喂狗时间是一个有上下限的范围内,你可以通过设定相关寄存器,设定其上限时间和下限时间。喂狗的时间不能过早也不能过晚。 窗口看门狗的 上窗口就是配置寄存器WWDG- CFR里设定的W ; 下窗口是固定的0x40; 当窗口看门狗的计数器在上窗口值之外,或是低于下窗口值都会产生复位。 图2 && 上窗口的值可以只有设定,7位二进制数最大只可以设定为127(0x7F),最小又必须大于下窗口的0x40,所以其取值范
[单片机]
什么是<font color='red'>stm32</font>看门狗?独立看门狗和窗口看门狗工作原理解析
STM32—SysTick系统定时器
SysTick是STM32中的系统定时器,利用SysTick可以实现精确的延时。 SysTick—系统定时器 属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。 延时模式: SysTick的
[单片机]
<font color='red'>STM32</font>—SysTick系统定时器
STM32学习笔记:通用定时器基本设定
STM32 包含11个定时器,其中TIM2~TIM5为通用定时器。 通用定时器挂载在低速外设总线APB1上,其时钟来源于输入为APB1的一个倍频器,只要APB1的时钟分频数不为1,TIMx的时钟频率就会为APB1时钟频率的2倍,即72MHz 。 配置通用定时器需要4步(以配置TIM2为例): (1)配置系统时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);倍 开启TIM2与GPIOA的时钟,其中TIM2挂载在APB1上,GPIOA挂载在APB2上;
[单片机]
STM32单片机的调试接口硬件电路
如果要减小插座的数量,就用SWD模式的仿真,在这个模式下,如果用JLINK只要四根线就可以了,这四根线分别是:3.3V、GND、SWDIO、SWCLK 其中 STM32的JTMS/SWDIO接JTAG口的TMS; STM32的JTCK/SWCLK接JTAG口的TCK。 SWD PIN 1------3.3V PIN 4------GND PIN 7-------PA13(SWDIO) PIN 9-------PA14(SWCLK) 如果要用ULINK2,则再加多一条 NRST ,即5条。 这个接口你可自行定义,在使用时用 杜邦线跳接或做块转换接口板联接仿真器与目标板即可。
[单片机]
<font color='red'>STM32</font>单片机的调试接口硬件电路
关于STM32单片机移植FATFS
使用单片机的朋友都知道单片机一般提供的ROM和RAM都比较小。就算是STM32这样的提供256KB flash和64KB RAM的。一旦你需要存一些数据量比较大的文件的时候还是不够用的。一般可以通过外扩SD和nand flash来实现大容量存储。相对来说SD卡的使用更加方便一些。使用过nand flash的也许会知道nand flash有坏块,使用的时候需要做坏块管理,还有就是需要做损耗均衡。不然nand flash很容易就会坏掉。 下面说说SD卡。SD卡驱动有两种方式。一种是SPI驱动方式。还有一种是SDIO驱动方式。SPI驱动时只需要4更线:CLK、SD_CS、MISO、MOSI。SDIO则需要CLK、CMD、Data0、Da
[单片机]
中国移动多媒体广播智能网络监测系统的设计与实现
随着高速总线和射频技术的大量应用,电子电路的设计工作日益复杂。除传统的模拟和数字电路测试外,示波器增加了越来越多的测试能力,以满足测试需求的增长。本届IIC China 2013展会上,罗德与施瓦茨公司(Rohde & Schwarz)带来了其多款优异性能的示波器。此外,在该公司展台上,笔者还看到了该公司最新的无线通信综测仪、矢量网络分析仪、矢量信号发生器及信号和频谱分析仪等测试测量产品。 据罗德与施瓦茨公司技术支持经理付国映介绍,该公司RTO示波器具有极佳的信号保真度、极高的采样率和全球第一个实时数字式触发系统,结构紧凑,属于600MHz至4GHz级别的仪器。这些示波器具有硬件加速的测量与分析功能,以及先进的用户界面,能
[测试测量]
中国移动多媒体广播智能网络监测系统的设计与实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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