STM32学习笔记之ADC--DMA方式

发布者:创意驿站最新更新时间:2015-08-12 来源: eefocus关键字:STM32  学习笔记  ADC  DMA方式 手机看文章 扫描二维码
随时随地手机看文章
程序功能是把ADC1模块里通道14的输入电压转换后通过USART2发送到PC,在PC机上用串口调试助手观察接收数据:

STM32是12位ADC,测量结果基本还可以!程序用了DMA来传输ADC转换值,调高了读取速度。串口部分用是上一篇串口调试笔记里的代码。

 
#include
#include

#define ADC1_DR_Address    ((u32)0x4001244C)

#ifdef __GNUC__
 
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

vu16 ADC_ConvertedValue;

void RCC_Config(void);
void GPIO_Config(void);
void USART_Config(void);
void DMA_Config(void);
void ADC_Config(void);
void Put_String(u8 *p);
void Delay(vu32 nCount);
int main(void)
{
 RCC_Config();
 GPIO_Config();
 USART_Config();
 DMA_Config();
 ADC_Config();

 
 while(1)
 
 
  Delay(0x8FFFF);  
   printf("ADC = %X Volt = %d mvrn", ADC_ConvertedValue, ADC_ConvertedValue*3300/4096);
  
 }
}

void RCC_Config(void)
{
 ErrorStatus HSEStartUpStatus;//定义外部高速晶体启动状态枚举变量
 RCC_DeInit();//复位RCC外部设备寄存器到默认值
 RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
 HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟准备好
 if(HSEStartUpStatus == SUCCESS)//外部高速时钟已经准别好
    {

   RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)时钟=SYSCLK
   RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟=AHB时钟
   RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)钟=AHB 1/2时钟
      RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC时钟=PCLK2 1/4
      
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
   //配置PLL时钟 == 外部高速晶体时钟*9
   RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC时钟= PCLK2/4

      RCC_PLLCmd(ENABLE);//使能PLL时钟
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
       {
       }
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟 = PLL时钟
  
      while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
       {
       }
  }
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);//使能DMA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
  //使能ADC1,GPIOC时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
  //打开GPIOD和AFIO时钟

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能串口2时钟
}

void GPIO_Config(void)
{
 //设置RTS(PD.04),Tx(PD.05)为推拉输出模式
 GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
 GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//使能GPIO端口映射USART2
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//选择PIN4 PIN5
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚频率50M
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引脚设置推拉输出
 GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIOD
 //配置CTS (PD.03),USART2 Rx (PD.06)为浮点输入模式
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOD, &GPIO_InitStructure);
 //配置PC4为模拟输入
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOC, &GPIO_InitStructure);

}[page]

void DMA_Config(void)
{
 DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体
 DMA_DeInit(DMA_Channel1);//复位DMA通道1
 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义 DMA通道外设基地址=ADC1_DR_Address
 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //定义DMA通道存储器地址
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址
 DMA_InitStructure.DMA_BufferSize = 1;//定义DMA缓冲区大小1
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//当前存储器地址不变
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位
 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输
 DMA_Init(DMA_Channel1, &DMA_InitStructure);//初始化DMA通道1
 DMA_Cmd(DMA_Channel1, ENABLE); //使能DMA通道1
}

void ADC_Config(void)
{
  ADC_InitTypeDef ADC_InitStructure;//定义ADC初始化结构体变量
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
  ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
  ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为通道1
  ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5);
  //ADC1选择信道14,音序器等级1,采样时间239.5个周期
  ADC_DMACmd(ADC1, ENABLE);//使能ADC1模块DMA
  ADC_Cmd(ADC1, ENABLE);//使能ADC1
  ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
  while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
  ADC_StartCalibration(ADC1);//开始ADC1校准
  while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
  ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
}

void USART_Config(void)
{
 USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
 USART_InitStructure.USART_BaudRate = 115200;//波特率9600
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据 
 USART_InitStructure.USART_StopBits = USART_StopBits_1;//1个停止位
 USART_InitStructure.USART_Parity = USART_Parity_No ; //无校验位
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 //禁用RTSCTS硬件流控制
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送接收
 USART_InitStructure.USART_Clock = USART_Clock_Disable; //串口时钟禁止
 USART_InitStructure.USART_CPOL = USART_CPOL_Low; //时钟下降沿有效
 USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;//数据在第二个时钟沿捕捉
 USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
 //最后数据位的时钟脉冲不输出到SCLK引脚
 USART_Init(USART2, &USART_InitStructure);//初始化串口2
 USART_Cmd(USART2, ENABLE);//串口2使能
}

void Put_String(u8 *p)
{
 while(*p)
 {
  USART_SendData(USART2, *p++);
  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
  {
   
  }
 }
}

void Delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}

PUTCHAR_PROTOTYPE
{
 USART_SendData(USART2, (u8) ch);//发送一字节数据
 while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
 {
 }//等待发送完成
 return ch;
}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

void ADC_Configuration(void)
{
   ADC_InitTypeDef ADC_InitStructure;

 
  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);

   
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_13Cycles5);

 
  ADC_Cmd(ADC1, ENABLE);

   
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);  
}

ADCVal = ADC_GetConversionValue(ADC1);   //查询方式

关键字:STM32  学习笔记  ADC  DMA方式 引用地址:STM32学习笔记之ADC--DMA方式

上一篇:STM32_Technical_slide摘录(DMA问题)
下一篇:STM32多通道ADC规则转换实现

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

