OpenEdv-开源电子网

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

STM32F407 ADC+DMA传输的问题

[复制链接]

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-10-7
在线时间
21 小时
发表于 2020-12-2 11:29:04 | 显示全部楼层 |阅读模式
1金钱
最近在学习关于DMA外设  但是数据流始终没有被发出去  想了很久都没有想清楚在哪儿的问题
代码

//DMA初始化
u16 ADC_VALUE[4096]={0};

//初始化DMA
void DMA_ADC_INIT()
{
        DMA_InitTypeDef  DMA_InitStructure;
       
        while (DMA_GetCmdStatus(DMA2_Stream0) != DISABLE){}//等待DMA可配置
       
        DMA_InitStructure.DMA_Channel = DMA_Channel_0;//ADC1对应的DMA通道为0;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_BASE + 0x4C;
        //根据查表得到ADC1的存储地址是地址加偏移地址0x4C
        //对于每个ADC其地址位  都为  ADCx_BASE + 0x4c
        //对于ADC2  即是  ADC2_BASE + 0x4C 也可是 ADC1_BASE + 0x0111 + Ox4C;
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC_VALUE;//给外设地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
        //ADC是外设对应的地址是外设到内存
        DMA_InitStructure.DMA_BufferSize = 1;
        //DMA传输数据为一个
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        //因为ADC的存储地址是固定的所以是固定的
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        //地址自加
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        //STM32 是32位单片机  半字即使 16位  字节即使8位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        //STM32 是32位单片机  半字即使 16位  字节即使8位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        // 使用普通模式  单次模式
        //如果是循环模式  那么DMA每次都会重复的甩数据
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
        //中等优先级
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;   
       
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
       
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        //存储器突发单次传输
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
        //外设突发单次传输
  DMA_Init(DMA2_Stream0,&DMA_InitStructure);
        //使用的是ADC1那么对应的是DMA2_数据流1
        DMA_SetCurrDataCounter(DMA2_Stream0,4096);//设置数据传输量为1024
        DMA_Cmd(DMA2_Stream0,ENABLE);//开启DMA
}

//ADC初始化

//初始化ADC                                                                                                                          
void  Adc_Init(void)
{   
  GPIO_InitTypeDef  GPIO_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
        ADC_InitTypeDef       ADC_InitStructure;
       
        DMA_ADC_INIT();//DMA初始化
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟

  //先初始化ADC1通道5 IO口
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  GPIO_Init(GPIOA, &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_Disabled; //DMA失能
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。
  ADC_CommonInit(&ADC_CommonInitStructure);//初始化
       
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式       
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐       
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1
  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
       
       
        ADC_Cmd(ADC1, ENABLE);//ENABLE AD转换器       
        ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_480Cycles);
        //ADC1 通道5 采样时间是480周期 + 转换时间12周期
       
        ADC_SoftwareStartConv(ADC1);
        //软件转换  只需要调用一次ADC_Cmd就可以开启转换
        ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);//原数据变化开启DMA传输
        ADC_DMACmd(ADC1,ENABLE);//使能DMA的ADC传输
}


//main
int main(void)
{
        int i;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);    //初始化延时函数
        uart_init(115200);        //初始化串口波特率为115200
        LED_Init();                                        //初始化LED
        Adc_Init();         //初始化ADC     
        while(1)
        {
                while(1)
                {
                        if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)!=RESET)//等待DMA2_Steam0传输完成
                                {
                                        DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);//清除DMA2_Steam0传输完成标志
                                        break;
                    }
                }
                for(i=0;i<4096;i++)
                {
                        printf(" %d",ADC_VALUE[i]);
                }
                while(1);
        }
}




最佳答案

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

找到问题了 发现自己 DMA 没有时钟使能 上传了自己的ADC+DMA程序 有兴趣的大佬 可以帮我瞅瞅我的DMA+ADC +定时器咩
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-10-7
在线时间
21 小时
 楼主| 发表于 2020-12-2 11:29:05 | 显示全部楼层
本帖最后由 yyjooo 于 2020-12-4 09:39 编辑

找到问题了  发现自己  DMA   没有时钟使能   上传了自己的ADC+DMA程序    有兴趣的大佬   可以帮我瞅瞅我的DMA+ADC +定时器咩

ADC+DMA.rar

3.59 MB, 下载次数: 105

回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2021-1-7
在线时间
31 小时
发表于 2021-7-21 18:47:33 | 显示全部楼层
为什么不能一直传输呢
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2021-1-7
在线时间
31 小时
发表于 2021-7-21 19:10:13 | 显示全部楼层
你看看这样行不

ADC+DMA 定时循环传输.zip

5.27 MB, 下载次数: 194

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 11:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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