历史上的今天
返回首页

历史上的今天

今天是:2025年04月27日(星期日)

正在发生

2019年04月27日 | 谈谈STM32F051的 ADC DMA用法

2019-04-27 来源:eefocus

首先谈谈引脚  STM32F051R8T6 多达16个  12bit外部AD通道。同时还有片内温度。电压基准,VBAT三个通道。对一般的AD使用来说是完全够用了。16个AD通道分别分布在


AD0  -AD7  对应引脚 是PA0-PA7   AD8-AD9对应引脚PB0-PB1      AD10-AD11对应引脚是PC0-PC5。  在这里我们就以PA0作为一个输入在写个例子。


//#include

#include

#include

#include

#include

#include "systick.h"

#include "LCD32.h"

#include "font.h"



#define ADC1_DR_Address                0x40012440

volatile uint16_t RegularConvData_Tab;  //ÓÃÓÚ´¢´æ´ÓADC¶Áµ½µÄÖµ

void LedInit()

{


GPIO_InitTypeDef gpiostudy;


RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB ,ENABLE);//ʹÄÜAHBÍâÉèGPIOBʱÖÓ

gpiostudy.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6

|GPIO_Pin_7;

gpiostudy.GPIO_Mode=GPIO_Mode_OUT;

gpiostudy.GPIO_Speed=GPIO_Speed_50MHz;

gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL;

gpiostudy.GPIO_OType = GPIO_OType_PP;

GPIO_Init(GPIOB,&gpiostudy);  



RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC ,ENABLE);//ʹÄÜAHBÍâÉèGPIOCʱÖÓ

gpiostudy.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6

|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;

gpiostudy.GPIO_Mode=GPIO_Mode_OUT;

gpiostudy.GPIO_Speed=GPIO_Speed_50MHz;

gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL;

gpiostudy.GPIO_OType = GPIO_OType_PP;   

GPIO_Init(GPIOC,&gpiostudy);  


RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,ENABLE);//ʹÄÜAHBÍâÉèGPIOAʱÖÓ

gpiostudy.GPIO_Pin=GPIO_Pin_11;

gpiostudy.GPIO_Mode=GPIO_Mode_OUT;

gpiostudy.GPIO_Speed=GPIO_Speed_50MHz;

gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL;

gpiostudy.GPIO_OType = GPIO_OType_PP;

GPIO_Init(GPIOA,&gpiostudy); 

}



/********************************************************************************

º¯ÊýÃû£ºADC_DMA_Config

¹¦ÄÜ£ºADC DMA³õʼ»¯£¬ADCͨµÀÑ¡Ôñ

*******************************************************************************/

void   ADC_DMA_Config()

{

ADC_InitTypeDef     ADC_InitStruct;

  DMA_InitTypeDef     DMA_InitStruct;

GPIO_InitTypeDef    GPIO_InitStruct;


ADC_DeInit(ADC1);

/* Enable  GPIOA clock */

//  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  /* ADC1 Periph clock enable */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  /* DMA1 clock enable */

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);

/* Configure PA.0  as analog input */

 

/*GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;

  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;

GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;

  GPIO_Init(GPIOA, &GPIO_InitStruct); */ // PA1,ÊäÈëʱ²»ÓÃÉèÖÃËÙÂÊ



 /* DMA1 Channel1 Config */

  DMA_DeInit(DMA1_Channel1);

  DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;  //ÉèÖÃÍâÉè»ùµØÖ·

  DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)&RegularConvData_Tab;

  DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;

  DMA_InitStruct.DMA_BufferSize =4;

  DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStruct.DMA_Priority = DMA_Priority_High;

  DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel1, &DMA_InitStruct);


//   /* ADC DMA request in circular mode */

  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

 /* DMA1 Channel1 enable */

  DMA_Cmd(DMA1_Channel1, ENABLE);


//   /* ADC DMA request in circular mode */

  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);


/* Initialize ADC structure */

 


ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;

  ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; 

  ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

  ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;

  ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Backward; 

ADC_StructInit(&ADC_InitStruct);

  ADC_Init(ADC1, &ADC_InitStruct); 


//   /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */ 

//   ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);  

//   ADC_TempSensorCmd(ENABLE);

  

  /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */ 

  ADC_ChannelConfig(ADC1, ADC_Channel_1  , ADC_SampleTime_55_5Cycles); 

  // ADC_VrefintCmd(ENABLE);

  

  /* ADC Calibration */

  ADC_GetCalibrationFactor(ADC1);

   ADC_DMACmd(ADC1, ENABLE);

 

 

  /* Enable ADC1 */

  ADC_Cmd(ADC1, ENABLE);     

  

  /* Wait the ADCEN falg */

  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); 

  

  /* ADC1 regular Software Start Conv */ 

  ADC_StartOfConversion(ADC1);  //¼ÓÉÏÕâ¸öº¯Êý£¬LCDÏÔʾ³öÎÊÌâ¡£²»¼ÓÕâ¸öº¯Êý£¬LCDÏÔʾÕý³£

}



/**

  * @brief  ADC1 channel with DMA configuration

  * @param  None

  * @retval None

  */

