STM32F407 ADC DMA 采样实验

发布者:未来画家最新更新时间:2016-12-19 来源: eefocus关键字:STM32F407  ADC  DMA  采样实验 手机看文章 扫描二维码
随时随地手机看文章

    最近公司又做了一款407的样板,正好需要用到407的ADC功能,需要用PC.2来检测RFID芯片的射频电源功率,首先看了下407的数据手册

  

可以配置到ADC1/2/3任何一个控制器的信道12上面.我打算将PC.2映射到ADC3上面和使用DMA功能,又看了下DMA的请求映射表,ADC3使用的DMA2的流0信道2

.............................................................................................

编程思路:

首先将DMA和IO以及ADC的时钟使能,其次将相应的IO配置成输入模式,最后配置DMA和ADC

注意

/*定义ADC3的数据寄存器地址,DMA功能要用到外设的数据地址
 *ADC3的数据地址为外设基地址+偏移地址,基地址在RM0090 Reference
 *manual(参考手册)的地址映射表里,为0x40012200,ADC_DR
 *偏移地址为0x4C,故实际地址为0x40012200+0x4C = 0x4001224C */
#define ADC3_DR_Address   ((uint32_t)0x4001224C)

代码详见:

void Adc3_Init(void)

{

/* Enable peripheral clocks ------------------------------------------------*/

/* Enable DMA1 clock */ 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);

               RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

GPIO_Configuration();

DMA_Configuration();

 

}

void DMA_Configuration(void)

{

ADC_InitTypeDef ADC_InitStructure;

  DMA_InitTypeDef DMA_InitStructure;

ADC_CommonInitTypeDef ADC_CommonInitStructure;

  /* DMA2 Stream0 channel0 configuration **************************************/

  DMA_InitStructure.DMA_Channel = DMA_Channel_2;  

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_Address;

  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValue;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;

  DMA_InitStructure.DMA_BufferSize = 1;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;

  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_FIFOMode = DMA_FIFOMode_Disable;         

  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

  DMA_Init(DMA2_Stream0, &DMA_InitStructure);

  DMA_Cmd(DMA2_Stream0, ENABLE);

  /* ADC Common Init **********************************************************/

  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;

  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;

  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;

  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

  ADC_CommonInit(&ADC_CommonInitStructure);

  /* ADC3 Init ****************************************************************/

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

  ADC_InitStructure.ADC_ScanConvMode = DISABLE;         // PS :  在多通道 2个通道以上 该选项应该使能

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  ADC_InitStructure.ADC_NbrOfConversion = 1;

  ADC_Init(ADC3, &ADC_InitStructure);

  /* ADC3 regular channel12 configuration *************************************/

  ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 1, ADC_SampleTime_3Cycles);

 /* Enable DMA request after last transfer (Single-ADC mode) */

  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);

  /* Enable ADC3 DMA */

  ADC_DMACmd(ADC3, ENABLE);

  /* Enable ADC3 */

  ADC_Cmd(ADC3, ENABLE);

/* Start ADC3 Software Conversion */ 

  ADC_SoftwareStartConv(ADC3);   //如果不是外部触发则必须软件开始转换

}

 

 

 

/**

  * @brief  Configures the different GPIO ports.

  * @param  None

  * @retval None

  */

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure PC.2 (ADC Channel2) PC.1 (ADC Channel1) as analog input -------------------------*/

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

}

 

PS:   以上程序有错误:  在配置DMA的时候需要先使能DMA时钟


关键字:STM32F407  ADC  DMA  采样实验 引用地址:STM32F407 ADC DMA 采样实验

上一篇:STM32 IAP 在线更新程序问题
下一篇:关于stm32的正交解码

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

