OpenEdv-开源电子网

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

重金求助!!!两路ADC采集,DMA传输,数据显示是0是什么情况

[复制链接]

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
发表于 2016-4-7 23:58:44 | 显示全部楼层 |阅读模式
20金钱
无论是LCD显示还是串口接收到的都是0和0.。。。。求大神帮忙看一下



u16 GetBuff[2];//接收数据         

int main(void)
{       

        Stm32_Clock_Init(9);        //系统时钟设置
        uart_init(72,115200);        //串口初始化为115200
        delay_init(72);                            //延时初始化
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                    //初始化LCD
        Adc_Init();                                                
        MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)GetBuff,16);//DMA1通道4,外设为串口1,存储器为SendBuff,长度SEND_BUF_SIZE.
        POINT_COLOR=RED;//设置字体为红色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(30,70,200,16,16,"DMA TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/15");       

         
        POINT_COLOR=BLUE;//设置字体为蓝色         

        while(1)
        {
                MYDMA_Enable(DMA1_Channel1);
                if(DMA1->ISR&(1<<1))//等待通道1传输完成
                {
                        DMA1->IFCR|=1<<1;//清除通道1传输完成标志
                        break;
                }
            LCD_ShowxNum(30,130,GetBuff[0],4,16,0);
                LCD_ShowxNum(30,150,GetBuff[1],4,16,0);
                printf("GetBuff[0]=%d,GetBuff[1]=%d\n",GetBuff[0],GetBuff[1]);
                delay_ms(100);
        }

}

void  Adc_Init(void)
{   
        //先初始化IO口
        RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
        GPIOA->CRL&=0XFFF0FF0F;//PA1 anolog输入
        RCC->APB2ENR|=1<<9;    //ADC1时钟使能          
        RCC->APB2RSTR|=1<<9;   //ADC1复位
        RCC->APB2RSTR&=~(1<<9);//复位结束            
        RCC->CFGR&=~(3<<14);   //分频因子清零       
        //SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
        //否则将导致ADC准确度下降!
        RCC->CFGR|=2<<14;               
        ADC1->CR1&=0XF0FFFF;   //工作模式清零
        ADC1->CR1|=0<<16;      //独立工作模式  
        ADC1->CR1|=(1<<8);    //扫描模式          
        ADC1->CR2|=1<<1;    //连续转换转换模式
        ADC1->CR2&=~(7<<17);          
        ADC1->CR2|=7<<17;           //软件控制转换  
        ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!!        必须使用一个事件来触发
        ADC1->CR2&=~(1<<11);   //右对齐       
        ADC1->CR2|=1<<8;           //开启DMA请求
       

        ADC1->SQR1&=~(0XF<<20);
        ADC1->SQR1|=1<<20;     //2个转换在规则序列中 也就是只转换规则序列1和4
        ADC1->SQR3&=0XFFFFFC00;//规则序列1 通道1
        ADC1->SQR3|=1<0;
        ADC1->SQR3|=1<7;       
        ADC1->CR2|=1<<22;       //启动规则转换通道
       
        //设置通道1的采样时间
        ADC1->SMPR2&=~(3*1);   //通道1采样时间清空          
        ADC1->SMPR2|=7<<(3*1); //通道1  239.5周期,提高采样时间可以提高精确度       
               
        ADC1->SMPR2&=~(7<<3*4);   //通道2采样时间清空          
        ADC1->SMPR2|=7<<(3*4); //通道2  239.5周期,提高采样时间可以提高精确度        

        ADC1->CR2|=1<<0;           //开启AD转换器         
        ADC1->CR2|=1<<3;       //使能复位校准  
        while(ADC1->CR2&1<<3); //等待校准结束                          
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。                  
        ADC1->CR2|=1<<2;        //开启AD校准          
        while(ADC1->CR2&1<<2);  //等待校准结束
        //该位由软件设置以开始校准,并在校准结束时由硬件清除
}       



