STM32 ADC1_DMA

发布者:DelightWish123最新更新时间:2016-10-04 来源: eefocus关键字:STM32  ADC1_DMA 手机看文章 扫描二维码
随时随地手机看文章
重温一个旧的例程 ADC 仍然十分简单,将DMA应用于 ADC 这个就比较实用了。

ADC规则数据寄存器(ADC_DR)   0x4001244C

/**************************************************************
 ADC PB1_ADC9 
 
***************************************************************/
#include "STM32Lib\\stm32f10x.h"
#define ADC1_DR_Address    ((uint32_t)0x4001244C)
extern u16 adc;
void ADC_Configuration(void)
{
 ADC_InitTypeDef   ADC_InitStructure;
 GPIO_InitTypeDef  GPIO_InitStructure;
 DMA_InitTypeDef   DMA_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

 /* PB1*/
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
/***********************************************************************************************************************
 // ADC1 
 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);
 
 //ADC1 Regular Channel1 Configuration                                      
 ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_1Cycles5); //通道X,采样时间为1.5周期,1代表规则通道第1个
 
 ADC_Cmd   (ADC1, ENABLE);             // Enable ADC1                         //使能或者失能指定的ADC
 ADC_SoftwareStartConvCmd(ADC1,ENABLE); // Start ADC1 Software Conversion      //使能或者失能指定的ADC的软件转换启动功能
}


u16 TestAdc(void)
{
 u16 adc;
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); //检查制定ADC标志位置1与否 ADC_FLAG_EOC 转换结束标志位
adc=ADC_GetConversionValue(ADC1);

return adc;//返回最近一次ADCx规则组的转换结果

}
*****************************************************************************************************************/

   
/* DMA1 channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&adc;
  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_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_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);
  
  /* ADC1 configuration ------------------------------------------------------*/
  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 = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channel9 configuration */ 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_1Cycles5);

  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);
  
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibaration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));
     
  /* Start ADC1 Software Conversion */ 
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);


}

这个是抄意法半导体官方例程 注释部分是以前写的例程相较而言, 感觉官方的就是做的细 比如这个 calibaration 之前我是从不注意这个问题的,以后我也会多多参考 官方的例程。
送图一张。

STM32 ADC1_DMA - java - stm32学习日志
 
 
 
 
 
关键字:STM32  ADC1_DMA 引用地址:STM32 ADC1_DMA

上一篇:STM32 驱动无线NRF24L01 的稳定修正
下一篇:基于 STM32 RTC的万年历

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