介绍如何通过意法的STM32 MCU实现用DMA完成多通道的AD采样功能
在嵌入式产品中有时候需要实现对外部的模拟量进行采样处理和记录,而这就需要使用到ADC功能,将外部的模拟量转换成数字量。而在复杂的嵌入式产品中,往往需要使用多路AD采样,例如在智能家居产品,电池电量检测,热敏温度传感器,烟雾传感器,气敏传感器等都是可以使用ADC来实现采样的。在本文章,将会介绍如何通过意法的STM32 MCU实现用DMA完成多通道的AD采样功能。 什么叫ADC ADC即模拟数字转换器(英语:Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。 影响AD采样的因素有哪些 分
[单片机]
介绍如何通过意法的STM32 MCU实现用<font color='red'>DMA</font>完成多通道的AD<font color='red'>采样</font>功能
超小型模数转换器提升低功耗的医疗设计电路图及原理
医疗设备的发展正在彻底变革家庭医疗保健市场,人们无需离开家门就能诊断出各种健康状况。技术的发展使得便携式自助护理保健系统成为现实,这些系统可以帮助人们监视诸如血压、血糖和体温等重要指标。   家庭医疗监察和监视系统可以帮助人们掌控自己的健康状况,但是这些医疗设备必须快速和高效率,并能在最重要的时候保证工作。随着便携式医疗传感器的发展,更长电池寿命和更小外形尺寸的需求对非组织入侵式护理来说变得愈加关键。   医疗测量设备一般需要整合多种信号调节电路,包括放大器、滤波、参考源和模数转换器(ADC)等,才能分辨和识别传感器信号。除了小尺寸外,读取传感器输出的模拟电路要求低功率工作也很重要,这样才能提供更长的电池寿命和更多的读取
[模拟电子]
超小型<font color='red'>模数转换器</font>提升低功耗的医疗设计电路图及原理
MAX1169 ADC与PIC微控制器的接口
本应用笔记介绍如何连接MAX1169模数转换器(ADC)至PIC微控制器。提供了对应PIC18F442的实例电路和软件。该软件包含了利用内部MSSP I2C*端口,以400kHz速率连接ADC至PIC微控制器的函数调用。 MAX1169是一款16位、低功耗ADC,具有I2C兼容的2线串行接口。MAX1169的接口可支持快速模式(400kHz)和高速模式(高达1.7MHz)。 本应用笔记包括实例应用电路和用于PIC18F442的软件。该软件提供了利用内部MSSP I2C端口,以400kHz速率连接ADC至PIC微控制器的函数调用。因为其它微控制器具有类似的片上外围设备,所以实例中所提供的I2C通信程序被有意拆分为单独的I2C函
[工业控制]
MAX1169 <font color='red'>ADC</font>与PIC微控制器的接口
stm32f407之EXTI(操作寄存器)
六、EXTI 外部中断/事件控制器包括用于生成高达23个事件/中断的请求。每条中断线可独立配置选择类型(响应或挂起)和相应的触发事件(上升或下降或两者)。每一中断线可以独立屏蔽。有一个挂起寄存器维持中断线的状态请求。 EXTI线0~15连接到PX0~15(可编程配置) EXTI线16连接到PVD的输出事件 EXTI线17连接到RTC报警事件 EXTI线18连接的USB OTG FS唤醒事件 EXTI线19连接到以太网唤醒事件 EXTI线20连接的USB OTG HS(在FS配置)唤醒事件 EXTI线21连接到RTC的篡改和TimeStamp事件 EXTI线22连接到RTC唤醒事件 设置步骤: 1.
[单片机]
关于STM32的ADC/DAC问题集锦
1、STM32的DAC转换是什么开始的呢? 问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? 答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。 2、STM32的DAC输出电压 问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下: #include stm32f10x_lib.h #define DAC_DHR8R1_Address 0x40007410 DAC_InitTypeDef DAC_InitStructure;
[单片机]
51单片机驱动ADC0809片内RAM存转换结果汇编程序
;入口:通道1的模拟量, ;出口:片内RAM开辟一个数据区,用于存放A/D转换结果, IN0 IN7的结果 ;分别存于30H 37H 8个单元中 AD0809: MOV R1,#01H ACALL AD0809_1 RET AD0809_1:MOV DPTR,# ;通道地址 MOV A,R1 ;送通道号 MOVX @DPTR,A;启动转换 WAIT: NOP JNB R1.7,WAIT ;P1.7为EOC信号 为1完成,0,转换中。 MOVX A,@DPTR ;转换完成 XCH A,R1 ADD A,#30H XCH A,R1 MOV @R1,A RET
[单片机]
【stm32f103】DMA应用memory to memory(寄存器版)
注释:此文档是利用DMA实现memory to memory的搬运 可能有的人会说直接用memcpy会更方便,确实是这样,但是此文章仅仅是DMA应用的例子,所以不采用memcpy的方法,并且此历程中不配置DMA中断 后续在系统讲解USART章节中再讲解DMA中断 一.DMA1所在总线 所以要先ENABLE DMA所在总线时钟 RCC- AHBENR = RCC_AHBENR_DMA2EN; 二.DMA寄存器 寄存器可以参考 参考手册,在这里不做详细讨论 三.编程步骤: 1.使能DMA时钟‘ 2.配置DMA外设地址(如果是memroy to meory也需要把memory的地址设置成外设地址,但是需要额外配置DMA
[单片机]
【stm32f103】<font color='red'>DMA</font>应用memory to memory(寄存器版)
24位Σ-Δ模数转换器CS1240在电子秤中的应用
  CS1240是一款中国本土开发的精密模数转换(ADC)芯片,分辨率为24位,有效精度高达21位,可以广泛应用于工业过程控制、电子秤、气体/液体检测仪和血液计等各种应用。本文描述了该芯片的主要特点,并以普通和高精度电子秤为例,讨论了CS1240的典型应用电路。   典型应用电路 ? 图1:CS1240芯片功能结构图   芯海科技有限公司自主研发的CS1240是一款24位高精度、低功耗Σ-Δ模数转换芯片,其分辨率为24位,有效精度高达21位,可以在2.7V-5.5V电源电压条件下工作。   CS1240具有8个模拟输入端、8个数字输入输出通道, 可以选择输入通道模拟缓冲器或者直接将信号输入模数转换器,模拟缓冲器可
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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