u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度                     
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHxMA通道CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量  
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        RCC->AHBENR|=1<<0;                        //开启DMA1时钟
        delay_ms(5);                                //等待DMA时钟稳定
        DMA_CHx->CPAR=cpar;                  //DMA1 外设地址
        DMA_CHx->CMAR=(u32)cmar;         //DMA1,存储器地址
        DMA1_MEM_LEN=cndtr;              //保存DMA传输数据量
        DMA_CHx->CNDTR=cndtr;            //DMA1,传输数据量
        DMA_CHx->CCR=0X00000000;        //复位
        DMA_CHx->CCR|=0<<4;                  //从外设读
        DMA_CHx->CCR|=1<<5;                  //循环模式
        DMA_CHx->CCR|=1<<6;                 //外设地址增量模式
        DMA_CHx->CCR|=0<<7;                  //存储器非增量模式
        DMA_CHx->CCR|=1<<8;         //外设数据宽度为16位
        DMA_CHx->CCR|=0<<9;
        DMA_CHx->CCR|=1<<10;                 //存储器数据宽度16位
        DMA_CHx->CCR|=0<<11;
        DMA_CHx->CCR|=1<<12;                 //中等优先级
        DMA_CHx->CCR|=0<<14;                 //非存储器到存储器模式                         
}
//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
        DMA_CHx->CCR&=~(1<<0);       //关闭DMA传输
        DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量
        DMA_CHx->CCR|=1<<0;          //开启DMA传输
}          




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-8 07:54:28 | 显示全部楼层
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-8 09:24:38 | 显示全部楼层
ding   
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-8 09:53:44 | 显示全部楼层
ding
  
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1606
金钱
1606
注册时间
2015-6-10
在线时间
223 小时
发表于 2016-4-8 10:17:39 | 显示全部楼层
我不懂寄存器操作

不过我好像没看到你引脚初始化
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-8 10:28:13 | 显示全部楼层
止天 发表于 2016-4-8 10:17
我不懂寄存器操作

不过我好像没看到你引脚初始化

RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
GPIOA->CRL&=0XFFF0FF0F;//PA1 PA4 anolog输入


这个就是
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-8 11:05:01 | 显示全部楼层
......
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-8 11:11:24 | 显示全部楼层
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-8 11:12:02 | 显示全部楼层
@xuande  大神在不在
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11568
金钱
11568
注册时间
2014-4-1
在线时间
1320 小时
发表于 2016-4-8 11:18:10 | 显示全部楼层

1、ADC采集
2、DMA搬运
3、LCD操作。
这是三个物理过程。

一步步走吧。
大婶也要这样的。


回复

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2016-4-8 11:31:31 | 显示全部楼层
这个跟ADC 和 DMA的配置顺序好像是有点关系的哦
应该是要配置完DMA之后再去配置ADC我这有个3 channel的ADC采样,之前测试好像没有什么问题,你可以试试看

DMA ADC.zip

669.95 KB, 下载次数: 1323

天道酬勤
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-8 12:14:45 | 显示全部楼层
xly0907 发表于 2016-4-8 11:31
这个跟ADC 和 DMA的配置顺序好像是有点关系的哦
应该是要配置完DMA之后再去配置ADC我这有个3 channel的ADC ...

请问一定要用到中断吗?
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-8 12:48:11 | 显示全部楼层
xly0907 发表于 2016-4-8 11:31
这个跟ADC 和 DMA的配置顺序好像是有点关系的哦
应该是要配置完DMA之后再去配置ADC我这有个3 channel的ADC ...

弄了一中午。。。还是没用DMA传输成功,但是我改了一下代码弄出个不用DMA就是显示两路ADC的    下午继续弄DMA得
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-9 22:01:03 | 显示全部楼层
多上论坛搜索,找找。很多朋友发过ADC+DMA的代码啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2013-5-30
在线时间
3 小时
发表于 2016-6-3 16:50:30 | 显示全部楼层
学习了
做自己喜欢做的的事,爱自己所爱的人!
回复

使用道具 举报

2

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2016-4-22
在线时间
54 小时
发表于 2016-6-3 16:55:55 | 显示全部楼层
第一眼看成了重金求子
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-6-4 09:14:26 | 显示全部楼层
崔旭 发表于 2016-6-3 16:55
第一眼看成了重金求子

干吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-6-12 00:07:44 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 07:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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