您的位置:首页 > 其它

stm32下f4的adc_dma采集

2016-11-03 13:56 761 查看
网上有很多关于stm32f103的资料,甚至在网上买各种模块商家给你提供的资料都是f103和51的,但是f4的资料相比之下就 比较可怜,当初我写这个程序也是废了不少时间翻了好多资料才写成的,特此拿出来和大家分享一下。

首先是 找到adc的地址,#define ADC1_DR_ADDRESS    ((uint32_t)0x4001204C)

由于用的是库函数版本,所以需要引用dma

extern __IO uint16_t ADC1ConvertedValue[6];

void  Adc_Init(void)

{    

    ADC_InitTypeDef       ADC_InitStructure;

    ADC_CommonInitTypeDef ADC_CommonInitStructure;

    DMA_InitTypeDef       DMA_InitStructure;

    GPIO_InitTypeDef      GPIO_InitStructure;

    /* 使能 ADC1, DMA2 和 GPIO 时钟 ****************************************/

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOA, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    /* DMA2 Stream0 channel0 配置 **************************************/

    DMA_InitStructure.DMA_Channel = DMA_Channel_0;       //数据流2,通道0

    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;  //外设地址

    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC1ConvertedValue;   //内存地址

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;  //外设到内存

    DMA_InitStructure.DMA_BufferSize = 6;    //传输4位

    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_FIFOMode = DMA_FIFOMode_Disable;         //不用fifo

    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;  //单次突发模式
/*DMA都是为了成批传输数据的,不论单次DMA 和突发DMA。不同的是每次传输一个单元数据(比如使用32bit数据位宽,每单元为32bit;比如使用8bit数据位宽,每单元为8bit)所用的时钟数。突发DMA是每个时钟都传输一个单元数据的连续传输;而单次DMA则不是,需要几个时钟才传输一个数据单元。*/        

    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//单次突发模式

    DMA_Init(DMA2_Stream0, &DMA_InitStructure);

    DMA_Cmd(DMA2_Stream0, ENABLE);

    /* 配置ADC1通道3、5引脚为模拟输入模式******************************/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

  

    /* ADC公共部分初始化**********************************************************/

    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;  //独立模式

    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;  //分频

    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;   //不配置成直接内存访问
/*先存在adc的寄存器里,在传输出去,所以不直接访问内存*/

    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;  //两个采样间断之间的延迟

    ADC_CommonInit(&ADC_CommonInitStructure);

    /* ADC1 初始化 ****************************************************************/

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;  //12位模式

    ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //连续扫描模式,多通道必开

    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //开启转换模式

    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//没有外部触发,用软件触发

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //右对齐

    ADC_InitStructure.ADC_NbrOfConversion = 6;// yuan 2,四个通道

    ADC_Init(ADC1, &ADC_InitStructure);

    /* ADC1 规则 channel3、5 配置 *************************************/

    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_84Cycles);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 2, ADC_SampleTime_84Cycles);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SampleTime_84Cycles);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 4, ADC_SampleTime_84Cycles);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 5, ADC_SampleTime_84Cycles);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 6, ADC_SampleTime_84Cycles);

    

    /* 使能DMA请求(单ADC模式) */

    ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

 

    /* 使能 ADC1 DMA */

    ADC_DMACmd(ADC1, ENABLE);

    /* 使能 ADC1 */

    ADC_Cmd(ADC1, ENABLE);

    

    /* 软件启动ADC转换 */ 
ADC_SoftwareStartConv(ADC1);

}

我开了6个ad如上面代码所示,选择软件开启,调用函数的时候变量里面就有值了。   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: