你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

发一个STM32的MDA控制ADC采样程序

[复制链接]
sasmike 发布时间:2015-1-8 15:49
本帖最后由 sasmike 于 2015-1-8 16:00 编辑

最近学习了STM32F0芯片,写了一个DMA控制ADC采样程序,给大家分享一下。还是新手,希望大家多提宝贵意见
程序在STM32F051上面测试的
基本内容是:
1、使用ADC1的11通道每1us采集一次ADC数值
2、使用DMA1的1通道对采集数据自动存储,共采集1000个数据
3、每次采集1000次数据后,在主函数中对1000次数据进行求平均值
4、由串口1发送到电脑串口上显示
具体程序如下:
#include "main.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define ADC_DR_Address                  0x40012440
#define ADC_BUFFER_SIZE                 1000

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
__IO uint16_t ADC_Buffer[ADC_BUFFER_SIZE];
__IO uint32_t ADC_ConvertedData_Sum;
__IO uint16_t ADC_ConvertedData;
__IO uint16_t ADC_ConvertedVoltage;

/* Private functions ---------------------------------------------------------*/
void Delay(__IO uint32_t nCount);


int main(void)
{

  __IO uint16_t index;
  
  USART1_GPIO_Init();
  
  printf("This is a ADC DMA Demo...\n");
  
  ADC_DMA_Config();
  
  /* Infinite loop */
  while (1)
  {
    ADC_StartOfConversion(ADC1);
   
    while ((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET)
    {
    }
   
    ADC_StopOfConversion(ADC1);
   
    DMA_ClearFlag(DMA1_FLAG_TC1);
   
    ADC_ConvertedData_Sum = 0;
    for (index = 0; index < ADC_BUFFER_SIZE; index ++)
    {
      ADC_ConvertedData_Sum += ADC_Buffer[index];
    }
   
    ADC_ConvertedData = ADC_ConvertedData_Sum / ADC_BUFFER_SIZE;
   
    ADC_ConvertedVoltage = (float)(ADC_ConvertedData * 2980) / 0xFFF + 0.5;
    printf("------------------------------------\n");
    printf("ADC_ConvertedData          = %d\n", ADC_ConvertedData);
    printf("ADC_ConvertedVoltage       = %d\n", ADC_ConvertedVoltage);
  
  Delay(5000000);
  }
}

void ADC_DMA_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  ADC_InitTypeDef ADC_InitStructure;
  DMA_InitTypeDef DMA_InitStructure;
  
  ADC_DeInit(ADC1);
  
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  
  GPIO_DeInit(GPIOC);
  GPIO_StructInit(&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
  DMA_DeInit(DMA1_Channel1);
  DMA_StructInit(&DMA_InitStructure);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;
  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_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
  
  ADC_DMACmd(ADC1, ENABLE);
  
  ADC_StructInit(&ADC_InitStructure);
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_Init(ADC1,&ADC_InitStructure);
  
  ADC_ChannelConfig(ADC1, ADC_Channel_11, ADC_SampleTime_239_5Cycles);
  ADC_GetCalibrationFactor(ADC1);
  
  ADC_Cmd(ADC1, ENABLE);
  
  while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN))
  {
  }
}

最后附上源程序: STM32F0xx-ADC1000_DMA.rar (2.26 MB, 下载次数: 269)
收藏 2 评论22 发布时间:2015-1-8 15:49

举报

22个回答
mmo 回答时间:2015-1-8 15:54:12
学习了,谢谢分享
安雪尽 回答时间:2015-1-8 17:09:09
收藏了,谢谢楼主
dongqingchen196 回答时间:2015-1-8 20:51:01
多谢楼主分享,正要使用DMA控制ADC
STM32LEARN 回答时间:2015-1-8 21:18:29
楼主的程序很清楚啊,多谢!
sasmike 回答时间:2015-1-8 21:59:35
dongqingchen196 发表于 2015-1-8 20:51
多谢楼主分享,正要使用DMA控制ADC

能用上就好,多交流啊
adersonl 回答时间:2015-1-8 22:09:36
楼主也不喜欢CUBE库么。
mengqiqq 回答时间:2015-1-8 22:15:02
非常好!!
楼主能否解释一下DMA配置的部分,刚学,总是整不好。
  DMA_DeInit(DMA1_Channel1);
  DMA_StructInit(&DMA_InitStructure);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
hl1980 回答时间:2015-1-8 22:25:47
学习哈
sasmike 回答时间:2015-1-8 23:31:17
adersonl 发表于 2015-1-8 22:09
楼主也不喜欢CUBE库么。

以前用的标准库用多了,这个还没有仔细研究
123下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版