OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4276|回复: 6

如果要做单路的adc_dma采样,采样数据存在一个数组中,存满触发一个中断来通知处理,初始化参数怎么设,我设错了什么

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-2-27
在线时间
1 小时
发表于 2019-2-27 15:37:11 | 显示全部楼层 |阅读模式
4金钱
本帖最后由 AoXintech 于 2019-2-27 17:09 编辑

初始化函数如下:
#include "adc.h"
#include "usart.h"
#include "delay.h"                 

vu16 ADC1ConvertedValue[256];
float adc_Value[NPT*2];
u16 adc_Count=0;
_Bool adc_sample = DISABLE;


//ADC_DMA初始化配置
void Adc_DMA_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
        ADC_InitTypeDef       ADC_InitStructure;
        DMA_InitTypeDef        DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_DMA2, ENABLE);//使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
        
        DMA_DeInit(DMA2_Stream0);
        DMA_InitStructure.DMA_Channel =DMA_Channel_0;
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)&ADC1ConvertedValue;//内存存储基地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 256;
  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搬移数据尺寸
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);
        
        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PC3 通道13
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化  

        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1复位
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //复位结束
        
        ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; //DMA失能(默认模式)
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz
  ADC_CommonInit(&ADC_CommonInitStructure);//初始化
        
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式        
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐        
  ADC_InitStructure.ADC_NbrOfConversion = 13;//1个转换在规则序列中 也就是只转换规则序列1
  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
        ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_3Cycles);
        
//         /* Enable DMA request after last transfer (Single-ADC mode) */
  ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

  ADC_DMACmd(ADC1, ENABLE);  
        
        ADC_Cmd(ADC1, ENABLE);//开启AD转换器
}

void DMA_Configuration(void)
{
  DMA_InitTypeDef DMA_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

        DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
  DMA_InitStructure.DMA_PeripheralBaseAddr =((u32)0x40012400+0x4c);
  DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)&ADC1ConvertedValue;//内存存储基地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 256;//DMA_BufferSize 就是要传输的次数
  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搬移数据尺寸
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);
}

void DMA2_Stream0_IRQHandler(void)
{                        
        if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0))
  {
                adc_sample = ENABLE;
                //USART_SendString(USART2,"mark");
  }
        DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);
}

最佳答案

查看完整内容[请看2#楼]

这个可以论坛搜搜,前人分享了蛮多的,比如: http://www.openedv.com/forum.php?mod=viewthread&tid=284146&extra= 可以参考代码里边的配置
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-2-27 15:37:12 | 显示全部楼层
这个可以论坛搜搜,前人分享了蛮多的,比如:
http://www.openedv.com/forum.php ... d=284146&extra=
可以参考代码里边的配置
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-2-27
在线时间
1 小时
 楼主| 发表于 2019-2-28 09:12:52 | 显示全部楼层
可以针对我的代码帮忙纠一下错吗?我已经弄了好几天了,其他人的分享也看过了,但就是实现不了功能,总感觉是我那个参数设错了,可是有人分享的例程和我的参数设置是一样的,这我就弄不明白了=_=
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-8-16
在线时间
20 小时
发表于 2019-3-5 18:12:23 | 显示全部楼层
帮顶,我也需要把ADC采集的数据存在数组,经过DMA传出,也遇到问题,不过我用的是DMA1
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-8-16
在线时间
20 小时
发表于 2019-3-5 18:13:30 | 显示全部楼层
你如果要传ADC1的数据,应该用DMA1的通道1吧
回复

使用道具 举报

1

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2018-11-13
在线时间
26 小时
发表于 2019-3-21 16:42:41 | 显示全部楼层
楼主:是不是这写错了呢  13???
ADC_InitStructure.ADC_NbrOfConversion = 13;//1个转换在规则序列中 也就是只转换规则序列1     
回复

使用道具 举报

1

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2018-11-13
在线时间
26 小时
发表于 2019-3-21 17:00:10 | 显示全部楼层
还有一个疑问:

ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式        
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换

这样的配置,你每一次转换 都得要开启转换,你这dma有何意义呢?有没有想过开启连续转换呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 13:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表