void ADC1_CH_DMA_Config(void)

{

  ADC_InitTypeDef     ADC_InitStructure;

  DMA_InitTypeDef     DMA_InitStructure;

  

  /* ADC1 DeInit */  

  ADC_DeInit(ADC1);

  

  /* ADC1 Periph clock enable */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  

  /* DMA1 clock enable */

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);

  

  /* DMA1 Channel1 Config */

  DMA_DeInit(DMA1_Channel1);

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&RegularConvData_Tab;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  DMA_InitStructure.DMA_BufferSize = 2;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

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

  

  /* DMA1 Channel1 enable */

  DMA_Cmd(DMA1_Channel1, ENABLE);

  

  /* ADC DMA request in circular mode */

  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

  

  /* Enable ADC_DMA */

  ADC_DMACmd(ADC1, ENABLE);  

  

  /* Initialize ADC structure */

  ADC_StructInit(&ADC_InitStructure);

  

  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 

  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;

  ADC_Init(ADC1, &ADC_InitStructure); 

 

  /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */ 

 // ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);  

 // ADC_TempSensorCmd(ENABLE);

  

  /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */ 

  ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_55_5Cycles); 

 // ADC_VrefintCmd(ENABLE);

  

  /* ADC Calibration */

  ADC_GetCalibrationFactor(ADC1);

  

  /* Enable ADC1 */

  ADC_Cmd(ADC1, ENABLE);     

  

  /* Wait the ADCEN falg */

  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); 

  

  /* ADC1 regular Software Start Conv */ 

  ADC_StartOfConversion(ADC1);

}









int main()

{

 

SystemInit();


//GPIO_DeInit(GPIOB);

// GPIO_DeInit(GPIOC);

LedInit();

// Uart_NVICInit();

// SysTick_Config(SysTick_CLKSource_HCLK);   //sistickʱÖÓԴΪAHB ʱÖÓ

GPIO_ResetBits(GPIOA,GPIO_Pin_11);//µÆÁÁ

Systick_NVICInit();


// Delay(2000);


BACK_COLOR=BLACK;

 POINT_COLOR=WHITE; 


Lcd_Init();


// 

/* GPIO_SetBits(GPIOA,GPIO_Pin_11);//µÆÃðÁ

Delay(2000);

LCD_Clear(RED);  

GPIO_ResetBits(GPIOA,GPIO_Pin_11);//µÆÁÁ

Delay(3000);

LCD_Clear(GREEN);

Delay(3000);

LCD_WR_DATA8(0x0f,0x0f);

*/

// 

//

// LCD_DrawPoint_big(100,100);

// LCD_DrawPoint(100,100);

//LCD_Fill(0,0,120,120,BLUE);

//LCD_DrawLine(0,0,150,150);

// LCD_DrawRectangle(100,100,200,200);

//Draw_Circle(100,100,100);

//LCD_ShowNum(100,100,102,3);//ʧ°Ü

// LCD_ShowChar(10,10,'a',0);//ʧ°Ü

LCD_Clear(BLACK);

LCD_ShowString(55,30,"ADC-DMA TEST");

ADC1_CH_DMA_Config();


// showhanzi(100,100,0);

// showhanzi(135,100,1);

//showhanzi(170,100,2);

//showimage();

while(1)

// GPIO_ResetBits(GPIOA,GPIO_Pin_11);

// Delay(1000);  //1s

// GPIO_SetBits(GPIOA,GPIO_Pin_11);

// Delay(2000);  //1s¡

 

// ADC_ConvertedValueLocal= RegularConvData_Tab;

// Delay(1000);  //1s

/* Test DMA1 TC flag */

    while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET ); 

    

    /* Clear DMA TC flag */

    DMA_ClearFlag(DMA1_FLAG_TC1);

LCD_ShowString(20,60,"adc  value:");

LCD_ShowNum(120,60,RegularConvData_Tab,4);

// ADC1->CR&=(~(1<<2))|(~(1<<0));

// ADC1->CR|=(1<<2);

 

}

}


DMA方式,最主要的就是配置。配置完了,就什么就不用管了。


推荐阅读

史海拾趣

C.K Magma公司的发展小趣事

C.K Magma公司最初由一群热衷于电子技术的工程师创立。他们通过深入研究,成功开发出一种新型半导体材料,这种材料在性能和稳定性上均优于当时市场上的同类产品。这一技术突破为公司赢得了业界的关注,并吸引了第一批投资。随着资金的注入,C.K Magma公司得以扩大研发团队,进一步巩固了其在半导体领域的技术领先地位。

Catalyst公司的发展小趣事

Catalyst公司在电子行业的初创期,以其独特的创新理念和前瞻性的技术布局,奠定了坚实的基础。公司创始团队由一群对电子行业充满热情的工程师和科学家组成,他们共同致力于研发高效、稳定的电子产品。通过不断的技术研发和市场调研,Catalyst成功推出了一系列具有竞争力的产品,逐步在市场中崭露头角。

长运通(CYT)公司的发展小趣事

