OpenEdv-开源电子网

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

利用DMA通道1传输ADC1两路的转换结果,为啥只有第一次的数据呀?

[复制链接]

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-3-11
在线时间
0 小时
发表于 2014-4-16 09:39:41 | 显示全部楼层 |阅读模式
利用ADC1通道7、8,引脚PB0、PB1采集电压,ADC扫描模式,ADC_ConvertedValue[2]是缓冲数组,DMA配置为16位数据宽度,增量模式,寄存器非增量模式,不知道怎么弄的,只有一个数据?
[mw_shl_code=c,true]#include "sys.h" #include "adc.h" #include "delay.h" #include "dma.h" vu16 ADC_ConvertedValue[2] = {0}; float Voltage,Current; //??????ADC?????¨??1 void Adc_Init(void) { RCC->APB2ENR |=1<<3; //????PORTB???±?? GPIOB->CRL &=0XFFFFFF00; //PB0 PB1 anolog???????¨??8 MYDMA_Config(DMA1_Channel1, (u32)&ADC1->DR, (u32)&ADC_ConvertedValue, 2); //????ADC1 DMA???? RCC->APB2ENR |=1<<9; //ADC1?±?????? RCC->APB2RSTR |=1<<9; //ADC1???? RCC->APB2RSTR &=~(1<<9); //?????á?? RCC->CFGR &=~(3<<14); //·????ò×???????SYSCLK/DIV2=12M ADC?±???è????12M, RCC->CFGR |=2<<14; //PCLK2 6·????ó×÷??ADC?±????ADC×??ó?±??????????14M,·??ò??????ADC×??·???????? ADC1->CR1 &=0XF0FFFF; //0x0000??ADC?????¤×÷???? ADC1->CR1 |=1<<8; //?¨?è???? ADC1->CR2 |=1<<1; //????×??????? ADC1->CR2 |=1<<8; //DMA???? ADC1->CR2 &=~(7<<17); //???????¨?±?÷1??CC1???? ADC1->CR2 |=7<<17; //?í??????×???SWSTART ADC1->CR2 |=1<<20; //????????????·?(SWSTART),±???????????????????·? ADC1->CR2 &=~(1<<11); //?????????? ADC1->SQR1 &=~(0X0F<<20); //?¨???????ò?¨??×????ò???????¨??????:2??×??? ADC1->SQR1 |=0X01<<20; //?¨???????ò?¨??×????ò???????¨??????:2??×??? ADC1->SQR3 |=1<<3; ADC1->SQR3 |=7<<5; ADC1->SMPR2 &=~(7<<21); //?è???¨??7?????ù?±?????¨??7???ù?±??1.5???? ADC1->SMPR2 |=5<<21; //?¨??7??55.5????,?á?????ù?±???????á?????·?? ADC1->SMPR2 &=~(7<<24); //?è???¨??8?????ù?±?????¨??8???ù?±??1.5???? ADC1->SMPR2 |=5<<24; //?¨??8??55.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); //??????×??á???????????í???è??????????×?????????×??á???±?????????? ADC1->CR2 |= (u32)0x00500000; //????×??????ò?¨?? } [/mw_shl_code] [mw_shl_code=c,true]下面是配置的DMA,ADC中断和DMA中断都没有用到。。。[/mw_shl_code]
[mw_shl_code=c,true]#include "dma.h" #include "delay.h" //DMA1???÷?¨?????? //???????????????????¨??,???????ù?????????é???????? //???????÷->???è????/8???????í??/?????÷???????? //DMA_CHxMA?¨??CHx //cpar:???è???· //cmar:?????÷???· //cndtr:?????????? void MYDMA_Config(DMA_Channel_TypeDef *DMA_CHx, u32 cpar, u32 cmar, u16 cndtr) //DMA1,?¨??1??ADC1?????????÷?±×???cpar??cmar×÷????±ê { RCC->AHBENR |= 1<<0; //????DMA1?±??,DMA1??AHB×????? delay_ms(50); //????DMA?±?????¨ DMA_CHx->CPAR =(u32)cpar; //????DMA1???ó?????è?????÷?????· DMA_CHx->CMAR =(u32)cmar; //DMA1,?????÷???·????°????¨??±????????· DMA_CHx->CNDTR =cndtr; //DMA1,?????????? DMA_CHx->CCR =0X00000000; //???? DMA_CHx->CCR &=~(1<<4); //0???????÷?? DMA_CHx->CCR |=1<<5; //???????·??×÷ DMA_CHx->CCR &=~(1<<6); //???è???··????????? DMA_CHx->CCR |=1<<7; //?????÷???????? DMA_CHx->CCR |=1<<8; //???è?????í????16?? DMA_CHx->CCR |=1<<10; //?????÷?????í??16?? DMA_CHx->CCR |=2<<12; //?????????? DMA_CHx->CCR &=~(1<<14); //·??????÷???????÷???? DMA_CHx->CCR &=~(1<<0); //??±?DMA???? DMA_CHx->CCR |=1<<0; //????DMA???? } [/mw_shl_code]


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

使用道具 举报

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-3-11
在线时间
0 小时
 楼主| 发表于 2014-4-16 09:40:01 | 显示全部楼层
回复【楼主位】数字鹰:
---------------------------------
为毛注释会乱码。。。
回复 支持 反对

使用道具 举报

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-3-11
在线时间
0 小时
 楼主| 发表于 2014-4-16 09:43:12 | 显示全部楼层