stm32 keil配置
出现这几个错误 \output\Buzzer.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from main.o). .\output\Buzzer.axf: Error: L6218E: Undefined symbol GPIO_PinRemapConfig (referred from main.o). .\output\Buzzer.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from main.o). .\output\Buzzer.axf: Error: L6218E: Un
[单片机]
<font color='red'>stm32</font> keil配置
过采样ADC与PGA结合,提供127dB动态范围
电子行业经常需要测量宽动态范围信号,但目前的技术常常难以满足系统的实际要求。电子秤系统通常采用称重桥式传感器,最大满量程输出为1 mV至2 mV。这种系统要求分辨率约为1000000:1,折合到2 mV输入端时,需要高性能、低噪声、高增益放大器和∑-∆调制器。与此类似,医疗应用中进行化学和血液分析时经常会采用光电二极管传感器,产生的电流很小,需要精确测量(如图1所示)。通常采用的是低噪声跨导放大器,该放大器有多级增益和后处理功能。 图1. 称重传感器和光电二极管应用的输入 尽管实际传感器数据通常只占输入信号范围的一小部分,但系统往往必须经过专门设计以处理故障情况。因此,宽动态范围、高性能(且输入较小)以及对快速变化信号
[测试测量]
过采样<font color='red'>ADC</font>与PGA结合,提供127dB动态范围
使用STM32调试FMSDR模块及解调FM电台(3)
3. 调试8027使其发出单音FM信号 3.1 输出24Mhz和验证I2C接口 1. 硬件连接 将FM_SDR板卡和STM32H750开发板连接。 本文中所有例子中我们都仅给MSI001使用天线,因为QN8027离得很近,发射端不需要使用天线 本程序中操作的管脚如下描述: 2. PWM输出24MHz QN8027芯片需要输入24MHz的时钟作为参考信号,在这里通过STM32H750的TIMER2产生24M的方波,提供给QN8027作为输入参考信号。 PWM信号的关键参数是频率和占空比,我们分别看一下如何设定TIM2来确定输出PWM的频率和占空比: PWM的输出频率=计数器计数频率/(计数器的计数上限+1),计数器计数频
[单片机]
使用<font color='red'>STM32</font>调试FMSDR模块及解调FM电台(3)
STM32学习笔记:串口一键下载电路(CH340)的理解
如图:为原子的串口下载电路 在CH340的数据手册上有引脚的介绍以及作用: 这两个引脚:DTR#和RTS#都是 输出类型, MCUISP(一键下载工具),会控制CH340这两个引脚的高低电平状态,通过控制DTR#和RST#这两个引脚的高低电平状态,从而控制STM32的BOOT0 和 RESET. 用万用表测量可知,DTR#、RST#初始状态的时都是高电平,在启用下载的时候,DTR#维持高,RST#拉低,此时两个三极管Q2 和Q3 导通,那么BOOT0 为高电平,RESET为低电平复位,然后DTR#变低,Q2不导通,复位结束,此时BOOT0 为高电平。由启动模式 可知,stm32的启动模式变为从系统存储器启动,启用串口
[单片机]
<font color='red'>STM32</font><font color='red'>学习</font><font color='red'>笔记</font>:串口一键下载电路(CH340)的理解
STM32 关于ADC采交直流问题探讨
前沿 关于STM32采样问题,相信很多人曾遇到过这样的问题,无论是关于ADC底层相关的配置还是ADC采样方案的抉择,或者是ADC软硬件滤波算法,这里博主就自己曾做过的训练题为引申,探讨ADC采样过程中的问题。 1.ADC的认识 1.1 ADC初始化参数 /* Exported types ------------------------------------------------------------*/ /** * @brief ADC Init structure definition */ typedef struct { uint32_t ADC_Resolution;
[单片机]
<font color='red'>STM32</font> 关于<font color='red'>ADC</font>采交直流问题探讨
IAR stm32 warning:Label 'xxxxx' is defined pubweak in&
问题: 在用IAR 建立工程的时候 REBUILD ALL 一下 会出现: lable xxxx is defined pubweak in a section implicitly declared root的警告 解决方法: 解决方法在所用的启动文件中,比如startup_stm32f10x_hs.s(具体看你用的是哪一个启动文件),在出现RECORDER的地方在后面添加:NOROOT重新编译后警告就没有了。 官方链接: https://www.iar.com/support/tech-notes/assembler/warning25-label-xxxxx-is-defined-pubweak-in-a-se
[单片机]
IAR <font color='red'>stm32</font> warning:Label 'xxxxx' is defined pubweak in&
STM32 GPIO工作原理详解
1.STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 以STM32F103ZET6芯片为例子,该芯片共有144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 STM32的大部分引脚除了当GPIO使用之外,还可以复用位外设功能引脚(比如串口),这部分在STM32端口复用和重映射(AFIO辅
[单片机]
STM32触摸按键原理和电路设计
01触摸按键原理 触摸使用RC充放电原理: RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用的电路。 充电过程: 电源通过电阻给电容充电,由于一开始电容两端的电压为0,所以电压的电压都在电阻上,这时电流大,充电速度快。随着电容两端电压的上升,电阻两端的电压下降,电流也随之减小,充电速度小。充电的速度与电阻和电容的大小有关。电阻R越大,充电越慢,电容C越大,充电越慢。衡量充电速度的常数t(tao)=RC。 放电过程: 电容C通过电阻R放电,由于电容刚开始放电时电压为E,放电电流I=E/R,该电流很大,所以放电速度很快。随着电容不断的放电,电容的电压也随着下降。电流也很快减小。电容的放电速度与RC有关,R的阻值
[单片机]
<font color='red'>STM32</font>触摸按键原理和电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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