为什么STM32中SPI的MISO引脚设置成复用推挽输出
在复用SPI总线时,必须先设置总线端口。读取其他ARM芯片(如NXP)一般很容易看出芯片的设置是否正确。不过对于STM32就容易让人迷惑了。例如,我们在使用SPI总线进行通信时,可以这样设置: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用的推挽输出 恐怕大家对MISO端口的设置就会产生疑惑了,M
[单片机]
如何设计一个以stm32为控制核心的数字示波器?
随着集成电路的发展和数字信号处理技术的采用,数字 示波器 已成为集显示、测量、运算、分析、记录等各种功能于一体的智能化测量仪器。数字示波器在性能上也逐渐超越模拟示波器,并有取而代之的趋势。与模拟示波器相比,数字示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。因此,数字示波器的使用越来越广泛。目前我国国内自主研发的高性能数字示波器还是比较少,广泛使用的仍是国外产品。因此,有必要对高性能数字示波器进行广泛和深入研究。 本文通过采用高速高性能器件,设计了一实时采样率为60 msa/s的宽带数字示波器。 1 数字示波器的性能参数设计 数字存储示波器的指标很多,包括采样率、带宽、灵敏度
[测试测量]
如何设计一个以<font color='red'>stm32</font>为控制核心的数字示波器?
STM32延时消除抖动个人理解
今天在一段中断服务子程序中发现这么一句话。 delay_ms(10);//消抖 于是很好奇什么是抖动,以及为什么要消除抖动,还有抖动该怎么消除。 1.先讲一下什么是抖动: 通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动。这是我画的丑图,按键一按下时会产生一连串的抖动: 2.为什么要消除抖动: 按键稳定闭合时间长短是由操作人员决定的,通常都会在100ms以上,刻意快速按的话能达到40-50ms左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都会在10
[单片机]
<font color='red'>STM32</font>延时消除抖动个人理解
STM32——MDK4与MDK5中对于数据类型的不同
首先我们来看MD4中的对于数据类型的定义: 然后我们跳转到其定义处查看对其的定义: typedef unsigned long u32; typedef unsigned short u16; typedef unsigned char u8; /*首先我们来认识typedef,这是用来为复杂的声明定义简单的别名,也就是说,我们可以用它来给我们的数据类型来进行定义。*/ /* 然后我们再来看之后的unsigned,unsigned用于限定后面的为无符号类型,如果后面不加什么的话,就默认为unsigned int。*/ /*unsigned long 无符号长数据 unsigned char 无符号字符型 u
[单片机]
STM32 初学 led 不用库 详细分析
本来只是路过,写详细一点。 我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式工程师》这篇文章,想清楚了, 再动手吧。 我做了个实例,不用ST的库来点LED,解答你的问题 我的 KeilMDK 3.5 我的STM32板子奋斗版是 ,IC 是 STM32F103VET6 调试工具 JLINK V8 LED 接在 PB5 ,高电平点亮 既然楼主说一定懂C语言了,那么对于下面我的问题,不查百度,完全靠自己,懂多少?然后查了百度之后又能懂多少? (一)新建 keil 工程,IC选择 ST 公司的 STM32F103VE,keil提示是否copy 启动文件,选择是。 这里有问题问楼主, 你有没有读过这个启动头
[单片机]
CM3(STM32)内核复位与系统复位区别及应用
Ⅰ、写在前面 某些系统允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数器不能改变等。 例子:我一个A系统通过一个IO控制另一个B系统的电源,而这个IO置高时才开启B系统的电源。 正常工作过程中,B系统只有收到A系统关机命令任务才会进行关机(也就是说不能掉电关机),而A系统在工作过程中有复位的需求。 这个时候如果我使用常规的引脚复位,就会使IO置低,不符合要求,就需要使用到本文说到的内核复位。 Ⅱ、关于复位 说到复位,我们都不会陌生,学习时,开发板上基本都有一个复位按键。 复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。 上面说的复位按键,也就
[单片机]
浅谈QSPI的特点以及QSPI的三种工作模式
意法半导体STM32F7系列MCU采用高性能的ARM Cortex-M7核心,借助ST的ART Accelerator™和L1缓存,STM32F7微控制器可提供Cortex-M7内核的最高理论性能,而无论代码是从嵌入式闪存还是由外部存储器执行的:1082 CoreMark / 462 DMIPS在216 MHz f CPU。带有新外围设备的智能架构。可利用STM32系列丰富的外设资源来外扩SRAM芯片。STM32F7支持QSPI. 意法半导体MCU STM32F7系列释放了Cortex-M7内核,AXI和多AHB总线矩阵,用于互连内核,外围设备和存储器。具有高达2MB的嵌入式闪存,在某些设备上具有读-写功能。两个用于以太网的通
[单片机]
STM32 F0:演绎MCU领域的物种进化论
“今天我们主要谈一谈遗传方面的东西。”若听到意法半导体的微控制器全球市场部总监Daniel Colonna的嘴里说出这句话,定是觉得一头雾水。没错,在意法半导体5月15日举办的新品发布会上谈论的就是这个话题。主角就是意法半导体要隆重推出的针对低端应用的STM32 F0系列入门型微控制器,那这又跟遗传学扯上什么关系了呢? 意法半导体的STM32家族又添新军,8位微控制器的终结者STM32 F0系列微控制器,基于超低功耗的ARM Cortex-M0架构,以彻底消除8/16位在应用上的局限性和性能差距为终极目标,可简化家电和工业控制应用开发任务。更重要的是,STM32 F0不仅仅是填补了STM32在低端应用领域的空缺,更是ST
[单片机]
<font color='red'>STM32</font> F0:演绎MCU领域的物种进化论
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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