这是仿真的结果、、、
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-4-16 09:49:02 | 显示全部楼层
看不懂寄存器代码 帮顶
回复 支持 反对

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-4-16 10:26:46 | 显示全部楼层
把注释改过来呀,不然谁高兴看啊,直接打开源文件复制,不要用MDK复制
回复 支持 反对

使用道具 举报

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-3-11
在线时间
0 小时
 楼主| 发表于 2014-4-16 10:51:01 | 显示全部楼层

[mw_shl_code=c,true]#include "sys.h" #include "adc.h" #include "delay.h" #include "dma.h" vu16 ADC_ConvertedValue[2] = {0}; float Voltage,Current; //初始化ADC开启通道1 void Adc_Init(void) { RCC->APB2ENR |=1<<3; //使能PORTB口时钟 GPIOB->CRL &=0XFFFFFF00; //PB0 PB1 anolog输入,通道8 MYDMA_Config(DMA1_Channel1, (u32)&ADC1->DR, (u32)&ADC_ConvertedValue, 2); //配置ADC1 DMA模式 RCC->APB2ENR |=1<<9; //ADC1时钟使能 RCC->APB2RSTR |=1<<9; //ADC1复位 RCC->APB2RSTR &=~(1<<9); //复位结束 RCC->CFGR &=~(3<<14); //分频因子清零,SYSCLK/DIV2=12M ADC时钟设置为12M, RCC->CFGR |=2<<14; //PCLK2 6分频后作为ADC时钟,ADC最大时钟不能超过14M,否则将导致ADC准确度下降。 ADC1->CR1 &=0XF0FFFF; //0x0000、ADC独立工作模式 ADC1->CR1 |=1<<8; //扫描模式 ADC1->CR2 |=1<<1; //连续转换模式 ADC1->CR2 |=1<<8; //DMA模式 ADC1->CR2 &=~(7<<17); //复位,定时器1的CC1事件 ADC1->CR2 |=7<<17; //软件控制转换SWSTART ADC1->CR2 |=1<<20; //使用用外部触发(SWSTART),必须使用一个事件来触发 ADC1->CR2 &=~(1<<11); //数据右对齐 ADC1->SQR1 &=~(0X0F<<20); //定义在规则通道转换序列中的通道数目:2个转换 ADC1->SQR1 |=0X01<<20; //定义在规则通道转换序列中的通道数目:2个转换 ADC1->SQR3 |=7<<0; ADC1->SQR3 |=1<<8; ADC1->SMPR2 &=~(7<<21); //设置通道7的采样时间,通道7采样时间1.5周期 ADC1->SMPR2 |=5<<21; //通道7,55.5周期,提高采样时间可以提高精确度 ADC1->SMPR2 &=~(7<<24); //设置通道8的采样时间,通道8采样时间1.5周期 ADC1->SMPR2 |=5<<24; //通道8,55.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); //等待校准结束,该位由软件设置以开始校准,并在校准结束时由硬件清除 ADC1->CR2 |= (u32)0x00500000; //开始转换规则通道 } [/mw_shl_code]
[mw_shl_code=c,true]这是DMA的 #include "dma.h" #include "delay.h" //DMA1的各通道配置 //这里的传输形式是固定的,这点要根据不同的情况来修改 //从存储器->外设模式/8位数据宽度/存储器增量模式 //DMA_CHxMA通道CHx //cpar:外设地址 //cmar:存储器地址 //cndtr:数据传输量 void MYDMA_Config(DMA_Channel_TypeDef *DMA_CHx, u32 cpar, u32 cmar, u16 cndtr) //DMA1,通道1,ADC1数据寄存器当做源cpar,cmar作为目标 { RCC->AHBENR |= 1<<0; //开启DMA1时钟,DMA1在AHB总线上 delay_ms(50); //等待DMA时钟稳定 DMA_CHx->CPAR =(u32)cpar; //使用DMA1请求的外设寄存器的地址 DMA_CHx->CMAR =(u32)cmar; //DMA1,存储器地址,一般是定义变量的地址 DMA_CHx->CNDTR =cndtr; //DMA1,传输数据量 DMA_CHx->CCR =0X00000000; //复位 DMA_CHx->CCR &=~(1<<4); //0从寄存器读 DMA_CHx->CCR |=1<<5; //执行循环操作 DMA_CHx->CCR &=~(1<<6); //外设地址非增量模式 DMA_CHx->CCR |=1<<7; //存储器增量模式 DMA_CHx->CCR |=1<<8; //外设数据宽度为16位 DMA_CHx->CCR |=1<<10; //存储器数据宽度16位 DMA_CHx->CCR |=2<<12; //高等优先级 DMA_CHx->CCR &=~(1<<14); //非存储器到存储器模式 DMA_CHx->CCR &=~(1<<0); //关闭DMA传输 DMA_CHx->CCR |=1<<0; //开启DMA传输 } [/mw_shl_code]


回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-16 15:13:34 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-3-11
在线时间
0 小时
 楼主| 发表于 2014-4-21 09:00:09 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
恩 搞定了~   我太粗心通道搞错了  这也可能是操作寄存器的缺点
回复 支持 反对

使用道具 举报

6

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
588
金钱
588
注册时间
2014-10-10
在线时间
125 小时
发表于 2015-4-22 20:06:24 | 显示全部楼层
回复【8楼】数字鹰:
---------------------------------
楼主我也遇到了同样的问题你是怎么解决的?
怀念什么?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 11:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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