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

发一个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, 下载次数: 270)
收藏 2 评论22 发布时间:2015-1-8 15:49

举报

22个回答
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);
nmgbtzyf 回答时间:2019-2-20 04:16:09
ADC_SampleTime_239_5Cycles,这个地方看不明白,不是应该这样吗?239.5Cycles,还有这样设置,怎么弄实现1us的速度
nmgbtzyf 回答时间:2019-2-20 04:15:41
ADC_SampleTime_239_5Cycles,这个地方看不明白,不是应该这样吗?239.5Cycles,还有这样设置,怎么弄实现1us的速度
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

能用上就好,多交流啊
aderson 回答时间:2015-1-8 22:09:36
楼主也不喜欢CUBE库么。
hl1980 回答时间:2015-1-8 22:25:47
学习哈
sasmike 回答时间:2015-1-8 23:31:17
adersonl 发表于 2015-1-8 22:09
楼主也不喜欢CUBE库么。

以前用的标准库用多了,这个还没有仔细研究
sasmike 回答时间:2015-1-9 09:38:09

共同学习
stmike 回答时间:2015-1-9 09:56:02
有点意思,对于mda不太熟悉,谢了!
naruto945 回答时间:2015-1-9 10:07:12
这个采样感觉精度不是太高啊!
nomoreheracles 回答时间:2015-1-9 10:19:41
学习了,希望代码代码更完善一些!
lkl0305 回答时间:2015-1-9 11:25:28
不错,不知精度如何?
12下一页

所属标签

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