在市场竞争日益激烈的背景下,长运通积极拓展市场,加强品牌建设。公司不仅在国内市场取得了良好的销售业绩,还积极开拓国际市场,与多家国际知名企业建立了合作关系。同时,长运通也注重品牌形象的塑造和传播,通过参加各种展会、论坛等活动,提升公司的知名度和影响力。这些努力使得长运通在电子行业中树立了良好的品牌形象。

Endicott Research Group Inc (ERG)公司的发展小趣事

随着医疗、工业和军事市场对电源设备的需求不断增长,ERG凭借其深厚的技术积累和创新能力,逐渐在这些领域获得了广泛的认可。他们的产品以其高性能和稳定性赢得了众多客户的信赖。特别是在医疗设备领域,ERG的电源产品为诊断和治疗设备提供了可靠的动力支持,为医疗行业的发展做出了重要贡献。

Fabrimex AG公司的发展小趣事

1995年,Fabrimex GmbH成立,作为电子组装和电源生产的生产公司。这一举措标志着公司进一步向国际化发展迈进。通过设立生产公司,Fabrimex AG能够更好地控制产品质量和生产成本,提高市场竞争力。同时,公司还加强了在全球范围内的销售活动,进一步扩大了市场份额。

安美通(APPCON)公司的发展小趣事

在创业初期,安美通面临着激烈的市场竞争和技术瓶颈。然而,公司的创始团队凭借对无线通信技术的深刻理解和丰富经验,成功研发出了一系列低功耗无线远传产品,为水气电及工控行业提供了创新的解决方案。这些产品迅速获得了市场的认可,为公司的初步发展奠定了坚实的基础。

问答坊 | AI 解惑

集成电路基础知识之:电容知识大全

第1讲:电容的特性(隔直通交)    电容器是一种能储存电荷的容器.它是由两片靠得较近的金属片,中间再隔以绝缘物质而组成的.按绝缘材料不同,可制成各种各样的电容器.如:云母.瓷介.纸介,电解电容器等.在构造上,又分 ...…

查看全部问答>

电解电容的筛选问题 一剑封喉

电解电容的筛选问题  一剑封喉电解电容是电子镇流器和开关电源产品的一个重要元件,它的质量问题直接影响到整机的质量,大家在各自的公司里是怎样筛选和检验的,希望在此交流一下,可以共同提高各自的技术水平,也可提高整个行业的产品质量,增 ...…

查看全部问答>

安顿双绞线传输器的传输效果对比与示意

在实际工程中,选用何种传输方式需要结合工程的具体情况和工程预算来综合考虑。对于传输距离超过2Km的监控网络,应该考虑选用光纤和光端机。如果传输距离达到数公里或者几十公里,就只有使用光纤了。另外,在一些干扰很强的场合,比如受到工业干扰 ...…

查看全部问答>

CE printf不能用咋办啊??CE 提示建议使用StringCchVPrintfA函数??

最近移植个库,库以前是在PC上编译的,都是用多字节的printf,在CE下报错, 情况如下: error C2065: \'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA\' : undeclared identifier 然后我就按它的提示使用StringCchPrintfA; 定义了 ...…

查看全部问答>

高分征解:初学者学FPGA应该遵循什么样的路线,注意些什么?

在这方面是个文盲,买了块Altera Cyclone II 的开发板,想由简单的开始学习一些模块,但我对开发SOC很感兴趣,未来也有这种需求。需要的模块至少有:简单的CPU,中断控制器(2个中断就行了),定时器/计数器,PWM输出,简单的URAT,简 ...…

查看全部问答>

按电源按键启动不了咋整?

按开机电源启动不了,要再按重启或者再按几次电源键才能启动 机子去年十一配的,原来也有类似问题,后来换了一个电源就没这种情况了,现在又出现这种情况,难道又是电源问题?哪位达人帮解决一下~…

查看全部问答>

cadence问题求助------5!

这个问题非常基础但是有几个地方不是很明白: 在画原理图时,大部分需要自己画芯片,一些主要的芯片,库里面总是没有 在画芯片时,关于芯片引脚习惯上都是定义成什么? 我看芯片引脚有:3 state、Bidirectional 、 Input 、Open Collector &nbs ...…

查看全部问答>

FPGA中遇到的一个奇怪的问题!

在FPGA中遇到的一个奇怪的问题!我在Stratix II GX 中要实现这样一个功能:用20M时钟采集120路数据,然后将这些数据组成每字节10bit,每11字节一帧的数据,其中包括一个帧头。这帧数据每字节速率是260M(因为加了10位的帧头),通过一个GXB将这帧数据 ...…

查看全部问答>

有关串口调试助手的困惑

如果我给串口调试助手发送一个字符串“zhangkai”,如果勾上16进制显示,是不是就是串口调试助手把字符串转换为7A 68 61 6E 67 6B 61 69这个了?   在串口调试助手给单片机发数据时,如果选上16进制发送和不选16进制发送有啥区别?发送区填 ...…

查看全部问答>

MSP-EXP430FR5739实验板团购

这次机会真是难得呀,一个字实惠。…

查看全部问答>